PostgreSQL
15.3について学んでいます。Oracle専門でやってきていたので、PostgreSQLではどのような障害パターンが起こりやすいものなのか想像しづらい部分がありますので教えてください。現在私は、バックアップ／リカバリ方法について学んでいるところです。

  1. pg_dumpとpsql

最初にこれを覚えました。OracleでいえばDataPumpに似ていると思いました。論理レベルでデータを退避させておいて、何かあったらpsqlコマンドで戻すことになるわけですね？バックアップ／リストアと言えなくもないですが、単純なエクスポート／インポートに思えます。データ移行にはよいかもしれませんが、psqlコマンドでダンプをインポートするまでの間、更新があったらどうリカバリしたらよいのでしょうか？また、戻さなければいけないデータが存在しながらも、消したくない更新データが入ってきてしまっていたとしたら、ダンプをインポートすることで消してしまう恐れはありませんか？

  2. pg_basebackup

実行して驚きましたが、cpコマンドでコピーを取っただけのようなデータベースクラスタの物理的なコピーが作成されました。つまり、このコマンドで取得したバックアップを使う時となると、OSコマンドで物理的にファイルやディレクトリを削除したとか、そんな感じのときでしょうか？

  3. recovery.conf

私がネットで拝見する記事が古いのでよくこのファイルが登場しますが、これは現在のpostgresql.confファイルのrestore_commandパラメータに該当すると考えてよいですか？例えば、データベースクラスタの中身をOSコマンドで全削除されて(なかなかあり得ない)、pg_basebackupコマンドで取得しておいた物理ファイル、ディレクトリをリストアしました。そうしたら、restore_commandをちゃんと設定していれば、DB再起動とともにアーカイブログが適用されていくみたいな仕組みですか？
CC BY-SA 4.0
2023-08-08T12:06:35.613
95892
2023-08-15T15:03:55.113
2023-08-08T15:01:23.820
3060
44175
question
postgresql
PostgreSQLの障害ケースについて
> pg_dumpとpsql  
>
> バックアップ／リストアと言えなくもないですが、単純なエクスポート／インポートに思えます。データ移行にはよいかもしれませんが、psqlコマンドでダンプをインポートするまでの間、更新があったらどうリカバリしたらよいのでしょうか？また、戻さなければいけないデータが存在しながらも、消したくない更新データが入ってきてしまっていたとしたら、ダンプをインポートすることで消してしまう恐れはありませんか？

逆に疑問なのですが、Oracleはそういう都合のいい処理をよしなにしてくれるのでしょうか。ダンプ(いわゆる論理バックアップ)からの復旧でそんなことが自然にできるはず、とは普通は考えないと思います。あなたが(勝手に)想定したシナリオに適合しないからといってバックアップではないということにはなりません。目的に対して誤った手段を選択している方の問題です。

> pg_basebackup  
>
> 実行して驚きましたが、cpコマンドでコピーを取っただけのようなデータベースクラスタの物理的なコピーが作成されました。つまり、このコマンドで取得したバックアップを使う時となると、OSコマンドで物理的にファイルやディレクトリを削除したとか、そんな感じのときでしょうか？

逆になぜそういう特化した状況でしか使えないと思ってしまったのかが不思議です。誤削除からのリストアに使えるのであれば、大抵のシナリオでもリストアに使えると考えるのが普通だと思いますが。

> recovery.conf  
>
> 私がネットで拝見する記事が古いのでよくこのファイルが登場しますが、これは現在のpostgresql.confファイルのrestore_commandパラメータに該当すると考えてよいですか？

正確には、recovery.confが廃止されてその設定項目が本体に移動したという話です。

> 例えば、データベースクラスタの中身をOSコマンドで全削除されて(なかなかあり得ない)、

pg_basebackupのところに書いたとおり、なぜこういう限定された状況しか出てこないのかが不思議です。

>
> pg_basebackupコマンドで取得しておいた物理ファイル、ディレクトリをリストアしました。そうしたら、restore_commandをちゃんと設定していれば、DB再起動とともにアーカイブログが適用されていくみたいな仕組みですか？

前提として`archive_command`でWALがアーカイブされていることが必要です。障害でWALが失われているのに`restore_command`を指定しても無意味です。

WALが保存されていれば、`restore_command`を使用せずに別途データディレクトリにコピーすることでリストアすることもできます。

前後しますが、こういう疑問を持たれた根本は

> Oracle専門でやってきていた

とかPostgreSQLの知識不足ではなくて、バックアップ&リストアについての一般的な考え方がどこかずれてることのような気がします。
CC BY-SA 4.0
2023-08-15T15:03:55.113
95948
2023-08-15T15:03:55.113
5793
95892
answer