web-dev-qa-db-ja.com

PostgreSQLで更新をロールバックする方法

端末でsqlを使用して(ubuntu lucidで)PostgreSQLデータベースのいくつかのレコードを編集しているときに、間違った更新を行いました。

の代わりに -

update mytable set start_time='13:06:00' where id=123;

入力した-

update mytable set start_time='13:06:00';

したがって、すべてのレコードは同じstart_time値を持っています。

この変更を元に戻す方法はありますか?テーブルには500以上のレコードがありますが、各レコードのstart_time値はわかりません

それは永遠に失われますか?

17
damon

すでにコミットされているトランザクションだと思いますか?もしそうなら、それが「コミット」が意味することであり、あなたは戻ることができません。

運が良ければ、一部のデータは回復可能です。今すぐデータベースを停止します。

これは前に同じトピックについて書いた答えです 。お役に立てば幸いです。

これも可能性があります: postgresqlで削除された削除済み行

データが絶対に重要でない限り、バックアップから復元するだけで、はるかに簡単で痛みも少なくなります。バックアップがなかった場合は、しっかりと考えてみてください。

10
Craig Ringer

間違いを見つけて、データベースを使用しているアプリケーションをすぐに停止してオフラインにした場合、ポイントインタイムリカバリ(PITR)を使用して、先までの書き込みログ(WAL)ファイルを再生できます。誤った取引が行われた瞬間。これにより、データベースは以前の状態に戻り、トランザクションを効果的に「取り消す」ことができます。

本番アプリケーションデータベースへのアプローチとしては明らかな制限がいくつかありますが、特に重要なデータの損失が発生した場合は、PITRが最良のオプションである場合があります。ただし、破損イベントの前にアーカイブがまだ構成されていなかった場合は、意味がありません。

https://www.postgresql.org/docs/current/static/continuous-archiving.html

他のリレーショナルデータベースエンジンにも同様の機能があります。

1
hemp