数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理
使用数据泵导出数据库数据时,发现如下错误提示:
ORA-31693:Tabledataobject"CAMS_CORE"."BP_EXCEPTION_LOG"failedtoload/unloadandisbeingskippedduetoerror:ORA-02354:errorinexporting/importingdataORA-01555:snapshottooold:rollbacksegmentnumberwithname""toosmallORA-22924:snapshottooold
1.查看表空间使用率
SELECTUPPER(F.TABLESPACE_NAME)AS"表空间名", D.TOT_GROOTTE_MBAS"表空间大小(M)", D.TOT_GROOTTE_MB-F.TOTAL_BYTESAS"已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB-F.TOTAL_BYTES)/D.TOT_GROOTTE_MB*100,2),'990.99')||'%'"使用比", F.TOTAL_BYTESAS"空闲空间(M)", F.MAX_BYTESAS"最大块(M)" FROM(SELECTTABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024),2)TOTAL_BYTES, ROUND(MAX(BYTES)/(1024*1024),2)MAX_BYTES FROMSYS.DBA_FREE_SPACE GROUPBYTABLESPACE_NAME)F, (SELECTDD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES)/(1024*1024),2)TOT_GROOTTE_MB FROMSYS.DBA_DATA_FILESDD GROUPBYDD.TABLESPACE_NAME)D WHERED.TABLESPACE_NAME=F.TABLESPACE_NAMEORDERBY1;
2.看到ORA-01555错误,还以为是经典错误,尝试调整undo_retention参数
SYS@cams>altersystemsetundo_retention=30000scope=both;
修改后再次导出,问题依旧存在,显然问题和undo_retention没关系,再把参数改回去。
3.猜测是表空间有问题,这里尝试对CAMS_CORE下的索引和LOB进行表空间迁移。
(1)新建新的表空间
(2)拼接表空间迁移语句,前面已有文章写到了表空间迁移方案
(3)执行表空间迁移语句
altertableCAMS_CORE.BP_EXCEPTION_LOGmovelob(EX_STACK)storeas(tablespacecams_core_lob);
执行到该语句的时候提示错误:
ORA-01555:快照过旧:回退段号(名称为"")过小ORA-22924:快照太旧
这里,问题应该比较明显了,有部分LOB数据有问题。
4.寻找问题解决方案(MOS)
使用关键字“expdp ORA-01555 ORA-22924 LOB”进行查找:
Export Fails With Errors ORA-2354 ORA-1555 ORA-22924 And How To Confirm LOB Segment Corruption Using Export Utility (文档 ID 833635.1)
5.参考MOS给出的解决方案,动手处理问题
setconcatoffcreatetablecorrupted_lob_data(corrupted_rowidrowid);setconcatoffdeclareerror_1555exception;pragmaexception_init(error_1555,-1555);numnumber;beginforcursor_lobin(selectrowidr,&&lob_columnfrom&table_owner.&table_with_lob)loopbeginnum:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw('889911'));exceptionwhenerror_1555theninsertintocorrupted_lob_datavalues(cursor_lob.r);commit;end;endloop;end;/Entervaluefortable_owner:EX_STACKEntervaluefortable_owner:CAMS_COREEntervaluefortable_with_lob:BP_EXCEPTION_LOGold6:forcursor_lobin(selectrowidr,&&lob_columnfrom&table_owner.&table_with_lob)loopnew6:forcursor_lobin(selectrowidr,EX_STACKfromCAMS_CORE.BP_EXCEPTION_LOG)loopold8:num:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw('889911'));new8:num:=dbms_lob.instr(cursor_lob.EX_STACK,hextoraw('889911'));PL/SQLproceduresuccessfullycompleted.
查看存在问题的数据记录:
select*fromCAMS_CORE.BP_EXCEPTION_LOGwhererowidin(select*fromCAMS_CORE.corrupted_lob_data);
确实存在3条数据,CLOB字段数据大小为,显然有问题。
MOS上给出的导出方案是将问题数据exclude掉,这里为了彻底解决问题,将3条数据导出为csv文件,然后删除。然后再次导出数据库数据,不再提示报错。
6.结合应用分析问题的由来。
根据有问题的数据,让开发人员去检查应用日志。检查时发现对应时间点的应用日志有残缺,不能继续往下分析。同时,根据问题发生的时间点,了解到当时工程师在给服务器做迁移,结果服务器强制重启(应用和数据库一起),导致了部分数据损坏。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。