私は自分の仕事でひどい間違いをしました。「where」句なしでOracleテーブルに対して更新されたクエリを実行し、このテーブルのすべてが変更されました。テーブルのデータを復元する方法があるかどうか疑問に思いました。フラッシュバックを使用できることは知っていますが、それを行う別の方法はありますか?オラクルでフラッシュバックテーブルを作成する方法を知っている場合は、私に知らせてください。
Oracle 10gR210.2.0.1を使用しています
まず、変更をコミットしましたか?そうでない場合は、単にを発行しrollback
て変更を元に戻すことができます。
変更をコミットしたとすると、他のユーザーが同時にテーブルを変更していますか?他の人が行った変更を保持し、トランザクションで行った変更のみを元に戻す必要がありますか?または、変更が行われる前の時点にテーブル全体を復元できますか?
テーブル全体をある時点に復元できる場合
FLASHBACK TABLE <<table name>>
TO TIMESTAMP( systimestamp - interval '10' minute )
必要なものが引き続き利用可能であると想定して、テーブルを10分前の状態に戻しUNDO
ます(したがって、ミスを犯した後、そのミスをフラッシュバックできるようになるまでの時間は限られています)。を発行するFLASHBACK TABLE
には、次のことも確認する必要があります。
ALTER TABLE <<table name>> ENABLE ROW MOVEMENT
FLASHBACK
テーブルに対する特権またはFLASHBACK ANY TABLE
システム特権が必要です。Oracle9i R2 以降、特定の権限は必要ありません
更新された列を元に戻す
update <table> t
set (<column1>, <column2>, ...)
= (select <column1>, <column2>, ...
from <table> as of timestamp to_timestamp('2016-07-21 09:39:20', 'YYYY-MM-DD HH:MI:SS') h
where t.<uk> = h.<uk>);
削除された行を元に戻す
insert into <table>
select * from <table> as of timestamp to_timestamp('2016-07-21 03:30:00', 'YYYY-MM-DD HH:MI:SS')
where <uk> not in
(select t.<uk> from <table> t);
DB タイムゾーンに惑わされず、現在時刻を確認してください
select sysdate from dual;