障害にもいろいろあるよね:ハードウェアの故障、停電、コードのバグ、あるいは「なんか古いの消しとくか」って適当にDBを消しちゃううっかり管理者の手違いとか。こういう時、バックアップとちゃんと練習した復元プロセスがまさに「魔法の杖」になるんだ。
じゃあ、IKEAの家具を組み立てるみたいに、パニックにならずに手順通り復元プロセスを見ていこう!
ステップ1. 障害の原因を分析する
いきなり全力でデータを復元しに走る前に、何が起きたのかちゃんと把握しよう。
アプリケーションエラー?それともDBのエラー?
アプリやPostgreSQLのログをチェックしよう(たいてい/var/log/postgresql/とか、OSによって似たようなディレクトリにある)。エラーのサインを探してみて。ハードウェアの故障?
もしサーバーが物理的に壊れてる(例えばHDDのトラブルとか)なら、まずハードがちゃんと動くか確認しよう。ディスクが壊れてたら、別のディスクをつないでそこから全部復元しよう。ネットワークやアクセスの問題?
もし障害がネットワーク由来なら、サーバー自体は今のところ復元作業は必要ないかも。ヒューマンエラー:
正直に言って...誰かDROP DATABASEやっちゃった?もしそうなら、まだバックアップからデータを復元できるチャンスはあるよ。
障害の原因を正確に理解することで、今後同じことを防げるからね。
ステップ2. バックアップの有無を確認する
さあ、ちゃんとしたバックアップがあるか確認しよう。pg_dumpやpg_basebackupで作った最新のDBバックアップを探して、整合性をチェック!やり方を忘れた人のために、簡単におさらい:
ls -lコマンドでファイルサイズを確認。サイズがやけに小さいときは要注意。fileコマンドでファイルの中身をチェック。例えば:
SQLダンプだって分かる情報が出てくるはず。file backup_file.sql
tarアーカイブなら、ちゃんと展開できるかも確認しよう:
tar -tf backup.tar
エラーが出なければOK!次に進もう。
ステップ3. PostgreSQLを停止する
復元を始める前に、PostgreSQLサーバーを止めて安全に作業しよう。サーバー管理者で次のコマンドを実行:
sudo systemctl stop postgresql
DBを止めておけば、他のプロセスが復元を邪魔しないよ。
ステップ4. 復元用の新しいDBを用意する
もしDBが完全に消えた・壊れた場合は、まず新しく作り直そう。コマンド例:
createdb -U postgres new_database
new_databaseは自分のDB名に変えてね。
ステップ5. バックアップから復元する
主な復元シナリオは2つあるよ:
SQLバックアップ(
pg_dump)の場合:
復元はこのコマンドでOKpsql -U username -d new_database -f backup_file.sql
username— PostgreSQLのユーザー名new_database— データをインポートするDB名backup_file.sql— バックアップファイル名
- バイナリバックアップ(
pg_basebackupやpg_dumpのcustom形式)の場合:
復元はこうやってやる:
これらのバックアップはテキストじゃなくて「パックされた」データだから注意!pg_restore -U username -d new_database backup_file.dump
さらに:
- データだけ復元したいなら
--data-onlyを使おう。 - 構造だけ復元したいなら
--schema-onlyを追加しよう。
ステップ6. PostgreSQLを起動してテストする
復元コマンドを実行したら、サーバーを起動しよう:
sudo systemctl start postgresql
次はテストだよ。psqlやpgAdminで復元したDBに接続して、いくつかSELECTしてデータがちゃんと入ってるか確認しよう:
SELECT * FROM your_table_name LIMIT 10;
問題なさそうなら、おめでとう!データ復元完了!
ステップ7. データの整合性チェック
復元後はデータが壊れてないかも確認しよう。例えば:
テーブルの行数をバックアップと比較する:
SELECT COUNT(*) FROM your_table_name;バックアップの記録と比べてみて。
チェックサムを使う:
もし前もってテーブルのチェックサムを作ってたなら、今こそ照合しよう:md5sum backup_file.sqlテーブル間のリレーションを確認:
復元したFOREIGN KEYがちゃんと動いてるかもチェックしよう。
ステップ8. アプリケーションのテスト
最後に、このDBを使ってるアプリがちゃんと動くかも確認しよう。主要な操作をざっと試して、エラーがないか、表示が正しいかチェック!
実際の復元エラー例
じゃあ、いくつかケースを見て、どうやってトラブルを避けるか紹介するね:
PostgreSQLバージョンの不一致。
例えばバージョン12でバックアップを取って、サーバーが15にアップグレードされてたら、復元時にエラーが出るよ。
解決策: バックアップを作ったのと同じバージョンのPostgreSQLを使うか、互換性については公式ドキュメントをチェック:PostgreSQL Documentation。壊れたバックアップ。
バックアップが壊れてたら、一部データが失われることも。
解決策: バックアップの複製(例えば複数バージョンを保存)を使おう。特定テーブルの復元エラー。
特定のテーブルだけ復元しようとして、他の依存(例えば外部キー)がなかったら、エラーで止まることも。
解決策: テーブルは必ず親テーブルから順番に復元しよう。
GO TO FULL VERSION