expdp时遇到ORA-31693&ORA-02354&ORA-01466

在使用expdp进行Oracle数据库导出时,遇到ORA-39095、ORA-31693和ORA-01466错误。解决方法包括:1) 取消parallel参数以避免并发写文件问题;2) 使用变量%u动态分配转储文件;3) 注意在使用FLASHBACK_SCN时避免同时进行权限授予,因为这可能导致ORA-02354和ORA-01466错误。Oracle确认这是预期行为而非bug,建议在expdp运行期间不要授予任何对象权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

expdp时遇到ORA-31693&ORA-02354&ORA-01466
对一个schema执行expdp导出,expdp命令:
nohup expdp HQ_X1/HQ_X1 DUMPFILE=HQ_X1.DMP DIRECTORY=DIR1 parallel=8  flashback_scn=10838324803 &
ORA-39095: Dump file space has been exhausted: Unable to allocate 8192 bytes
这通常是因为使用了parallel参数导致,官方文档的解释是parallel io server processes写文件不能同时写一个,
并且当一个io server process在写其余io server process在等待的时候就会报ORA-39095。
所以解决办法:(1).取消parallel,但这样会影响expdp的性能;
(2)在写导出语句的时候指定dumpfile中使用变量 %u(大小写均可),让其自由分配转储文件即可。
于是我使用了变量重新导出:
nohup expdp HQ_X1/HQ_X1 DUMPFILE=HQ_X1%u.DMP DIRECTORY=DIR1 parallel=8  flashback_scn=10838324803 &
之前的问题已经解决了,但遇到了新的报错:
ORA-31693: Table data object "HQ_X1"."TBL_BILL":"SYS_P109" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-01466: unable to read data - table definition has changed
查看下dba_objects,果然在那个时间点有DDL操作:
LAST_DDL_TIME
2015-06-23/17:32:19
2015/1/12 22:57:10


怀疑是GRANT之类的可能性最大, 查下v$sql,果然有下面的SQL,时间也完全对应得上:
insert into objauth$(obj#, grantor#, grantee#, privilege#, sequence#, option$, col#) values(:1,:2,:3,:4,:5,:6,:7)  2015-06-23/17:32:19
--insert into objauth$(option$,grantor#,obj#,privilege#,grantee#,col#,sequence#) values(decode(:1,0,null,:1),:2,:3,:4,:5,decode(:6,0,null,:6),object_grant.nextval);
Oracle的一篇note是这样说的:
The issue is discussed in
Bug 8534161 - ORA-1466 REPORTED BY EXPDP WHEN USING FLASHBACK_SCN AND PRIVILEGES WERE GRANTED
Oracle Development confirmed this is expected behavior and not a bug.
并且给出给解决方法:
WORKAROUND
Do not grant any privileges to any object while Expdp is running with FLASHBACK_SCN.


另附一个我自己做的测试:
开2个session,
session1先open一个游标:
SQL> exec open :x for select * from b where user_id=100;
PL/SQL procedure successfully completed.
session2执行一个grant:
SQL>  grant select on b to mine;
Grant succeeded.
session1打印游标:
SQL> print x
USERNAME                          USER_ID CREATED
------------------------------ ---------- --------------
HQ_X2                              100 12-9月 -14
HQ_X2                              100 12-9月 -14
可以看出对于SELECT操作,当执行期间在另一个session执行grant时没有问题的,但在expdp下却不行,这就是一开始Oracle认为这是一个BUG的原因。

### ORA-31693ORA-02354ORA-01555 错误对数据影响分析 #### 一、错误概述 当执行 `expdp` 或其他导出操作遇到这些错误,通常意味着某些表的数据未能成功导出。具体来说: - **ORA-31693**: 表明特定的对象(通常是表)在尝试加载或卸载过程中失败并被跳过[^1]。 - **ORA-02354**: 提示在导出或导入期间发生了某种形式的内部处理错误,这可能是由于文件损坏或其他底层存储问题引起的。 - **ORA-01555**: 指的是快照太旧的问题,在读取一致性视图的过程中遇到了不一致的状态,即事务回滚段不足以提供所需的历史版本记录[^2]。 #### 二、对数据的具体影响 对于上述提到的三个错误组合而言,最直接的结果就是部分指定对象的数据未被包含到最终生成的转储文件中。这意味着如果后续基于此转储文件进行恢复,则那些受影响的对象将会丢失其最新状态下的全部或部分内容。 更进一步讲,因为这些问题往往发生在大型表格上或是涉及长间运行的操作里,所以可能会影响到业务逻辑紧密关联的关键性资料。例如订单详情、交易流水等重要商业信息可能会因此而残缺不全,进而给应用程序带来潜在的风险和挑战[^3]。 另外值得注意的一点是,虽然单次导出作业中的个别对象缺失不会立即造成整个系统的崩溃,但如果频繁发生此类事件,不仅会增加维护成本,还可能导致灾难性的后果——尤其是在缺乏有效监控机制的情况下[^4]。 ```sql -- 示例:查询哪些表受到了影响 SELECT * FROM dba_expdp_log WHERE status = 'FAILED'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值