某日协助同事完成两个测试数据库的结构同步。将早就烂熟于心的exp和imp命令编写成shell自动运行,交活了事。没有想到,同事说同步的表相差巨大。不会吧,检查了生成的日志信息:sql
- . exporting dimensions
- . exporting post-schema procedural objects and actions
- . exporting statistics
- Export terminated successfully without warnings.
正常的一谈糊涂。可是检查导出表的数据确实差了很多。应该是49张表,可是导出的只有34张。shell
反复检查USER_TABLES的信息,首先发现的就是确实没有导出的表在某些属性字段上比较怪异。数据库
- SQL> select INITIAL_EXTENT,NEXT_EXTENT from user_tables where table_name='TBL_NC_AREA_I';
- INITIAL_EXTENT NEXT_EXTENT
- -------------- -----------
奇怪。为空。session
没有办法,估计须要修改表的一些状态才可能改变。数据结构
- SQL> alter table TBL_NC_AREA_I move;
- Table altered.
- SQL> select INITIAL_EXTENT,NEXT_EXTENT from user_tables where table_name='TBL_NC_AREA_I';
- INITIAL_EXTENT NEXT_EXTENT
- -------------- -----------
- 65536 1048576
- SQL>
不错,如今看起来比较正常了,exp也正常导出。ide
真是为何呢?存储参数的信息没有出现,然后在user_tables中发现了字段SEGMENT_CREATED。估计就是这个“问题”。找找看,发现凡是不能正常导出的表这个属性字段都是显示: post
- select INITIAL_EXTENT,NEXT_EXTENT,SEGMENT_CREATED
- from user_tables where table_name='TBL_NC_BALANCEBANK_I';
- -------------- ----------- ---
- NO
查。发现原来这个11gR2的一个特性:DEFERRED SEGMENT CREATION,即创建表的时候,一开始并无直接分配存储空间。直接在字典中记录了数据结构。而只有当真正有数据的时候才分配空间。这种方法对于象SAP这样大的系统须要部署成千上万张表是很是有效的。测试
检查测试数据库:this
- SQL> show parameters deferred_segment_creation
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- deferred_segment_creation boolean TRUE
这个功能是开启的。固然能够经过修改参数来进行修改:spa
- alter system set deferred_segment_creation=true;
- session级别的方法类似。
- 若是在表一级:
- CREATE TABLE .... SEGMENT CREATION IMMEDIATE;
- 须要延后分配:
- CREATE TABLE ... SEGMENT CREATION DEFERRED
固然还有个人“土制”办法,move一下表。
如今EXP是没有问题。可是奇怪,为何EXP只能检索出已经分配存储空间的表,难道读的字典不是相同的基表?不能不说,这个特性对于EXP而言,起码是有瑕疵的,而且在一些UPGRDE等操做也是有风险的。
同时注意,这样的表在SYS, SYSTEM, PUBLIC, OUTLN, or XDB 模式(schema)下,是没法创建的。
时时都是有收获的,只要留心些。 -:)
--EOF