利用状況を監視するのだ!
悪さする奴は見逃さないノダ?!
sessionチェック
オラクルデータベースで実行される処理(SQL)は「session」という単位で管理される。 ■全session表示 SELECT username, osuser, machine, terminal, program, client_info FROM v$session; ■種類ごとに表示 select count(*), username, osuser, machine, terminal, program, client_info from v$session group by username, osuser, machine, terminal, program, client_info order by 1 desc; ■条件絞って表示 オラクルのsessionは「sid」と「serial#」という情報にて識別可能。 SELECT username, osuser, machine, terminal, program, client_info FROM v$session WHERE sid=1 AND serial#=12345;ロック対応
複数セッションにて同じデータ(ブロック)を更新しようとすると、「ロック」という待ち状態が発生することがある。 時間がたてば解決される場合もあるが、お互いがお互いの終了を待ってしまう「デットロック」という状態に陥ることも! そんな場合には、DBAたるもの慎重かつ大胆に対応することが重要。 時には迷わずブッタッギッテやればいいのだ。 ■ロックで待たされてるSQLはいないかチェック(高負荷) SELECT a.sid, a.serial#, b.type, to_char(b.ctime/60,'999990.9') Min, c.sql_text FROM v$session a, v$lock b, v$sqlarea c WHERE a.lockwait = b.kaddr AND a.sql_address = c.address ORDER BY b.ctime desc; ■犯人は誰だ! SELECT b.id1, a.sid, a.serial#, b.type, to_char(b.ctime/60,'999990.9') MIN ,decode(b.lmode ,1,'null', 2,'row share', 3,'row exclusive' ,4,'share', 5,'share row exclusive', 6,'exclusive') LMODE ,decode(b.request ,1,'null', 2,'row share', 3,'row exclusive' ,4,'share', 5,'share row exclusive', 6,'exclusive') REQUEST FROM v$session a, v$lock b WHERE a.sid = b.sid AND(b.id1, b.id2) in (SELECT d.id1, d.id2 FROM v$lock d WHERE d.id1=b.id1 AND d.id2=b.id2 AND d.request > 0) ORDER BY b.id1,b.ctime desc; 表示例) ID1 SID SERIAL# TY MIN LMODE REQUEST ---------- ---------- ---------- -- --------- ------------------- ------------ 393233 10 14 TX 31.0 exclusive 393233 12 17 TX 30.6 exclusive LMODE:ロックしているセッション REQUEST:待たされているセッション ■対応方法 上記SQL結果から、待たされているユーザ/ロックしているユーザの情報を把握する。 あとは以下のような対応を検討すればよい。 ・ロックしているユーザに処理を完了してもらう(COMMIT,ROLLBACK) ・待っている人に状況説明する(犯人、処理可能予定等) ・意図せずロックしてしまった場合は強制終了。セッション強制終了
以下のSQL文にてセッションを強制終了することが可能。 ALTER SYSTEM KILL SESSION sid, #serial; DBAはこんなこともできてしまうのだ! オラクルのバックグラウンドプロセスのセッションなんかをKILLしちゃうと・・・。 作業は慎重に行いましょう。