前言
昨天测试Oracle库在使用EXP从服务器端导出备份至本地端时出现了EXP-00003: 未找到段 (0,0) 的存储定义的错误,现记录一下排查思路和解决办法。
原因
经查,该问题是因为导出的数据表为空表导致的。Oracle 11GR2当表无数据时,不分配segment,以节省空间,因此在用EXPORT导出时,空表不能导出。
思路
根据测试库使用者提供的情况,服务器端Oracle数据库版本为11.2.0.4,本地端数据库版本为11.2.0.1,时会出现该问题,若版本相同则可正常导出。经查询,原因大致为deferred_segment_creation 参数。该参数值默认是TRUE,此时对于空表不分配segment,在改参数没改为FALSE时创建的表SEGMENT_CREATED为N/A。故我的思路是:
1、 找使用者要当时备份的代码,在我的机子上复现,因我的服务器端Oracle数据库版本为11.2.0.4,本地端数据库版本为11.2.0.1,若出现同样报错则代码应该没问题
2、随机找几个出现问题的表,复制一个相同结构内容的表(仅更改名字,为了不影响库的正常运行),若原表SEGMENT_CREATED为N/A不能正常备份但新表SEGMENT_CREATED为YES可正常备份,则可判断是该项问题。
解决办法
找对方要了备份的语句和备份不了的几张表。试验之后发现我同样出现了该问题,故应该不是语句上的错误。
随后,
select * from all_tables where TABLE_NAME = 'TABLENAME';
create table USER_NAME.TABLENAMEBK as select * from USER_NAME.TABLENAME;
select * from all_tables where TABLE_NAME = 'TABLENAMEBK';
可以对比出第一个select里SEGMENT_CREATED为N/A,第二个select里为YES,且单独备份第一张表失败第二张表成功。
故需手工分配SEGMENT,因问题表众多,故
select 'alter table '||table_name||' allocate extent;' from user_tables where SEGMENT_CREATED = 'N/A';
生成相关语句后批量处理。
最一劳永逸的治本方法是
alter system setdeferred_segment_creation=false scope=both;
感谢
Oracle导出警告“EXP-00003: 未找到段 (0,0) 的存储定义”解决 大佬的解决思路!