ORACLE 11gR2新特性:延迟段创建导致空表EXP导出异常及解决方案

需积分: 10 1 下载量 173 浏览量 更新于2024-08-30 收藏 43KB DOC 举报
在Oracle 11gR2的新特性中,引入了延迟段创建的概念,旨在优化空间管理,减少对空表空间的浪费。这种新特性意味着在创建一个空表时,Oracle数据库并不会立即为其分配物理段(SEGMENTS),即不分配实际的数据存储空间。这样做的好处是可以节省磁盘空间,特别是对于包含大量空表的数据库环境。 然而,这个新特性也带来了一个问题:当使用EXP工具进行数据导出时,如果涉及空表,可能会遇到无法成功导出的情况。例如,如文中所示的实验,尝试创建一个名为"T_TEST_1"的空表后,虽然表已经创建,但查询USER_SEGMENTS视图却找不到对应的SEGMENT_NAME,表明Oracle并未为这个空表创建物理段。 官方文档中提到的SEGMENT_CREATION选项,如果没有显式设置,Oracle会选择默认行为,即不立即为空表创建物理段。这在某些场景下可能导致EXP工具在尝试导出表结构和数据时,由于找不到对应的数据存储位置而报错。 解决这个问题的方法通常包括以下几个步骤: 1. **理解新特性**:确认你对延迟段创建的理解,并了解其对数据管理和导出的影响。理解这是为了优化空间使用,而不是禁用。 2. **检查表属性**:使用SQL语句检查表的SEGMENT_CREATION设置,确保它不是自动设置为NOCREATION,这可能是导致问题的原因。 ```sql SELECT table_name, segment.creation FROM user_tables WHERE table_name = 'T_TEST_1'; ``` 3. **临时调整**:如果发现确实存在NOCREATION设置,可以临时调整策略,为特定表手动创建段以便导出。这可以通过ALTER TABLE命令完成: ```sql ALTER TABLE T_TEST_1 DISABLE CONSTRAINTS; ALTER TABLE T_TEST_1 SHRINK SPACE; ``` 然后执行导出操作。 4. **导出前的预处理**:在大规模导出之前,对所有空表进行类似的操作,确保它们有物理段可用。 5. **长期解决方案**:如果你希望长期保持延迟段创建策略,可以考虑在表创建时显式指定SEGMENT_CREATION,或者为经常需要导出的表创建一个脚本或过程来自动处理。 理解并管理Oracle 11gR2的延迟段创建特性对于有效利用数据库资源、避免导出问题至关重要。通过适当的配置和操作,可以确保空表的正确管理和数据导出的顺利进行。