ORA-01455错误的处理方法

今天一个客户打电话说exp报错ORA-01455,如下图。询问了客户端版本是10g,数据库版本是11.2.0.3。于是第一个想法是难道是客户端版本的事,但看错误提示,很快否决了这个猜测。Google下ORA-01455,基本上判断问题出在要导出的库存在空表。询问客户数据库是否有空表,得到确认,并得知客户目前的库也是用过IMP导入的。



原来,Oracle 11g R2新特性,当表无数据(空表)情况下,为节省空间,默认是不分配segment的。这个特性是由deferred_segment_creation这个参数控制的,deferred_segment_creation默认是TRUE,需要改为FALSE。但需要注意的是,该值对之前IMP的空表不起作用。所以要想解决这个问题,还需要对改这个参数之前导入的空表进行强制分配segment。


这里有个最简单的方法,就是在空表中插入数据,再删除(rollback),就会产生segment,这样导出时则可导出空表。于是查询用户下所有的空表:

select table_name from user_tables where NUM_ROWS=0;
TABLE_NAME
------------------------------
UET$
PROXY_ROLE_DATA$
AQ$_SYS$SERVICE_METRICS_TAB_I
AQ$_SYS$SERVICE_METRICS_TAB_G
AQ$_SYS$SERVICE_METRICS_TAB_H
AQ$_SYS$SERVICE_METRICS_TAB_T
AQ$_KUPC$DATAPUMP_QUETAB_I
AQ$_KUPC$DATAPUMP_QUETAB_G
AQ$_KUPC$DATAPUMP_QUETAB_H
AQ$_KUPC$DATAPUMP_QUETAB_T
AQ$_AQ_PROP_TABLE_I


TABLE_NAME
------------------------------
AQ$_AQ_PROP_TABLE_G
AQ$_AQ_PROP_TABLE_H
AQ$_AQ_PROP_TABLE_T
AQ$_AQ$_MEM_MC_I
AQ$_AQ$_MEM_MC_G
AQ$_AQ$_MEM_MC_H
AQ$_AQ$_MEM_MC_T
AQ$_ALERT_QT_I
AQ$_ALERT_QT_G
AQ$_ALERT_QT_H
AQ$_ALERT_QT_T


TABLE_NAME
------------------------------
AQ$_SCHEDULER_FILEWATCHER_QT_I
AQ$_SCHEDULER_FILEWATCHER_QT_G
AQ$_SCHEDULER_FILEWATCHER_QT_H
AQ$_SCHEDULER_FILEWATCHER_QT_T
AQ$_SCHEDULER$_REMDB_JOBQTAB_I
AQ$_SCHEDULER$_REMDB_JOBQTAB_G
AQ$_SCHEDULER$_REMDB_JOBQTAB_H
AQ$_SCHEDULER$_REMDB_JOBQTAB_T
AQ$_SCHEDULER$_EVENT_QTAB_I
AQ$_SCHEDULER$_EVENT_QTAB_G
AQ$_SCHEDULER$_EVENT_QTAB_H


TABLE_NAME
------------------------------
AQ$_SCHEDULER$_EVENT_QTAB_T
STREAMS$_APPLY_SPILL_MSGS_PART
WRR$_REPLAY_DATA
WRR$_REPLAY_SEQ_DATA
WRR$_REPLAY_SCN_ORDER
WRH$_INTERCONNECT_PINGS
WRH$_INST_CACHE_TRANSFER
WRH$_DLM_MISC
WRH$_LATCH_PARENT
WRH$_LATCH_CHILDREN
CHNF$_GROUP_FILTER_IOT


TABLE_NAME
------------------------------
CHNF$_CLAUSES
RULE_SET_ROP$
RULE_SET_PR$
UTL_RECOMP_SORTED
SQLOBJ$DATA
SQLOBJ$
SQLLOG$


已选择579行。

很显然,空表太多,不可能一个一个insert再rollback来操作。第二种解决办法,可以通过alter table AQ$_AQ$_MEM_MC_H allocate extent 来解决。于是查询所有空表并导出操作语句,具体操作如下:

alter system set deferred_segment_creation=false scope=both;
set newpage none;
set heading off;
spool d:\test.sql;
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
spool off;


编辑d:\test.sql,并在客户端导入test.sql ;


完成之后,再重新exp,可以完整导出



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值