大規模なデータベースでは、データをアップロードするアクティビティが実行されました。なんらかのミスにより、1か月分のデータが再度入力され、一時保持テーブルに残りました。したがって、これをカバーするために、別のマシンで復元されたバックアップから2つのテーブルのダンプを取得しました。エラーが発生し、バックアップから復元されたテーブルの名前を変更しました。しかし、テーブルが復元されたとき、同じ名前がすでに使用されているため、制約をロードできませんでした。 Oracle exp/impコマンドを使用して、データをエクスポートおよびインポートしました。
私はDBAではありませんが、この問題についてサポートが必要です。
名前が変更されたテーブルの制約は保持されます。正しいデータを含むテーブルをインポートする前に、それらをドロップしてください。
alter table t1 drop constraint c;
間違ったデータを失いたくない場合は、別の方法もあります。 2つのテーブルに基づいて新しいテーブルを作成できます。
create table t1 as select * from t;
次に、制約を無効にして、テーブルt
の内容を削除する必要があります。これで、データをテーブルにインポートして、制約を有効にすることができます。
alter table t disable constraint c;
truncate table t;
ここで、「古い」テーブルt
をインポートし、制約エラーを無視します。エラーが不要な場合は、オプションconstraints=n
をimp
に追加します。
alter table t enable constraint c;
disable
とenable
の間には挿入に関するチェックがないことに注意してください。制約に準拠しない行がある場合、enable
は失敗します。古い状況と新しい状況の間に行が挿入された場合も同様です。
フラッシュバックを使用して、テーブルデータを元の状態に戻すことができます。
フラッシュバックは有効ですか?
データベースはアーカイブモードである必要があります。
select log_mode from v$database;
「ARCHIVEMODE」を返す必要があります
フラッシュバックが有効になっているかどうかを確認します。
select flashback_on from v$database;
「はい」を返す必要があります
「NO」の場合、次を実行してフラッシュバックを有効にできます。
alter database flashback on;
取り消し保持を確認します。
show parameter undo
デフォルトは900秒(15分)です。したがって、次のコマンドを使用して、テーブルを15分前にフラッシュバックできます。
Alter table t enable row movement ;
FLASHBACK TABLE t TO TIMESTAMP TO_TIMESTAMP ('2015-aug-11 12:00:00', 'YYYY-MON-DD HH24:MI:SS');
その他のフラッシュバックコマンド:
SCNを使用したフラッシュバックテーブルについては、次のリンクを参照してください。 https://Oracle-base.com/articles/10g/flashback-10g#flashback_table
テーブルをフラッシュバックしてみてください
ALTER TABLE your_table ENABLE ROW MOVEMENT;
FLASHBACK TABLE your_table TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' minute);