
Block Dump - 日本エクセム株式会社 Oracle 技術情報
目次[非表示]
Block Dump
トランザクションでの状況を理解するには、トランザクション発生時いくつかの段階でどのようなデータがどのような形で変更されるかを理解する必要があります。特に、データブロックと、UNDO領域でのデータの変更についての理解が必要となります。オラクルが提供するダンプ(Dump)機能を利用すれば、トランザクションによって変更されたデータ情報を物理的に観察することができます。一つの簡単な例を使用して、これを議論してみましょう。
プロセスAがtestという名前のテーブルの特定の行を次のように変更することを例にとります。
Updateが行われた行の位置をDBMS_ROWIDパッケージを利用して取得します。
変更された行が配置されたブロックアドレスは、ファイル番号が1番、ブロック番号が55818番に該当します。この値を利用して、そのデータブロックを次のようにダンプすることができます。
ブロックダンプファイルの内容から、次のような事実を確認することができます。
(1) ITL(Interested Transaction List)に、行を変更したトランザクションがitl=0x01として登録されています。現在の状態は、まだコミットされていないアクティブ(Active)状態であり、したがってTXロックを獲得しています。Xid=0x0016.026.00003222ですが、この値を10進数に変換すると、USN=22、SLOT=38、SQN=12384となります。V$ TRANSACTIONビューで、現在のセッションに対応する情報を確認してみると、完全に一致することが確認できます。
(2) ITL情報ではLock=1ですが、これはTransactionによって変更されたローの数を意味します。また、まだコミットが実行されていないのでFlagには何の値も設定されていません。同じ理由でSCNもまだ割り当てられていません。Flagの値が「C」または「U」である場合には、コミットが行われたことを意味します。
(3) ITL情報のUBA(Undo Block Address)情報を利用して、現在のトランザクションが直近に使用した、UNDOブロックとUNDOレコードの位置を把握することができます。UBAは[UNDOブロックDBA+ Seq#+ Record#]になます。ロールバックを実行する場合は、この情報を利用します。
(4) block_row_dump領域での最初の行のlb値は0x1に設定されています。lbはLock Byteの略で、現在の行にロックをかけたITL番号をさします。1回ITLが現在行を変更したことを意味します。Lock byteの値は、実際にコミットが発生してもまとめ(Cleanout)られず、後でDelayed block cleanoutが発生したり、他のプロセスによってブロックが変更したりしたに場合にまとめられます。
一つ注意することは、最初の行を変更した1番のトランザクション(ITLに登録された)でコミットが行われたか否かは、実際には、UNDOセグメントヘッダのトランザクションテーブルを照会することで知ることができるということです。 Oracleは、コミットが行われた時、トランザクションによって変更されたすべてのデータブロックのITLについていちいちコミット処理をしていません。変更されたブロックのうち、現在のバッファキャッシュに上がってきているものの中で一部だけをコミット処理し、残りのブロックには、トランザクションに割り当てられた、UNDOセグメントヘッダのトランザクションテーブルスロットのみコミット処理を行います。このデータブロックは、後で別のセッションでスキャンされるとき、実際のCleanout処理がなされます。これらのメカニズムをdelayed block cleanoutと呼びます。したがって、現在、特定の行が別のトランザクションによって変更していることかどうかを完全に把握するには、ITL情報だけでなく、場合によっては、UNDO情報まで照会しなければなりません。
一時、オラクルの最大の利点の一つとして、低レベルロック(Row level lock)を挙げたことがあります。オラクルのRow level lockは、明示的に存在しているロックではなく、上記の情報が組み合わされて実装されている論理的なロックです。Oracleは、個々の行を誰が変更しているかのリストやメタ情報を個別に管理してはいません。行がが変更されたか否かの情報は、その行を直接アクセスした場合だけ知ることができます。Row level locが物理的に存在しないことを理解しなければなりません。Row level locは、[行の変更かどうか+行を変更したトランザクション情報(ITL)+UNDO領域のトランザクションテーブルスロット+ TXロック]の情報が組み合わされた一種の論理的なロックなのです。Row level locはかなり明確でありながら混乱される概念がありますが、これはほとんどの文書でTXロックをRow level locと表現しているからです。さらに、Oracleのマニュアルでもあいまいな表現で説明されています。Row level locは、TXロックを利用して実装されます。TXロック自体がRow level locではなく、様々な情報が組み合わされて、Row level locが実装されているのです。