Mais conteúdo relacionado Semelhante a Oracle Database In Lock (20) Oracle Database In Lock2. Who am I?
渡部 亮太(わたべ りょうた)
book
「プロとしてのOracleアーキテクチャ入門」
「プロとしてのOracle運用管理入門」
presentation
Oracle DBA & Developer Days 2010, 2011
Developers Summit 2009
Oracle OpenWorld Tokyo 2012 Unconference など
Blog
コーソル DatabaseエンジニアのBlog http://co-sol.jp/techdb/
株式会社コーソル
「CO-Solutions=共に解決する」の理念のもと、Oracle技術
に特化した事業を展開中
社員数: 94名 (エンジニアのほぼ全員がOracle Master 所有)
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 1
3. 本日お伝えしたいこと
Oracle Databaseには多数のロック機構が存在すること
それぞれのロック機構の役割と、ロック機構により実現される
同時実行制御に関するイメージ
注意書き
内部動作の情報が公開されていないなかで、渡部が推測した内
容がふくまれるため、本情報は、各自の理解を助けるための参考
にしてください
(当り前ですが)本情報を、何らかのアクションの唯一の「根拠」とし
て活用することは避けてください
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 2
4. RDBMSにおけるロック機構の必要性
一般的なRDBMS(クライアント-サーバー型)では複数の
処理が同時に実行される
ロック機構により排他制御を行わないと、様々なよからぬこ
とが起きる
データの整合性が崩れる
直列処理が並列実行されてしまう
領域割り当てが重複してしまう
管理構造が破壊される
など
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 3
5. データの整合性が崩れる #1
Process Process
(or Session) (or Session)
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 4
6. データの整合性が崩れる #2
Process Process
(or Session) (or Session)
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 5
7. 直列処理が並列実行されてしまう
OK
処理#1 処理#2
NG
処理#2
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 6
8. 領域割り当てが重複してしまう
Process Process
(or Session) (or Session)
領域割り当て 領域割り当て
要求 要求
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 7
9. 管理構造が破壊される
x y z
OK NG
x a z x y z
a
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 8
10. Oracle Databaseのロック機構
ロック機構 説明
エンキュー FIFO型で多数のロックモードを持つロック機構
ユーザー型 : ユーザーの操作(DML実行、DBMS_LOCK実行など)に
対応してエンキューが獲得、解放される
システム型 : Oracleの内部動作に対応してエンキューが獲得、解放さ
れる
ライブラリキャッシュ いわゆるDDLロック。オブジェクトの定義変更に関わる排他制御に用いられ
ロック る
ライブラリキャッシュ ライブラリキャッシュオブジェクトの実体であるメモリ領域(ヒープ)の排他制御
ピン に用いられる
ラッチ 仕組みが単純で低コスト。原則的に排他モードのみ。
複数プロセスで共有されるメモリ領域の排他制御に用いられる
Mutex ラッチよりもさらに低コスト。
ライブラリキャッシュオブジェクトをより細かい粒度で保護できる
行キャッシュロック 共有プール内のディクショナリキャッシュの排他制御に用いられる
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 9
11. 互換性とロック獲得待機
[例: 排他/共有モードを持つロックの互換性]
要求
S X
保持 なし ○ ○ ロック機構により、ロックモードの種類と
S ○ × 互換性定義が異なることに注意
例) エンキューには7つのロックモードがある
X × ×
10
#1 ロック #2
対象
待機イベントX REQ HOLD
mode=S mode=X
#1 ロック #2
対象
HOLD HOLD
mode=S mode=S
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved
12. Oracle DBでのロック状態確認方法
機能 説明 例)TXエンキューの場合
V$ビュー ロック種別に応じたV$ビューで V$LOCK、
ロック状態、ロック関連統計情 V$TRANSACTION な
ど
報を確認できる
待機イベント ロック獲得待機発生時、待機 'enq: TX - row lock
セッションでロック種別、ロック contention'
など
の使用形態に応じた待機イベ
ントが発生し、V$SESSION
やSQLトレースから確認でき
る
各種診断機 トレースファイルにdumpした system state, hang
能 動作詳細情報から、ロックに analyze
関わる情報を確認できる
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved
13. エンキュー
様々なリソースに関わる同時実行制御に使用される
リソース毎に異なるタイプのエンキューが使用される
タイプはアルファベット2文字で表現される
例) TX = 行ロック, TM = 表ロック
獲得待機時に発生する待機イベント
"enq <タイプ> - <説明>"
例) TXエンキューの更新競合
→ "enq: TX - row lock contention"
多数のロックモードと複雑な互換性を持つ(本日は説明を省略)
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 12
14. エンキューの種類と分類
エンキューの種類
非常に多くの種類のエンキューが存在
V$LOCK_TYPEから確認可能
エンキューごとに保護する対象が異なる
ユーザー操作に関わる観点から、以下の2つに分類
ユーザー型
TXエンキュー=行ロック
TMエンキュー=表ロック
ULエンキュー=DBMS_LOCK
システム型
TX, TM, UL以外の全てのエンキュー
CFエンキュー=制御ファイルへのアクセス制御用ロック
など
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 13
15. TXエンキュー
TXエンキューはユーザー型に分類されるエンキュー
獲得: トランザクションの開始(≒行の更新)
解放: トランザクションの終了(コミット or ロールバック)
TXエンキュー獲得待機時に発生する待機イベント
"enq: TX - row lock contention"
など
目的
データ(=行)の整合性を保護する
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 14
16. [デモ] TXエンキュー獲得待機
デモ
同一行の更新によるTXエンキューの獲得+保持と獲得要求の競
合
シナリオ
1. 行XをUPDATE(コミットしない)
→ TXエンキューA 獲得+保持
2. 別セッションで行XをUPDATE
→ TXエンキューA 要求
→ 待機イベント"enq: TX - row lock contention"で待機
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 15
17. CFエンキュー
CFエンキューはシステム型に分類されるエンキュー
獲得:制御ファイルへのアクセス開始
解放:制御ファイルへのアクセス終了
制御ファイルにはDatabaseの管理情報が記録される
主にDatabaseの管理タスクが実行されるタイミングでCFエンキュ
ーを獲得
例) ログスイッチ、チェックポイント
目的
制御ファイルに格納された管理情報の整合性保護
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 16
18. CFエンキューの競合とタイムアウト
CFエンキュー獲得待機時に発生する待機イベント
"enq: CF - contention"
CFエンキュー獲得タイムアウト
ORA-600[2103]が発生
CFエンキューの競合が問題となる状況
何らかの理由で制御ファイルへのI/Oがハング
Oracle のBug
論理的には・・・実際に多くのセッションが制御ファイルにアクセスし
て場合も考えられなくもない
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 17
19. [デモ] CFエンキュー獲得待機
デモ
制御ファイルI/Oの遅延を疑似
シナリオ
1. gdbでブレークポイントを設定
2. ログスイッチ実行 → CFエンキュー獲得+保持
3. チェックポイント実行
→ CFエンキュー要求
→ 待機イベント"enq: CF - contention"で待機
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 18
20. ライブラリキャッシュロック
ライブラリキャッシュロックはオブジェクト定義変更に関わるロッ
ク
排他モードで獲得:オブジェクトの定義変更
共有モードで獲得:オブジェクトの定義参照
良くある誤解
TMエンキュー(表ロック)とライブラリキャッシュロックを混同
獲得待機時に発生する待機イベント
" library cache lock"
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 19
21. ライブラリキャッシュロックの保護対象
Library Cache
hash bucket object handle
object handle
heap 0 heap n
library
・・・
cache
lock
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 20
22. [デモ]ライブラリキャッシュロック
DDL実行でライブラリキャッシュロックを排他モードで獲得す
る
デモシナリオ
1. 表にデフォルト値を含む列を追加
→ 表のライブラリキャッシュロックを排他モードで獲得+保持
2. 表を参照するSQLを実行
→ 表のライブラリキャッシュロックを共有モードで要求
→ 待機イベント"library cache lock"で待機
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 21
23. ライブラリキャッシュピン
ライブラリキャッシュピンはオブジェクト定義+そのものに関わ
るロック
排他モードで獲得:オブジェクトの変更
共有モードで獲得:オブジェクトの参照
獲得待機時に発生する待機イベント
'library cache pin'待機イベント
ライブラリキャッシュロックとライブラリピン
両者の関係性はあまり明確にされていない
一般的にロックを獲得した後、ピンを獲得or開放する
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 22
24. ライブラリキャッシュピンの保護対象
Library Cache
hach bucket object handle
object handle
heap 0 heap n
・・・
library cache pin
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 23
25. [デモ]ライブラリキャッシュピン
ライブラリキャッシュピンはDDL実行で排他モードで獲得され
る
デモシナリオ
1. 処理に長時間要するパッケージのプロシージャを実行
→ パッケージのライブラリキャッシュピンを共有モードで獲得+保持
2. パッケージをコンパイル
→ パッケージのライブラリキャッシュロックを排他モードで獲得
→ パッケージのライブラリキャッシュピンを排他モードで要求
→ 待機イベント"library cache pin"で待機
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 24
26. ラッチ
SGA内に存在する共有メモリ領域の排他制御に使用され
る
獲得:共有メモリ領域(群) へのアクセス開始
解放:共有メモリ領域(群)へのアクセス終了
共有メモリ領域へのアクセス
メモリ領域(データ)の更新、新規領域割り当て、管理構造(メタデ
ータ)の更新など
基本的に獲得→解放は極めて短時間
一般にマイクロ秒(~ミリ秒)レベル
ラッチ獲得待機で発生する待機イベント
'latch: <ラッチ名>' (10.1-)
'latch free'
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 25
27. ラッチ一覧
ラッチ関連V$ビュー
V$LATCH
V$LATCHNAME
V$LATCH_PARENT
V$LATCH_CHILDREN
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 26
28. shared poolラッチ
共有プールにおけるメモリ領域(=チャンク)の割り当てに関
わる同時実行制御に使用される
同じメモリ領域を誤って別の用途に割り当てないように
空き領域確保にともなう各種管理構造のメンテナンスがバッティン
グしないように
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 27
29. 共有プールとshared poolラッチ
説明の便宜上、非常に単純化して書いています
free list bucket subpool
size=xx
size=yy
shared pool
latch size=zz
size=xx
size=yy
shared pool
latch size=zz
・
・
・
free area
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 28
30. [デモ]shared poolラッチ
デモシナリオ
1. V$LATCH_CHILDRENからshared poolラッチのアドレス
を確認
2. oradebugでshared poolラッチを獲得
3. SQLを実行
→ ハードパース発生
→ チャンク確保要求
→ shared poolラッチ要求
→ 待機イベント"latch: shared pool" 発生
Copyright (C) 2012 CO-Sol Inc. All Rights Reserved 29