3

私は自分の仕事でひどい間違いをしました。「where」句なしでOracleテーブルに対して更新されたクエリを実行し、このテーブルのすべてが変更されました。テーブルのデータを復元する方法があるかどうか疑問に思いました。フラッシュバックを使用できることは知っていますが、それを行う別の方法はありますか?オラクルでフラッシュバックテーブルを作成する方法を知っている場合は、私に知らせてください。

Oracle 10gR210.2.0.1を使用しています

4

2 に答える 2

13

まず、変更をコミットしましたか?そうでない場合は、単にを発行し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システム特権が必要です。
于 2013-03-08T16:37:19.947 に答える
1

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;
于 2016-07-21T11:32:06.590 に答える