今回は、Goldの「障害復旧 - トランザクションログ復旧」からの出題です。
pg_xact領域のファイルをすべて削除し、PostgreSQLを再起動する
PostgreSQLを起動したまま、環境変数PGDATAにデータベースクラスタ領域を指定してpg_resetwalを実行する
PostgreSQLを停止し、コマンドラインでデータベースクラスタ領域を指定してpg_resetwalを実行後にPostgreSQLを起動する
pg_controldataファイルを削除し、PostgreSQLを再起動する
pg_resetwalの-xオプションで次のトランザクションIDを指定する場合は、pg_xactディレクトリ内のファイル名で最も大きな数字に1を加えて、1048576で乗算した値を用いる
※この例題は実際のOSS-DB技術者認定試験とは異なります。
PostgreSQLには、WALファイルの破損で起動できない場合に備えて、pg_resetwalユーティリティが備わっています。
WALファイルの復旧では、PostgreSQLのファイルを直接操作するのではなく、pg_resetwalを用いるべきです。【選択肢A、Dと異なる】
pg_resetwalは、PostgreSQLの起動中には実行されません。【選択肢Bと異なり、選択肢Cに該当】
また、pg_resetwalの実行は、PostgreSQLの管理者ユーザのみが行えます。
これは、pg_resetwalの操作にはデータベースクラスタ配下への読み込み/書き込み権限が必要となるためです。
なお、データベースクラスタはコマンドラインで指定する必要があります。
ほかのユーティリティ(psqlなど)とは異なりPGDATA環境変数では指定できません。【選択肢Cに該当】
pg_resetwalがpg_controlから適切な値を読み込めない場合には、-o、-x 等のオプションを使用して、適切な値を指定できます。
例えば、-o、-xの各オプションはそれぞれ「次のOID」、「次のトランザクションID」を指定できます。
-xオプション(次のトランザクションID)の適切な値は、データディレクトリ配下のpg_xactディレクトリ内で最も大きな数字を持つファイル名を探すことで決定することができます。
その値に1を加え、1048576で乗算します。
pg_xactディレクトリのファイル名は16進数で表されているので、16進数で算出すると簡単です。
つまり、1(16進数)を加えた後、後ろにゼロを5つ付けるだけです(16進数で後ろにゼロを5つ付けると1048576で乗算したことになります)。
例えば、0011がpg_xactで最も大きなエントリであれば、-x 0x1200000となります。
【選択肢Eに該当】
選択肢A, Dは、PostgreSQLのファイルを直接操作しているため誤りです。
選択肢Bは、pg_resetwalを、PostgreSQLを停止せずに実行しており、またPGDATA環境変数でデータベースクラスタを指定しているため誤りです。
選択肢C, Eは正しいです。
正解は C と E です。
※PostgreSQLバージョン10で、pg_resetxlogコマンドがpg_resetwalに、pg_clogおよびpg_xlogディレクトリがpg_xactおよびpg_walに名前が変わりました。バージョン9.6以前のマニュアルや環境を参照する場合にはご注意ください。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.