Oracle Database †
主なテーブル †
基本SQL操作 †
SETコマンド †-- 標準出力させる場合のテンプレート set line 10000 pages 50000 num 20 colsep "," trim on -- 空白行なく結果レコードのみ出力させる set line 10000 pages 0 num 20 colsep "," verify off feedback off trims on term off
RAC環境のリソース操作 †DB名や、インスタンス名は、show parameter の db_name / instance_name で確認
トラブルシューティング †現行セッションのSPID及び出力先トレースファイル確認 †select value from v$diag_info where name='Default Trace File'; -- 接続中のPIDを確認する select p.spid PID from v$session s, v$process p where s.paddr=p.addr and s.sid=(select distinct sid from v$mystat); イベント設定確認 †oradebug setmypid oradebug eventdump system HANGANALYZE †DBハング時に、どのプロセスが原因か特定する場合に取得。 alter session set events 'immediate trace name hanganalyze level 10'; -- 10g alter session set events 'immediate hanganalyze(10)'; -- 11g -- 全インスタンス取得 radebug setinst all ←要らないかも oradebug -g all hanganalyze 4
level XX を off にすることで無効化。 State Dump †ハングやスピンの原因を究明するのに有用。スピンの場合は複数回取得が必要(状況が随時変化する為) -- SQL*Plusで接続できない(接続時にプロンプトが返ってこない)場合は、-prelim でログインして取得する sqlplus -prelim / as sysdba -- プロセス単位で取得 oradebug setospid [プロセスID(SPID)] oradebug dump processstate 10; -- インスタンス内全てのプロセス取得 alter session set events 'immediate trace name systemstate level 266'; -- 10g alter session set events 'immediate systemstate(266)'; -- 11g oradebug setmypid oradebug unlimit oradebug dump systemstate 266 ※ traceフォルダ配下にSQL*Plus接続してるプロセスのトレースに出力される(<SID>_ora_<PID>.trc) oradebug tracefile_name ※ 出力されるトレースファイルのフルパス表示 -- 全てのインスタンスの全プロセス取得 alter session set events 'immediate trace name systemstate_global level 266'; -- 10g alter session set events 'immediate systemstate_global(266)'; -- 11g oradebug -g all dump systemstate 266 ※ traceフォルダ配下にあるdiagプロセスのトレースが出力される(<SID>_diag_<PID>.trc)
level XXX を off にすることで無効化。
ERROR STACK †ORA-600などのクリティカルエラーが発生した時に自動で出力される情報(スタックや、PROCESS STATE、カーソル情報等)。 alter { session | system } set events 'XXXXX trace name errorstack { level 3 | off }'; -- 10g alter { session | system } set events 'XXXXX [occurence:end_after 1] errorstack(3)'; -- 11g ※ XXX は ORA-XXXXのエラー番号 ※ occurence:end_after 1 は 1回イベント取得したら終了する(デフォルトはforeverで永続) -- 特定セッションで ERROR STACK取得 oradebug setospid [プロセスID] oradebug unlimit oradebug dump errorstack 3
リソースダンプ †以下の待機イベントで処理が進まない場合に取得する -- 引数のパラメータ確認(P1RAWとP2RAWの値を確認する) select sid, event, p1, p1raw, p2, p2raw, state from gv$session where event = 'gc buffer busy'; SID EVENT P1 P1RAW P2 P2RAW STATE ---------- --------------- ---------- ---------------- ---------- ---------------- --------- 25 gc buffer busy 4 0000000000000004 26 000000000000001A WAITING -- リソースダンプを取得する oradebug lkdebug -O <P2RAWの値> <P1RAWの値(必ず5桁)> BL (例) oradebug lkdebug -O 0x1A 0x00004 BL sqlトレース †AWRでは解らない、解析(Parse)、実行(Excute)、フェッチ(Fetch)の処理時間が確認できる
セッション単位 -- トレース取得手順 show parameter timed_statistics -- FALSEの場合は下記実行 alter session set timed_statistics=true; show parameter max_dump_file_size -- unlimited以外は下記実行 alter session set max_dump_file_size=unlimited; -- トレース取得設定 alter session set events '10046 trace name context forever, level 28'; -- 問題のSQLを実行する -- -- トレースを解除する alter session set events '10046 trace name context off'; -- 出力場所の確認 select value from v$diag_info where name like '%Def%'; -- 出力結果編集 tkprof <トレースファイル> <任意の出力ファイル名> explain=<USER>/<PASSWD> -- 現行セッション alter session set events '10046 trace name context forever, level 12'; alter session set events '10046 trace name context off' ※ level は 1(実行時間+実行計画)4(1+バインド変数表示)8(1+待機イベント表示)12(1+4+8)が指定可能 exec DBMS_MONITOR.SESSION_TRACE_ENABLE; exec DBMS_MONITOR.SESSION_TRACE_DISABLE; -- 別セッション指定 exec DBMS_SYSTEM.SET_EV(<sid>, <serial#>, 10046, 12, ''); exec DBMS_SYSTEM.SET_EV(<sid>, <serial#>, 10046, 0, ''); exec DBMS_MONITOR.SESSION_TRACE_ENABLE(<sid>, <serial#>, true, true); exec DBMS_MONITOR.SESSION_TRACE_DISABLE; -- 3番目の引数は、待機情報を出力。4番目は、バインド変数の内容を出力する ユーザー単位 exec DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE('ユーザー名', true, true); exec DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE('ユーザー名'); SQL_ID単位(11.1以降) alter { session | system } set events 'sql_trace [sql:SQL_ID] wait=true, bind=true'; alter { session | system } set events 'sql_trace [sql:SQL_ID] off'; ※ []はそのまま入力すること DB全体 exec DBMS_MONITOR.DATABASE_TRACE_ENABLE; exec DBMS_MONITOR.DATABASE_TRACE_DISABLE; sqlトレースファイルの整形 tkprof トレースファイル名 出力ファイル名 [オプションパラメータ] 引数を何も指定しないで実行すればヘルプが表示される
EMが利用できない †Database Control(リポジトリ及び構成ファイル)を再作成する emca -deconfig dbcontrol db -repos drop emca -config dbcontrol db -repos recreate セッションを切断 †
UNDOTBSのリカバリー †UNDOTBSで使用している DATAFILE の STATUS が「RECOVER」となっている場合のリカバリ手順(RAC環境でも可能) -- DBを停止させる -- DBをマウントさせる startup mount -- リカバリーを行う recover datafile 'UNDOTBSのファイル'; ※ 下記のようなログが出力される。最後にENTER押下しないとプロンプト戻ってこないので、時々ENTER押下する ============================================================================== ORA-00279: 変更xxxxxxxxx(MM/DD/YYYY HH:MM:SSで生成)にはスレッドxが必要です ORA-00289: 検討すべきログ・ファイル〜〜 ORA-00280: 変更xxxxxxxxx(スレッドx)は順序番号xxxxxxxに存在します。 ログの指定: {<RET>=suggested | filename | AUTO | CANCEL} 〜〜 ログが適用されました。 メディア・リカバリが完了しました。 ============================================================================== -- DBをOPENする alter database open; select status from v$instance; -- DATAFILEの状態確認(OFFLINEになってると思う) select name, status from v$datafile where name = 'UNDOTBSのファイル'; -- DATAFILEのONLINE化 alter database datafile '/data/data/undotbs01.dbf' online; -- DATAFILEの状態確認(ONLINEになってること) select name, status from v$datafile where name = 'UNDOTBSのファイル'; -- 表領域の状態確認 select tablespace_name,status from dba_tablespaces where tablespace_name='UNDOTBS名'; トピック †特定のSQLを繰り返し実行 †都度 sqlplusでログインすると、その度にサーバープロセスが作成されリソースの無駄になる為、SQL*Plusにechoの出力をパイプで渡し、SQLに接続したまま実行させる ( echo "conn <UID>/<password>" echo "set time on timing on" while [ 1 ] do echo "select count(*) from v\$session;" sleep 5 done ) | sqlplus /nolog |