問題となっているロックを特定していく作業に利用できるものが、その名前からも分かるように、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');
図1 V$LOCK動的パフォーマンスビューからSID(セッションID)、TYPE(ロックタイプ)、LMODE(ロックモード)、REQUEST(要求されているロック)、CTIME(ロックされた時間)を取得する(クリックで拡大します)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'));
図2 V$SESSION動的パフォーマンスビューで、V$LOCKから取得したSID列の値で絞り込み、SADDR(セッションアドレス)、SID(セッションID)、SERIAL#(セッションシリアル番号)、USERNAME(ログインユーザー名)、PROGRAM(ログインプログラム名)を取得する(クリックで拡大します)次ページでは引き続き、動的パフォーマンスビューを使った作業を解説し、最後に実践的なサンプルSQLを紹介します。(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.