解决oracle11g数据库中空表exp没法导出的问题

以前再作项目的时候下载了一个开源的程序,数据库在移植的时候经过exp/imp导入导出,结果程序在启动时报错,对比事后发现两个数据库表相差了十几个,再排查问题,发现少掉的十几个表所有是空表,查了一下oracle11g的特性,发现当数据条数是0时不分配segment,因此就不能被导出!我勒个擦!坑爹有木有!数据库

可是总不能每一个表插入一条数据再导出吧,做为一个程序猿总不能上手工课吧,因而继续查,找到了一个解决办法,特此记录,以儆效尤!oracle

第一种解决办法:spa

在建立数据库以前,先将数据库segment属性进行修改,SQL语句以下:orm

alter system set  deferred_segment_creation=false;对象

含义以下:deferred_segment_creation,含义是段延迟建立,默认是true。若是这个参数设置为true,你新建了一个表T1,而且没有向其中插入数据,那么这个表不会当即分配extent,也就是不占数据空间,只有当你insert数据后才分配空间。这样能够节省少许的空间。设置deferred_segment_creation 参数为FALSE后,不管是空表仍是非空表,都分配segment。须要注意的是,该值设置后只对后面新增的表产生做用,对以前创建的空表不起做用,在修改后须要从新启动数据库参数才能生效it

第二种解决办法:io

先查一下哪些表是空的,而后使用ALLOCATE EXTENT为数据库对象分配Extent,SQL以下:table

查询空表:select table_name from user_tables where NUM_ROWS=0; select

生成修改语句:select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 ;下载

执行生成修改语句的SQL后会生成一堆的ALTER的SQL语句,将生成的语句执行后,再进行exp数据导出,就能够导出全部数据了!

相关文章
相关标签/搜索