相関図おさらい
「心臓外科医の術式」、いろんなキャラクターが登場しますが、
今回はたろーちゃんの同期のAさんが再登場します
Aさんとお昼ご飯
システムの「心臓」こと、Oracle Databaseに日々携わるたろーちゃん。
午前の業務を終え、お昼休みの時間になりました。
今日のお昼は何を食べようかと悩んでるところに、アプリケーション開発者のAさんが訪ねてきました。
Aさん「やあ、たろーちゃん。」
たろー「おつかれ、Aさん。」
Aさん「今日は昼何食べるの?」
たろー「んー、まだ決めてない。何にしようかな?」
Aさん「この前、おいしいラーメン屋を見つけたんだ。今から行こうと思うんだけど、たろーちゃんも一緒に行かないか?」
たろー「おおーラーメンか。いいねぇ、俺ラーメン好きだから。」
Aさん「じゃあ行こうよ。」
たろーちゃんは、Aさんと一緒に職場近くのラーメン屋に行くことにしました。
たろー「凄い行列だなぁ。席に座るまで20分も待っちゃったぞ。」
Aさん「人気だからねぇ、ここの店。替え玉が無料なんだぜ?」
へぇー、それは気前がいいな。
たろーちゃんとAさんは無料の替え玉も頼んで、お腹一杯。
店を出ようとレジに並びました。
その時Aさんが・・・。
Aさん「あー、いいよたろーちゃん。今日は俺が奢るから。」
たろー「え?なんで?」
Aさん「まぁまぁ、いいじゃないか。たまには奢らせてくれよ。」
いつもケチなAさんがラーメンを奢ってくれるなんて、何か嫌な予感が・・・。
そんなことを考えながら、たろーちゃんは、Aさんと共に職場に戻ることにしました。
Aさん「・・・ところで、たろーちゃん。次の休みの日、暇か?」
たろー「ん?暇といえば暇だけど・・・。」
Aさん「俺、PL/SQLを本格的に勉強しようと思ってさ。家のパソコンに Oracle VM VirtualBox をインストールして、Oracle Linux をインストールして、更にその上で Oracle Database を構築してみたんだよ。」
たろー「へぇー、勉強熱心だな。」
Aさん「そりゃそうさ。『貧乏でも努力した奴が勝ってこそ、ドラマ』じゃねーのか?
( *˙ω˙*)و グッ!」
たろー「気合入ってるなぁ。」
Aさん「でも、インターネット上の情報をもとに本当に『構築』しただけでさ。そのままの環境でいいのか、よく分からないんだよねぇ・・・。」
たろー「ん?PL/SQLの勉強のために構築したんだろ?じゃあ動けばいいんだから、仕事で使っているような細かい設定なんかしなくていいんじゃないか?」
Aさん「いや!でもさ!ほら、やっぱり折角インストールしたんだから、色々勉強してみたいじゃんか?・・・それで、たろーちゃんに色々と教えて欲しいんだよ。」
たろー「えー、嫌だよ。面倒くさい。」
Aさん「いやいや!ラーメンも奢ってあげたじゃん。今度の休みの日、俺の家まで来てくれよ。な?!」
嫌な予感が的中しました。
たろーちゃんは仕方なく、次の休みの日、Aさんの家に行くことにしました。
(ピンポーン)
Aさん「おお、たろーちゃん。いらっしゃい。どうぞ、あがってあがって。」
たろー「お邪魔しまーす。・・・ってなんだよこの部屋。散らかりすぎだろ。」
Aさん「一人暮らしの男の部屋なんてこんなもんだろ?これでも掃除したんだぜ?」
Aさんはパソコンの前に散らかっている物を片付け、なんとか二人座れるだけのスペースを確保しました。
Aさん「まぁ、そこに座ってくれよ。」
たろー「ああ。・・・お?もう用意してるのか?」
Aさんのパソコン上では既に Oracle VM VirtualBox が起動されており、Linuxのターミナルが表示されていました。
そのターミナル上には・・・。
oracle@db7601:/home/oracle(db01s)$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 土 6月 8 11:25:59 2019 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved.
たろー「んん?なんだこれ? ログオン時にプロンプトが返ってこず、止まったままなのか?」
Aさん「ア、アレ?オッカシーナ-、サッキマデコンナ画面ジャナカッタノニー(棒)」
・・・。
Aさん「アレレ?オッカシーゾー。イッタイ、ナニガオコッテイルノカナー?(棒)」
たろー「・・・Aさん。これのために、今日、俺を呼んだんだろ?」
Aさん「ソ、ソンナコトハナイヨー(棒)」
どうやらAさんは、よく分からなくなった Oracle Database の状態を、たろーちゃんに治して欲しかったようです。
まずは状態の確認から
たろー「まったく。珍しくラーメン奢ってくれたかと思ったら、そういうことだったのか。仕方ない。診てみるか。」
たろーちゃんは、何が起こっているのか、調べることにしました。
たろー「まずは、コンソールで CTRL+C を試してみよう。」
oracle@db7601:/home/oracle(db01s)$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 土 6月 8 11:25:59 2019
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
^CERROR:
ORA-01075: すでにログオンしています。
oracle@db7601:/home/oracle(db01s)$
たろー「は?なんだこれ?OSのコマンドプロンプトに戻ってきてしまったぞ。」
Aさん「(ギクッ)」
たろー「アラートログには何か出力されてるかな?」
<アラートログ>
2019-06-08T11:27:53.260660+09:00
Errors in file /u01/app/oracle/diag/rdbms/db01s/db01s/trace/db01s_ora_3884.trc:
ORA-04088: トリガー'SYS.LOGON_TRIG'の実行中にエラーが発生しました
ORA-00604: 再帰SQLレベル1でエラーが発生しました。
ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました
ORA-06512: "SYS.DBMS_LOCK", 行215
ORA-06512: 行3
たろー「DBMS_LOCK??念のため、トレースファイルも見てみるか。」
<トレースファイル>
Trace file /u01/app/oracle/diag/rdbms/db01s/db01s/trace/db01s_ora_3884.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Build label: RDBMS_19.3.0.0.0DBRU_LINUX.X64_190417
ORACLE_HOME: /u01/app/oracle/product/19.0.0/dbhome_1
System name: Linux
Node name: db7601.oracle12c.jp
Release: 4.1.12-112.16.4.el7uek.x86_64
Version: #2 SMP Mon Mar 12 23:57:12 PDT 2018
Machine: x86_64
Instance name: db01s
Redo thread mounted by this instance: 1
Oracle process number: 38
Unix process pid: 4024, image: oracle@db7601.oracle12c.jp (TNS V1-V3)
*** 2019-06-08T11:27:53.260660+09:00 (CDB$ROOT(1))
*** SESSION ID:(269.50844) 2019-06-08T11:27:53.260739+09:00
*** CLIENT ID:() 2019-06-08T11:27:53.260757+09:00
*** SERVICE NAME:(SYS$USERS) 2019-06-08T11:27:53.260771+09:00
*** MODULE NAME:(sqlplus@db7601.oracle12c.jp (TNS V1-V3)) 2019-06-08T11:27:53.260787+09:00
*** ACTION NAME:() 2019-06-08T11:27:53.260803+09:00
*** CLIENT DRIVER:(SQL*PLUS) 2019-06-08T11:27:53.260816+09:00
*** CONTAINER ID:(1) 2019-06-08T11:27:53.260832+09:00
Skipped error 4088 during the execution of SYS.LOGON_TRIG
*** 2019-06-08T11:27:53.260891+09:00 (CDB$ROOT(1))
dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=0, mask=0x0)
----- Error Stack Dump -----
at 0x7fff579b4b50 placed kkt.c@9610
ORA-04088: トリガー'SYS.LOGON_TRIG'の実行中にエラーが発生しました
ORA-00604: 再帰SQLレベル1でエラーが発生しました。
ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました
ORA-06512: "SYS.DBMS_LOCK", 行215
ORA-06512: 行3
at 0x7fff579b51a0 placed kkt.c@9042
たろー「・・・Aさん。」
Aさん「ナニー?(棒)」
たろー「この SYS.LOGON_TRIG っていうトリガーを知らない?」
Aさん「イ、イヤー、ナンノコトダカ、サッパリー(棒)」
・・・Aさん。正直に言って。何をしたのか?
Aさん「う・・・、す、すまん。実は・・・これを見てくれ。」
するとAさんは、小さなテキストファイルを開きました。
CREATE OR REPLACE TRIGGER LOGON_TRIG AFTER LOGON ON DATABASE BEGIN LOOP DBMS_LOCK.SLEEP(10); END LOOP; END ; /
は?
Aさん「ずっと前にさ、Standard Edition の 2ノードRACの Oracle Databaseでトリガーを使ったじゃん?」
※Aさんの言うシステムについては以前の『SQL実行計画の変更 その2』の回を参照して下さい。
Aさん「それでトリガーに興味を持ってさ。トリガーでどんなことが出来るのか色々と試したくなって・・・。」
たろー「それで、ログオン時に停めるPL/SQLをコーディングしたの??」
Aさん「うん。どうなるのか、純粋に興味があってさ・・・。」
・・・。
Aさん「どうしたらログオン出来るようになるかな?」
たろー「どうしたらって・・・。えーっと、・・・うーむ、ログオンシーケンスの途中で止まっている訳だから・・・この場合は・・・。」
Aさん「・・・。」
たろー「・・・。」
Aさん「・・・・・・。」
たろー「・・・・・・。」
Aさん「・・・・・・・・・。」
┐(。・ε・。)┌
Aさん「えー!」
たろー「無理だよ。AFTER LOGON ON DATABASE トリガーの途中で止まってるんだから、ログオンしようがない。」
Aさん「そんなー!」
たろー「大人しくバックアップから戻すしかないよ。バックアップ取ってるんだろ?」
Aさん「・・・。」
たろー「・・・。」
Aさん「・・・・・・。」
たろー「・・・・・・。」
┐(。・ε・。)┌
たろー「・・・・・・まさか。」
Aさん「ただの勉強用に構築したおもちゃ環境だよ?バックアップなんて取ってるわけないじゃん。」
うわぁ・・・。
バックアップがなければ、どうしたらいいの??
たろー「バックアップがないなら、もうダメだよ。」
Aさん「えー!」
たろー「ただの勉強用に構築したおもちゃ環境なんだろ?DBインスタンスを削除して、もう一回作り直したらいいじゃん。」
Aさん「・・・いやぁ、それが・・・。」
たろー「どうした?何か問題あるの?」
Aさん「PL/SQLを勉強するために、SQL Developer を使ってたんだよ。」
たろー「うん。」
Aさん「で、色んなプログラムを Oracle Database に接続して直接コーディングしてたわけ。」
たろー「ふむ、それで?」
Aさん「だから、ローカルPCにそれらの PL/SQL ソースが全く残ってないの・・・。」
たろー「・・・まさか。」
Aさん「PL/SQL ノそーすダケデモ、トリダシタイナァ・・・(棒)」
ハァ・・・(ため息)
今回はここまで。
はたしてたろーちゃんは、この状況を打開することが出来るのでしょうか?