Oracle

執行 expdp 命令時遇到“快照太舊”錯誤

  • May 21, 2021

在我的生產數據庫中執行 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_timeor flashback_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)
  • 數據泵導出

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