★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

第62章 汎用WALレコード

組み込みのWALにログを書き込むすべてのモジュールは、それぞれに独自の型のWALレコードがありますが、ページへの変更を汎用的な方法で記述する汎用WALレコード型もあります。 カスタムアクセスメソッドを提供する拡張では、独自のWALの再実行(redo)ルーチンを登録できないため、汎用WALレコードが役立ちます。

汎用WALレコードを構築するためのAPIはaccess/generic_xlog.hに定義されており、access/transam/generic_xlog.cで実装されています。

汎用WALレコードの機能を使ってWAL書き込みを伴うデータ更新を行うには、以下の手順に従ってください。

  1. state = GenericXLogStart(relation) により、指定のリレーションについての汎用WALレコードの構築を開始します。

  2. page = GenericXLogRegisterBuffer(state, buffer, flags) により、現在の汎用WALレコード内で更新されるバッファを登録します。 この関数はバッファページの一時コピーへのポインタを返すので、更新はそれに対して行ってください。 (バッファの内容は直接更新しないでください。) 3番目の引数は、操作についてのフラグのビットマスクです。 現在のところ、使用できるフラグはGENERIC_XLOG_FULL_IMAGEのみで、これはWALレコードには変更の差分ではなく、ページ全体のイメージが含まれることを示します。 典型的には、このフラグはページが新しいか、あるいは完全に書き換えられるときにセットされます。 WAL書き込み対象の動作が複数のページを更新する必要がある場合は、GenericXLogRegisterBufferを繰り返すことができます。

  3. 前の手順で取得したページのイメージに更新を適用する。

  4. GenericXLogFinish(state)により、バッファの変更を適用し、汎用WALレコードを送出する。

WALレコードの構築は、上記の手順内の間のどこででも、GenericXLogAbort(state)を呼び出すことで中止できます。 これによりページイメージのコピーに対する変更はすべて廃棄されます。

汎用WALレコードの機能を使うときは、以下の点に注意してください。