ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2009-03-05

オトコのぷちトリビア - WAL

データベースには、WAL = Write Ahead Log(ログ先行書き込み)というテクニックが利用されていることが多い。WALとは、テーブルスペースなどに存在する実際のテーブルデータに対して更新を反映するまえに、ログに更新の内容を書き込もうというものである。

事前にロギングを行う仕組みは全てWALと呼ばれる。MySQLで言えばInnoDBにおいてRedoログとして利用されるログもWALであるし、MySQL Clusterのディスクテーブル利用時のUndoログだってWALの一種である。現在開発中のストレージエンジンであるFalconやMaria(MyISAMにクラッシュリカバリやトランザクション機能をつけたもの)もWALを搭載する予定である。もちろんOracleやPostgreSQLなど他のRDBMSでもWALが搭載されている。

用途、つまりRedoなのかUndoなのかということに因らず、実データに更新を行う前にログに書き込む方式をWALというわけである。

WALがあれば、チェックポイント処理(どこまでデータファイルに書き込んだのかということを記録する処理)と組み合わせることで、万が一の障害時に役に立つ。

InnoDBでは、WALの中に更新の情報(Redoログ)とチェックポイント処理が行われたことが記録されている。従って、クラッシュした後などはデータファイルに対してチェックポイント処理が行われたあとのRedoログを適用することでクラッシュする寸前の状態まで回復させることができる。

MySQL ClusterではLCPとGCPという2つのチェックポイントが利用されている。LCPはある時点における全データの完全な状態を再現するためのチェックポイント処理であり、ある間隔ごとに行われる。インメモリ型テーブルのデータはLCPごとに全てディスクに書き出され、ディスクテーブルのデータはLCPが行われた時点でそれまでに適用された更新が全てディスクにフラッシュされていることが保証される。クラッシュが発生すると、インメモリ型テーブルのデータはLCPの時点まで逆戻りするが、ディスク上のデータはLCPより後に適用された更新も含んでいる。そこで、LCPが発生した時点まで逆戻りさせるためにUndoログが利用されるわけである。

GCPは連続的に行われるチェックポイント処理、つまり更新の内容をディスクに書き込む処理でRedoログに相当する。こちらはインメモリ型、ディスクテーブル共通の仕組みである。最後にLCPが行われた時点のデータに対してRedoログを適用することにより、クラッシュする直前の状態が再現されるわけである。MySQL Clusterのチェックポイント処理については、こちらを参照して欲しい。

WALの利用方法はデータベースの実装によって異なるが、WALのおかげでデータの一貫性や耐久性が保証されるわけである。

0 コメント:

コメントを投稿