ORA-31693 ORA-02354 ORA-01555 ORA-22924

  • Post author:
  • Post category:其他


在使用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 版权协议,转载请附上原文出处链接和本声明。