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