Oracle expdp过程中的ORA-31693、ORA-02354和ORA-01555


问题:
expdp 导出一个存照片的表,表的的字段是clob,导了再天最报报以下错误:

ORA-31693: Table data object "BUSI"."CUST_INFO_PHOTO" 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 209 with name "_SYSSMU209$" too small

当用这个备份文件在另个库导入这张表时,导的是空表,数据没有导不进去

原因:导出表的过程中有人修改了表,所以导至undo空间不够用并覆盖了过了保留时间的段。
参考:http://blog.itpub.net/22969361/viewspace-1172885/

解决办法:
一. 导这张表时,把表设成只读不让修改

二.调大undo的保留时间, 其实这个调大也没用,该不够还是不够

1.查看undo的保留时间
show parameter undo_retention

--查看retention是noguarantee的
select tablespace_name,block_size,extent_management , segment_space_management,contents,retention  from dba_tablespaces; 

Oracle 10g之后,oracle提出了一个特性就是undo的guarantee,可以强制oracle来guarantee的undo信息,也就说如果一个session的transaction DML需要undo空间的时候,即使undo的空间不足,这个session也不会强制覆盖由undo_retention所保护的undo信息,那么这个transaction DML会因为undo空间的不足会而report一个error并自动退出。由于我们的retention默认是noguarantee的,所以transaction DML就会忽略这种retention的时间限制直接回绕覆盖我们的undo信息,这种结果下其实在很多情况下是不希望得到的。

 

--在Oracle10g中修改guarantee模式, 但一般能不改就不改,除非必须
alter tablespace undotbs1(还原表名) retention guarantee;

 

2. rac下修改,两台主机要改成一样的参数
sid 为实例名
select instance_name from V$instance;

--rac下用sid='*'意思是两台主机都运行,不带sid也是全局执行
alter system set undo_retention=18000 sid='*';

注意:最好要两台主机上都运行,否则库可能重启不成功

总结:
1. 导表时把表设成只读,不要被人修改 (首选,不行再进行第二步)
2. 调大undo空间,这个undo_retention调大应该没什么用。空间大了才不会被覆盖。

参考:
https://blog.csdn.net/Lijun_blue/article/details/7239385?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=5fb36aa7-8bf5-4b59-9f15-9512377bf5f4&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

posted @ 2021-02-28 15:50  莫让年华付水流  阅读(1469)  评论(0编辑  收藏  举报