問題となっているロックを特定していく作業に利用できるものが、その名前からも分かるように、V$LOCK、V$SESSION、V$SQLAREA、V$LOCK_OBJECTという動的パフォーマンスビュー注1です。それぞれの動的パフォーマンスビューからどのような情報を取得できるか確認するために、DESC[RIBE](各テーブルやビューの構成を表示するSQL*PLUSコマンド)コマンドと実際のSQL文で確認していきましょう。
注1:動的パフォーマンスビュー
Oracleサーバが稼働している間、データベースの状態を保持している表に対するアクセスを可能にするビュー。「動的パフォーマンスビュー」「データディクショナリビュー」に関する詳細解説は、@IT記事「OracleMaster試験ポイント解説」にありますので参照してみてください。
V$LOCK
SQL> DESC V$LOCK
列名 | データ型 | 格納されているデータの内容 |
---|---|---|
KADDR | RAW(4) | ロックアドレス |
SID | NUMBER | ロックを保持しているセッションID |
TYPE | VARCHAR2(2) | 要求しているロックタイプ。さまざまなキーワードが格納されているため、今回は以下のキーワードに注目 TM: DMLエンキュー TX: トランザクションエンキュー |
LMODE | NUMBER | 保持するロックモード。現在かけられているロックを示す 0:なし 1:NULL NULL 2:SS 行共有 3:SX 行排他 4:S 共有 5:SSX 共有/行排他 6:X 排他 |
REQUEST | NUMBER | 要求するロックモード。要求されているロックを示す 0:なし 1:NULL NULL 2:SS 行共有 3:SX 行排他 4:S 共有 5:SSX 共有/行排他 6:X 排他 |
CTIME | NUMBER | 現行のモードが付与されてから経過した時間 |
表2 V$LOCK動的パフォーマンスビュー(抜粋) |
この動的パフォーマンスビューは、現在アクティブになっているロックの状態を確認できます。「どのセッションがロックをかけているのか」ということを知るためには、SID列に格納されている、ロックを保持するセッションIDを使用します。
また、TYPE列に注目してください。このロックタイプにはさまざまな種類がありますが、関連するデータは「TM」と「TX」になります。「TM」はDMLエンキューと呼ばれるデータの一貫性を保証するためのロックであり、「TX」はトランザクションエンキューと呼ばれるデータ構造の整合性を保証するためのロックとなります。つまり、ある表に対する更新要求が行われた場合、「TM」「TX」のロックが発生します。また、REQUEST列のデータが「0:なし」でない場合、そのセッションは現在更新要求を出しているが、ロックがかかって「待ち」が発生していることを示します。
それでは、このビューから情報取得に有効な項目を取得してみましょう。ここでは、「TM」「TX」のデータに注目してください。
ロックの基本情報を取得するSQL文
SQL> SELECT SID,TYPE,LMODE,REQUEST,CTIME FROM V$LOCK WHERE TYPE IN ('TX','TM');
V$SESSION
ロックをかけているセッション、ロックの状態は分かりました。それでは、V$LOCK動的パフォーマンスビューから取得したセッションIDを利用して、「どのユーザーがロックをかけているのか」「どのプログラムがロックをかけているのか」を解決をしましょう。このセッションの状態を格納している動的パフォーマンスビューがV$SESSIONです。このビューはたくさんの情報を保持していますのが、ここでは必要な部分を抜粋して解説します。
SQL> DESC V$SESSION
V$SESSION動的パフォーマンスビューの概要を取得する
(内容の抜粋は下記の表3参照)
列名 | データ型 | 格納されているデータの内容 |
---|---|---|
SADDR | RAW(4) | セッションアドレス |
SID | NUMBER | セッションID |
SERIAL# | NUMBER | セッションシリアル番号 |
USER# | NUMBER | オラクルログインユーザーID |
USERNAME | VARCHAR2(30) | オラクルログインユーザー名 |
LOCKWAIT | VARCHAR2(8) | 待機中のロックのシステムアドレス |
STATUS | VARCHAR2(8) | セッション状態 |
PROGRAM | VARCHAR2(64) | ログインしているプログラム名 |
LOGIN__TIME | DATE | ログインした時間 |
表3 V$SESSION動的パフォーマンスビュー(抜粋) |
ロックをかけているユーザーとプログラムを特定するSQL文
SQL> SELECT SADDR,SID,SERIAL#,USERNAME,PROGRAM FROM V$SESSION WHERE SID = ANY(SELECT SID FROM V$LOCK WHERE TYPE IN ('TX','TM'));
次ページでは引き続き、動的パフォーマンスビューを使った作業を解説し、最後に実践的なサンプルSQLを紹介します。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.