oracle expdp/exp ora-600/ora-39014报错处理( 三 )

oracle expdp/exp ora-600/ora-39014报错处理
文章插图
首先第一感觉就是BUG,因为oracle版本太旧了,但是我还是尝试用其他办法处理,尽量不升级,毕竟不是所有环境都能升级,有些废弃的环境也完全不需要升级 。
我尝试用exp导出

oracle expdp/exp ora-600/ora-39014报错处理

文章插图
导出失败,但是我以外的发现有提到统计信息的导出失败,所以我加上 statistics=none,再次用exp 导出也不行 。我觉得不要所有报错提升都去看support,应该培养自己的正确思维方式,然后我想既然跟统计信息有关,干脆试一下用expdp 导出,互虐统计信息再试一下,expdp 加上参数 EXCLUDE=STATISTICS  然后神奇的一幕发生了,可以导出,并且没有报错 。
oracle expdp/exp ora-600/ora-39014报错处理

文章插图
后面用support 查看到Doc ID 1982596.1
果然是BUG,Bug 11656163 ,是由于有大文件对象,超过4G,在(11.2.0.3,12.1.0.1)版本修复改BUG 。
The bug is a.o. fixed in
12.1.0.1 (Base Release)11.2.0.3 (Server Patch Set)
查看表段的大小
SELECT SEGMENT_NAME, ROUND(SUM(BYTES / 1024 / 1024 / 1024), 2) GFROM DBA_SEGMENTS WHERE SEGMENT_NAME IN(SELECT TABLE_NAME FROM USER_TAB_COLUMNS WHERE DATA_TYPE = 'CLOB') GROUP BY SEGMENT_NAME ORDER BY 2 DESC;
oracle expdp/exp ora-600/ora-39014报错处理

文章插图
select a.owner,a.segment_name,sum(bytes/1024/1024/1024) G from dba_segments a where a.owner in ('LIVE','PAYTTFC','RACTTFCTEST')GROUP BY A.owner,a.segment_name ORDER BY 3 DESC;
但是我查到
oracle expdp/exp ora-600/ora-39014报错处理

文章插图
所涉及的大字段的表段
SELECT B.TABLE_NAME,
B.COLUMN_NAME,
A.SEGMENT_NAME,
a.SEGMENT_TYPE,
ROUND(SUM(A.BYTES / 1024 / 1024 / 1024), 2) G
FROM DBA_SEGMENTS A
LEFT JOIN DBA_LOBS B
ON A.OWNER = B.OWNER
AND A.SEGMENT_NAME = B.SEGMENT_NAME
WHERE B.SEGMENT_NAME = 'SYS_LOB0000026212C00002$$'
HAVING ROUND(SUM(A.BYTES / 1024 / 1024 / 1024), 2) >1
GROUP BY B.TABLE_NAME, B.COLUMN_NAME, A.SEGMENT_NAME,a.SEGMENT_TYPE;
查看大字段的大小
 
oracle expdp/exp ora-600/ora-39014报错处理

文章插图
support 说到,当数据库对象(例如包主体)的长度超过 4GB 时,可能会在 DataPump 导出期间出现问题,然而我这个还没有到达4G就已经出问题了 。
support 建议的要解决此问题,请使用以下任一替代方法:
升级到 12c
- 或 -
应用补丁 11.2.0.3 或更高版本
- 或 -
如果适用于您的平台和 Oracle 版本,请应用临时补丁 11656163。
- 或者 -
作为一种可能的解决方法,您可以尝试从导出中排除相关对象
注意:在客户案例中,实际上是通过添加参数EXCLUDE=STATISTICS解决了问题 --不谋而合,正是自己尝试这种方法处理了 。

经验总结扩展阅读