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

在使用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-02354ORA-01466ORA-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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值