web-dev-qa-db-ja.com

Oracle-単一のテーブルを復元する

大規模なデータベースでは、データをアップロードするアクティビティが実行されました。なんらかのミスにより、1か月分のデータが再度入力され、一時保持テーブルに残りました。したがって、これをカバーするために、別のマシンで復元されたバックアップから2つのテーブルのダンプを取得しました。エラーが発生し、バックアップから復元されたテーブルの名前を変更しました。しかし、テーブルが復元されたとき、同じ名前がすでに使用されているため、制約をロードできませんでした。 Oracle exp/impコマンドを使用して、データをエクスポートおよびインポートしました。

私はDBAではありませんが、この問題についてサポートが必要です。

4
user3141985

名前が変更されたテーブルの制約は保持されます。正しいデータを含むテーブルをインポートする前に、それらをドロップしてください。

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=nimpに追加します。

alter table t enable constraint c;

disableenableの間には挿入に関するチェックがないことに注意してください。制約に準拠しない行がある場合、enableは失敗します。古い状況と新しい状況の間に行が挿入された場合も同様です。

3
Marco

フラッシュバックを使用して、テーブルデータを元の状態に戻すことができます。

フラッシュバックは有効ですか?

データベースはアーカイブモードである必要があります。

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');

その他のフラッシュバックコマンド:

  • フラッシュバックデータベース=>を使用すると、データベース全体を過去の特定の時点に戻すことができます(フラッシュバックログ、db_flashback_retention_targetを使用)。
  • フラッシュバックドロップ=>では、誤って削除されたテーブルとインデックスを(ごみ箱を使用して)取得できます。
  • フラッシュバックテーブル=>を使用すると、(アンドゥデータを使用して)テーブルを過去のある時点にリカバリできます。
  • フラッシュバッククエリ=>を使用すると、(アンドゥデータを使用して)データ行をクエリして特定の時点に復元できます。

SCNを使用したフラッシュバックテーブルについては、次のリンクを参照してください。 https://Oracle-base.com/articles/10g/flashback-10g#flashback_table

6
Stringer

テーブルをフラッシュバックしてみてください

ALTER TABLE your_table  ENABLE ROW MOVEMENT;

FLASHBACK TABLE your_table TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' minute);
1
Bill N. Varelli