在使用expdp导出的时候报错:
ORA-31693:表数据对象“ <SCHEMA_NAME>”。“ <TABLE_NAME>”未能加载/卸载,并且由于错误而被跳过:
ORA-02354:导出/导入数据时出错
ORA-01555:快照太旧:回滚名称为“ <ROLLBACK_SEGMENT_NAME>”的段号154太小
ORA-22924:快照太旧
此时的导出是按用户导出,只有其中一张表有此报错并导出失败,其他均正常导出,所以当时就怀疑是否有LOB字段导致
一般从这么几个方面进行分析:
- 1、undo表空间使用率是否过高
- 2、undo_retention是否设置过小
- 3、表中是否有LOB字段,看一下表结构(desc table_name)
一、首先查询一下数据库undo表空间是否快被占满
#查看数据库表空间使用情况:
set linesize 160
set pagesize 9999
column tablespace_name format a20
select tablespace_name, count(*) fnt, round(sum(bytes)/1024/1024) size_mb, round(sum(maxbytes)/1024/1024) max_size_mb from dba_data_files group by tablespace_name;
但是查询结果显示undo表空间利用率并不高
二、查询undo_retention
#查询数据库中undo_retention大小:
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 86400
undo_tablespace string UNDOTBS2
#检查undo中最长查询时间:
SQL> select max(maxquerylen) from v$undostat;
MAX(MAXQUERYLEN)
----------------
26000
#按表查询retention:
SQL> select retention from dba_lobs where owner='<SCHEMA_NAME>' and table_name='<TABLE_NAME>';
RETENTION
----------
86400
#我这个库里面查询的结果显示retention值已经大于了undo最大查询时间,但是还是有问题报错,
#于是将retention参数在改大一点进行尝试
三、修改undo_retention与LOB字段保留参数
先使用
describe
查看一下表结构,是否有列字符串类型为
lob
字段
SQL> DESC TABLE_NAME;
1、修改undo_retention:
SQL> ALTER SYSTEM SET UNDO_RETENTION = 186400 scope=both sid='*';
2、修改LOB retention,使其大于“过小保留”参数
#LOB字段有自己的retention,虽然已经全局修改了undo_retention但是LOB字段还是更改单独设置
SQL> alter table <SCHEMA_NAME>.<TABLE_NAME> modify lob(<LOB_COLUMN_NAME>) (pctversion 5);
SQL> alter table <SCHEMA_NAME>.<TABLE_NAME> modify lob(<LOB_COLUMN_NAME>) (retention);
3、修改后再次查询lob保留,以验证更改已经生效:
SQL> select retention from dba_lobs where owner='<SCHEMA_NAME>' and table_name='<TABLE_NAME>';
RETENTION
----------
186400
问题解决,执行导出,又有了新的报错:
ORA-02354
,
ORA-01466
,
ORA-31693
因为之前对表中LOB字段进行了操作(DDL操作),就相当于改变了表结构,所以这时候还用之前获取数据库的scn号已经失效,需要重新获取
#获取数据库scn,下边的是查询数据库长事务的scn号,一般那个小用哪个
set linesize 200
col current_scn for 99999999999999999999
col start_scn for 99999999999999999999
select 'exp_scn' item, current_scn ||' scn' value from v$database
union all
select 'Min_start_scn' item,min(start_scn)||' scn' value from gv$transaction;
再次执行expdp导出命令即可正常运行数据泵导出数据
#查看数据泵任务状态详情的信息(job_name为你编辑导出文件脚本中,job_name的名字)
expdp \'/ as sysdba\' attach=job_name
至此结束,有什么问题欢迎结束。
详情参阅官方文档ID 1507116.1
版权声明:本文为ly7472712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。