oracle database in lock

30
Oracle Database In Lock 2012/10/19 株式会社コーソル 渡部亮太

Upload: ryota-watabe

Post on 24-May-2015

2.549 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Oracle Database In Lock

Oracle Database In Lock

2012/10/19 株式会社コーソル 渡部亮太

Page 2: Oracle Database In Lock

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 所有)

Page 3: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

本日お伝えしたいこと

Oracle Databaseには多数のロック機構が存在すること

それぞれのロック機構の役割と、ロック機構により実現される同時実行制御に関するイメージ

注意書き

内部動作の情報が公開されていないなかで、渡部が推測した内容がふくまれるため、本情報は、各自の理解を助けるための参考にしてください

(当り前ですが)本情報を、何らかのアクションの唯一の「根拠」として活用することは避けてください

2

Page 4: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

RDBMSにおけるロック機構の必要性

一般的なRDBMS(クライアント-サーバー型)では複数の処理が同時に実行される

ロック機構により排他制御を行わないと、様々なよからぬことが起きる

データの整合性が崩れる

直列処理が並列実行されてしまう

領域割り当てが重複してしまう

管理構造が破壊される

など

3

Page 5: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

データの整合性が崩れる #1

4

Process

(or Session)

Process

(or Session)

Page 6: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

データの整合性が崩れる #2

5

Process

(or Session)

Process

(or Session)

Page 7: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

直列処理が並列実行されてしまう

6

処理#1 処理#2

処理#2

OK

NG

Page 8: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

領域割り当てが重複してしまう

7

Process

(or Session)

Process

(or Session)

領域割り当て要求

領域割り当て要求

Page 9: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

管理構造が破壊される

8

x y z

x a z x y z

a

OK NG

Page 10: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

Oracle Databaseのロック機構

9

ロック機構 説明

エンキュー FIFO型で多数のロックモードを持つロック機構 ユーザー型 : ユーザーの操作(DML実行、DBMS_LOCK実行など)に対応してエンキューが獲得、解放される

システム型 : Oracleの内部動作に対応してエンキューが獲得、解放される

ライブラリキャッシュロック

いわゆるDDLロック。オブジェクトの定義変更に関わる排他制御に用いられる

ライブラリキャッシュピン

ライブラリキャッシュオブジェクトの実体であるメモリ領域(ヒープ)の排他制御に用いられる

ラッチ 仕組みが単純で低コスト。原則的に排他モードのみ。 複数プロセスで共有されるメモリ領域の排他制御に用いられる

Mutex ラッチよりもさらに低コスト。 ライブラリキャッシュオブジェクトをより細かい粒度で保護できる

行キャッシュロック 共有プール内のディクショナリキャッシュの排他制御に用いられる

Page 11: Oracle Database In Lock

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つのロックモードがある

[例: 排他/共有モードを持つロックの互換性]

Page 12: Oracle Database In Lock

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

Page 13: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

エンキュー

様々なリソースに関わる同時実行制御に使用される

リソース毎に異なるタイプのエンキューが使用される

タイプはアルファベット2文字で表現される

例) TX = 行ロック, TM = 表ロック

獲得待機時に発生する待機イベント

"enq <タイプ> - <説明>"

例) TXエンキューの更新競合 → "enq: TX - row lock contention"

多数のロックモードと複雑な互換性を持つ(本日は説明を省略)

12

Page 14: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

エンキューの種類と分類

エンキューの種類

非常に多くの種類のエンキューが存在

V$LOCK_TYPEから確認可能

エンキューごとに保護する対象が異なる

ユーザー操作に関わる観点から、以下の2つに分類

ユーザー型

TXエンキュー=行ロック

TMエンキュー=表ロック

ULエンキュー=DBMS_LOCK

システム型

TX, TM, UL以外の全てのエンキュー

CFエンキュー=制御ファイルへのアクセス制御用ロック

など

13

Page 15: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

TXエンキュー

TXエンキューはユーザー型に分類されるエンキュー

獲得: トランザクションの開始(≒行の更新)

解放: トランザクションの終了(コミット or ロールバック)

TXエンキュー獲得待機時に発生する待機イベント

"enq: TX - row lock contention"

など

目的

データ(=行)の整合性を保護する

14

Page 16: Oracle Database In Lock

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

Page 17: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

CFエンキュー

CFエンキューはシステム型に分類されるエンキュー

獲得:制御ファイルへのアクセス開始

解放:制御ファイルへのアクセス終了

制御ファイルにはDatabaseの管理情報が記録される

主にDatabaseの管理タスクが実行されるタイミングでCFエンキューを獲得

例) ログスイッチ、チェックポイント

目的

制御ファイルに格納された管理情報の整合性保護

16

Page 18: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

CFエンキューの競合とタイムアウト

CFエンキュー獲得待機時に発生する待機イベント

"enq: CF - contention"

CFエンキュー獲得タイムアウト

ORA-600[2103]が発生

CFエンキューの競合が問題となる状況

何らかの理由で制御ファイルへのI/Oがハング

Oracle のBug

論理的には・・・実際に多くのセッションが制御ファイルにアクセスして場合も考えられなくもない

17

Page 19: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

[デモ] CFエンキュー獲得待機

デモ

制御ファイルI/Oの遅延を疑似

シナリオ

1. gdbでブレークポイントを設定

2. ログスイッチ実行 → CFエンキュー獲得+保持

3. チェックポイント実行 → CFエンキュー要求 → 待機イベント"enq: CF - contention"で待機

18

Page 20: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

ライブラリキャッシュロック

ライブラリキャッシュロックはオブジェクト定義変更に関わるロック

排他モードで獲得:オブジェクトの定義変更

共有モードで獲得:オブジェクトの定義参照

良くある誤解

TMエンキュー(表ロック)とライブラリキャッシュロックを混同

獲得待機時に発生する待機イベント

" library cache lock"

19

Page 21: Oracle Database In Lock

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

Page 22: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

[デモ]ライブラリキャッシュロック

DDL実行でライブラリキャッシュロックを排他モードで獲得する

デモシナリオ

1. 表にデフォルト値を含む列を追加 → 表のライブラリキャッシュロックを排他モードで獲得+保持

2. 表を参照するSQLを実行 → 表のライブラリキャッシュロックを共有モードで要求 → 待機イベント"library cache lock"で待機

21

Page 23: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

ライブラリキャッシュピン

ライブラリキャッシュピンはオブジェクト定義+そのものに関わるロック

排他モードで獲得:オブジェクトの変更

共有モードで獲得:オブジェクトの参照

獲得待機時に発生する待機イベント

'library cache pin'待機イベント

ライブラリキャッシュロックとライブラリピン

両者の関係性はあまり明確にされていない

一般的にロックを獲得した後、ピンを獲得or開放する

22

Page 24: Oracle Database In Lock

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

Page 25: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

[デモ]ライブラリキャッシュピン

ライブラリキャッシュピンはDDL実行で排他モードで獲得される

デモシナリオ

1. 処理に長時間要するパッケージのプロシージャを実行 → パッケージのライブラリキャッシュピンを共有モードで獲得+保持

2. パッケージをコンパイル → パッケージのライブラリキャッシュロックを排他モードで獲得 → パッケージのライブラリキャッシュピンを排他モードで要求 → 待機イベント"library cache pin"で待機

24

Page 26: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

ラッチ

SGA内に存在する共有メモリ領域の排他制御に使用される

獲得:共有メモリ領域(群) へのアクセス開始

解放:共有メモリ領域(群)へのアクセス終了

共有メモリ領域へのアクセス

メモリ領域(データ)の更新、新規領域割り当て、管理構造(メタデータ)の更新など

基本的に獲得→解放は極めて短時間

一般にマイクロ秒(~ミリ秒)レベル

ラッチ獲得待機で発生する待機イベント

'latch: <ラッチ名>' (10.1-)

'latch free'

25

Page 27: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

ラッチ一覧

ラッチ関連V$ビュー

V$LATCH

V$LATCHNAME

V$LATCH_PARENT

V$LATCH_CHILDREN

26

Page 28: Oracle Database In Lock

Copyright (C) 2012 CO-Sol Inc. All Rights Reserved

shared poolラッチ

27

共有プールにおけるメモリ領域(=チャンク)の割り当てに関わる同時実行制御に使用される

同じメモリ領域を誤って別の用途に割り当てないように

空き領域確保にともなう各種管理構造のメンテナンスがバッティングしないように

Page 29: Oracle Database In Lock

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

説明の便宜上、非常に単純化して書いています

Page 30: Oracle Database In Lock

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