お客様からのお問い合わせで、誤ってデータが消えてしまったのでバックアップから復旧できませんか?と問い合わせがありました。
幸いデイリーで毎日0時にdumpバックアップを取っていたので、ここから復旧することにします。
しかし、該当のテーブルをすべて戻してしまうと、他のお客さんのデータが巻き戻ってしまいます。
そこで一部のデータだけ差分で復旧出来ないか調べたところ以下の方法で復旧できました。
バックアップ複製用のDB作成
(リストア時にパラメータを指定して作ることも出来るみたいです)
cratedb mainDB_20170211
バックアップファイルからリストアします
pg_restore -d mainDB_20170211 backup_dump
中身が入っていることを確認します。
(今回はhogehogeテーブルの id = 1000とします)
select * from hogehoge where id = 1000)
コピーコマンドで該当データだけ、ファイルに抽出します。
copy (select * from hogehoge where id = 1000) TO '/temp/1000_restore.csv';
vimで抽出したファイルの先頭に以下を追加します。
COPY "hogehoge(テーブル名)" FROM stdin;
ファイルの最後に
\.
を付けて保存。
本番dbをバックアップ
pg_dump -Fc mainDB > mainDB_20170201.dump
mainDBに入ってID 1000を消します。
psql mainDB begin; delete from hogehoge where id = 1300 ; commit;
DBから抜けて、SQL流し込みます
psql mainDB < 1000_restore.csv
以上
この記事をシェアする