您的位置:首页 > 其它

ORA-01455错误的处理方法

2013-01-25 11:22 155 查看
今天一个客户打电话说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,可以完整导出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: