執行 expdp 命令時遇到“快照太舊”錯誤
在我的生產數據庫中執行 expdp 命令時遇到問題。(Windows 環境中的 Oracle 11g)
cmd> expdp ‘sys/123@PROD as sysdba’ DUMPFILE=BACKUP_02082017_BACKUP.dmp LOGFILE=BakupLog_02082017_BACKUP.log SCHEMAS=A1,B2,C3,D4.. exclude=統計一致=y
導出大小為 7GB 的數據庫需要 1 天多的時間。但我的問題是導出有錯誤並顯示錯誤消息
ORA-31693: 表數據對象 “owner”.“PASSWORD_HISTORY” 載入/解除安裝失敗並且由於錯誤被跳過: ORA-02354: 導出/導入數據時出錯 ORA-01555: 快照太舊: 回滾段號 19名稱“_SYSSMU19_255734752$”太小
當我將我的保留策略從預設的 900 設置為 16500 時。即使發生了同樣的錯誤。
因為我計劃將保留策略增加到 10 小時,即 36000。它可行嗎?我很困惑我的撤消表空間是否能夠做到這一點?
提供更多細節:
> show parameter undo_%; NAME TYPE VALUE -------------------------------------------------- ----------- -------- undo_management string AUTO undo_retention integer 16500 undo_tablespace string UNDOTBS1 > select file_name,tablespace_name,trunc(bytes/1024/1024) mb, trunc(maxbytes/1024/1024) mm FROM dba_data_files where tablespace_name = 'UNDOTBS1'; FILE_NAME TABLESPACE_NAME MB MM -------------------------------------------------------------------- C:\APP\ADMIN\ORADATA\PROD\UNDOTBS01.DBF UNDOTBS1 5630 32767 >Size of undo with current undo_retention : Actual Undo size[MBytes]:5630 UNDO retention[Sec]:16500 Needed Undo Size[MBytes]:909.433359
我被這個問題困住了。任何人請建議我如何處理這個錯誤?
提前致謝。
ORA-01555
錯誤的原因是undo_retention
與使用參數完成導出所需的時間相比,參數的值較低consistent=y
(在 11g 中已棄用,應使用flashback_time
orflashback_scn
)。您的撤消保留應該能夠保留導出作業期間的撤消資訊。
例如,如果您導出開始於
00:00 AM
並且需要 2 小時才能完成,那麼undo_retention
如果您希望獲得一致的數據,則應該設置至少 2 小時。我已經在我的測試伺服器中模擬了這個問題。
[oracle@orcl expdp_dump]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Feb 8 09:41:40 2017 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> show parameter undo NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 2400 undo_tablespace string UNDOTBS1
我的撤消保留時間設置為 40 分鐘。
SQL> select bytes/1024/1024 from v$datafile where ts#=2; BYTES/1024/1024 --------------- 32764
我的撤消表空間是 32GB 大。
我試圖導出我的一個模式。
expdp system/password directory=DP_DIR schemas=MYSCHEMA dumpfile=expdp_orcl_MYSCHEMA.dmp logfile=expdp_orcl_MYSCHEMA.log FLASHBACK_TIME=SYSTIMESTAMP
作業“SYSTEM”。“SYS_EXPORT_SCHEMA_07”在 2017 年 2 月 7 日星期二 22:14:46 已完成 0 01:14:39 時出現 1 個錯誤
花了1小時14分鐘。並且在數據庫中有適度的 DML 操作。
ORA-31693: Table data object "MYSCHEMA"."MS_TABLE":"MS_TABLE."MS_TABLE_B_2005" failed to load/unload and is being skipped due to error: ORA-02354: error in exporting/importing data ORA-01555: snapshot too old: rollback segment number 84 with name "_SYSSMU84_1745672109$" too small . . exported "MYSCHEMA"."PRORATE_EVENT" 8.789 KB 4 rows . . exported "MYSCHEMA"."PRORATE_RULE_GROUP" 5.945 KB 1 rows . . exported "MYSCHEMA"."ORACLE_JOB_METADATA" 0 KB 0 rows
我得到了
ORA-0155
錯誤。然後我將撤消保留時間增加到 1 小時 20 分鐘。
SQL> alter system set undo_retention=4800; System altered.
我再次嘗試導出架構。
expdp system/password directory=DP_DIR schemas=MYSCHEMA dumpfile=expdp_orcl_MYSCHEMA.dmp logfile=expdp_orcl_MYSCHEMA.log FLASHBACK_TIME=SYSTIMESTAMP
作業“SYSTEM”。“SYS_EXPORT_SCHEMA_07”已於 2017 年 2 月 8 日星期三 22:15:52 成功完成 0 01:15:45。
而且再也沒有
ORA-01555
了。使用 BLOCKS 方法的總估計:182.9 GB
實際文件大小為 141 GB。
為什麼轉儲文件的估計和實際大小有差異?看看這個文章就知道答案了。
關於完成導出所需的時間。嘗試使用以下參數。
- 平行線
- 直接=y
此外,在開始導出作業之前嘗試收集數據字典統計資訊 -
SQL> connect / as sysdba SQL> exec dbms_stats.gather_dictionary_stats; SQL> exec dbms_stats.lock_table_stats (null,'X$KCCLH'); SQL> exec dbms_stats.gather_fixed_objects_stats;
進一步閱讀:
- 大型數據庫上的 DataPump 導出性能不佳(文件 ID 473423.1)
- 數據泵導出