Oracle

Oracle 完整的 expdp/impdp 但跳過某些表中的數據

  • November 28, 2019

我正在嘗試導出模式然後導入它,但是有一些巨大的表我必須跳過其中的所有數據(也就是說,我需要表和與它們相關的所有東西,而不是行)。

所以我想我會做

1) expdp SCHEMAS=X CONTENT=METADATA_ONLY DUMPFILE=meta.dmp
2) exportSCHEMAS=X CONTENT=DATA_ONLY EXCLUDE=TABLE:"IN \('FOO','BAR'\)" DUMPFILE=data.dmp

然後

4) impdp SCHEMAS=X EXCLUDE=REF_CONSTRAINT DUMPFILE=meta.dmp
5) impdp SCHEMAS=X DUMPFILE=data.dmp

計劃是在第 4 步中獲取所有元數據,然後在第 5 步中導入所有數據,但大表 FOO 和 BAR 中的行除外,但是我怎樣才能獲取外鍵?

這是一種方法,還是有其他方法?

不,這不是一個好方法,有很多問題,例如

  1. 在創建索引後進行數據導入將大大減慢導入速度。
  2. 導入將觸發所有插入觸發器。這也可能會減慢導入速度,並且可能會產生不必要的副作用
  3. 序列的目前值與數據不匹配。

您應該使用QUERY 參數。所以如果你想排除APP模式的LOG和MESSAGE表添加

QUERY=APP.LOG:"where 0=1"
QUERY=APP.MESSAGE:"where 0=1"

到導出的參數文件。


完成此任務的另一種方法是將其拆分為兩個導出。這有點複雜,但避免了讀取表數據。

  1. 導出架構並排除大表。他的任務與兩張大桌子的大小無關
  2. 導出兩個大表的結構。此任務的時間也與兩個表的大小無關

第一次導出(帶數據的模式導出)

DUMPFILE=schema.dmp
SCHEMAS=APP
EXCLUDE=TABLE:"in ('LOG', 'MESSAGES')
CONTENT=ALL  # this is the default, so it must not be specified

第二次導出(沒有數據的表導出)

DUMPFILE=table.dmp
TABLES=APP.LOG,APP.MESSAGE
CONTENT=METADATA_ONLY

首先導入模式轉儲,然後導入表轉儲。對於這兩個導入,您都可以使用該FULL=Y參數。

進口方案:

DUMPFILE=schema.dmp
FULL=Y

表導入:

DUMPFILE=table.dmp
FULL=Y

在第 4 步中導入時,不要排除 REF_CONSTRAINTS,而是 IMPORT 包括約束在內的所有元數據,在第 5 步之前禁用約束並開始數據導入。

如果您只認為它不會影響您的數據庫以加快導入速度,您可能還需要禁用觸發器(如果有)。

希望這可以幫助 !!

引用自:https://dba.stackexchange.com/questions/171372