当Oracle 11gR2使用exp导出命令时遇到EXP-00011错误,这通常是由于某些表没有分配段空间(Segment)导致的。这种情况常见于表为空或者数据库参数`DEFERRED_SEGMENT_CREATION`设置为TRUE的情况下。以下是解决此问题的方法:
### 1. 检查并修改`DEFERRED_SEGMENT_CREATION`参数
首先,检查`DEFERRED_SEGMENT_CREATION`参数的设置。如果设置为TRUE,则Oracle在创建表时不会自动为没有数据的表创建段空间。可以通过以下SQL命令查看此参数的设置:
SHOW PARAMETER DEFERRED_SEGMENT_CREATION;
如果`VALUE`为TRUE,可以考虑将其设置为FALSE。但请注意,修改此参数只会影响之后创建的表。对于已经存在的表,需要采取其他措施。
### 2. 为没有Segment的表分配空间
对于已经存在但没有Segment的表,可以通过`ALTER TABLE ... ALLOCATE EXTENT`命令手动为其分配空间。这可以通过以下步骤实现:
a. 查找没有Segment的表(特别是空表):
SELECT table_name FROM user_tables WHERE NUM_ROWS = 0;
b. 为这些表分配空间。例如,为`MY_EMPTY_TABLE`表分配64K的空间:
ALTER TABLE MY_EMPTY_TABLE ALLOCATE EXTENT(SIZE 64K);
重复此步骤为所有需要的表分配空间。
### 3. 使用其他方法确保所有表都能被导出
除了上述方法外,还可以考虑以下方法:
- **插入并回滚数据**:在空表中插入一行数据,然后立即回滚。这将强制Oracle为该表创建Segment。但这种方法较为繁琐,不推荐作为常规解决方案。
- **设置`deferred_segment_creation`为FALSE**(如上所述),但这仅影响后续创建的表。
- **在创建表时指定立即创建Segment**:在创建新表时,可以通过`SEGMENT CREATION IMMEDIATE`子句来确保即使表为空也创建Segment。
### 4. 重新执行exp导出命令
在解决了上述问题后,重新执行exp导出命令。此时应该能够成功导出所有表,包括之前因缺少Segment而失败的表。
请注意,上述步骤中的SQL命令和参数值(如64K)可能需要根据您的实际环境和需求进行调整。