在做数据库迁移时,使用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='
RETENTION
----------
900
我们看到保留时间显示为900秒(15分钟),与当前的UNDO_retention相同,但最大查询长度为16331秒。
创建LOB时,RETENTION的实际设置由UNDO_RETENTION当前的设置定义,这段时间不够长。
解决方法:
1. 修改当前数据库的UNDO_RETENTION 参数值:
2. 修改 LOB retention值 ,使其大于尺寸过小的保留参数
Table altered.
SQL> alter table
Table altered.
3. 再次查询lob保留情况,以验证更改是否已生效:
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> alter tablespace UNDOTBS1 add datafile '/oradata/undo02.dbf' size 100m autoextend on;