第8期 expdp ORA-31693 ORA-02354 ORA-01555

在做数据库迁移时,使用expdp导出数据库时,如果数据库表比较大,数据变更比较频繁,在导出时经常会遇到如下的错误。

Export: Release 19.0.0.0.0 - Production on Sat Aug 3 21:00:01 2024

Version 19.9.0.0.0


Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

;;; 

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Starting "SYS"."SYS_EXPORT_SCHEMA_01":  "/******** AS SYSDBA" directory=DATA_PUMP_DIR dumpfile=hr7_20240803210001.dump logfile=hr7_20240803210001.log schemas=hr COMPRESSION=all 

Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS

Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

Processing object type SCHEMA_EXPORT/STATISTICS/MARKER

Processing object type SCHEMA_EXPORT/USER

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/DB_LINK

Processing object type SCHEMA_EXPORT/TYPE/TYPE_SPEC

Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE

Processing object type SCHEMA_EXPORT/TABLE/TABLE

Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT

Processing object type SCHEMA_EXPORT/TABLE/COMMENT

Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION

Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE

Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION

Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE

Processing object type SCHEMA_EXPORT/VIEW/VIEW

Processing object type SCHEMA_EXPORT/VIEW/GRANT/OWNER_GRANT/OBJECT_GRANT

Processing object type SCHEMA_EXPORT/TYPE/TYPE_BODY

Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

Processing object type SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_INDEX/INDEX

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/TRIGGER

ORA-31693: Table data object "HR"."H_RETS" 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 5 with name "_SYSSMU5_4196806562$" too small

一般遇到这种情况,有两种情况,一种是表确实非常大,100,200GB,并且这个表数据变更比较频繁。另一种情况就是,表有 LOB的,undo_retention定义的时间不准确,因此有 ORA-01555: snapshot too old: rollback segment number 5 with name "_SYSSMU5_4196806562$" too small的错误。


SQL> show parameter undo;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

SQL> select max(maxquerylen) from v$undostat;

MAX(MAXQUERYLEN)

----------------

16331

SQL> select retention from dba_lobs where owner='' and table_name='';

RETENTION

----------

900


我们看到保留时间显示为900秒(15分钟),与当前的UNDO_retention相同,但最大查询长度为16331秒。

创建LOB时,RETENTION的实际设置由UNDO_RETENTION当前的设置定义,这段时间不够长。

解决方法:

1. 修改当前数据库的UNDO_RETENTION 参数值:

SQL>ALTER SYSTEM SET UNDO_RETENTION = 16500 scope=both sid='*';


2. 修改 LOB retention值 ,使其大于尺寸过小的保留参数

SQL> alter table . modify lob() (pctversion 5);
Table altered.

SQL> alter table . modify lob() (retention);
Table altered.


3.  再次查询lob保留情况,以验证更改是否已生效:


SQL> select retention from dba_lobs where owner='' and table_name='';

RETENTION
----------
16500


4. 再次执行导出。

另一种情况,当读取的一致性映像在撤消表空间中不可用时,会报告ORA-1555错误。当撤消记录没有保留足够的时间(即Undo_RETENTION设置不足)和/或撤消表空间中没有足够的空间在所需的时间内保留撤消记录时,就会发生这种情况。

解决方案:

1) 第一步是确保在导出的整个过程中保留读取的一致图像。增加UNDO_RETENTION参数,以覆盖导出的整个持续时间和/或高于flashback_time或flashback_scn指定的持续时间,直到导出操作结束。

SQL>  select max(maxquerylen) from v$undostat;

MAX(MAXQUERYLEN)

----------------

16331

SQL> show parameter UNDO_RETENTION

SQL> alter system set UNDO_RETENTION=


如果使用FLASHBACK_TIME或FLASHBACK_SCN参数调用EXPDP,请注意。完成导出操作后,您可以将其还原为原始值。


2) 增加undo表空间大小,使其可以在增加的Undo_RETENTION持续时间内保留撤消记录。

SQL> SELECT 'The Required undo tablespace size using Statistics In Memory is ' || dbms_undo_adv.required_undo_size() || ' MB' required_undo_size FROM dual;


SQL>  alter tablespace UNDOTBS1 add datafile '/oradata/undo02.dbf' size 100m autoextend on;



请使用浏览器的分享功能分享到微信等