ロックをつぶせ! 最初に疑うべき原因:Oracleパフォーマンス障害の克服(2)(2/3 ページ)
Oracleデータベースの運用管理者は、突発的に直面するパフォーマンス障害にどうやって対処したらよいか。本連載は、非常に複雑なOracleのアーキテクチャに頭を悩ます管理者に向け、短時間で問題を切り分け、対処法を見つけるノウハウを紹介する。対象とするバージョンはOracle8から9iまでを基本とし、10gの情報は随時加えていく。(編集局)
動的パフォーマンスビューによる調査
問題となっているロックを特定していく作業に利用できるものが、その名前からも分かるように、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
(内容の抜粋は下記の表2参照)
列名 | データ型 | 格納されているデータの内容 |
---|---|---|
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.