Oracle11G解决空表无法导出问题及expdp/impdp使用

需积分: 50 12 下载量 54 浏览量 更新于2024-09-17 收藏 25KB DOCX 举报
"Oracle数据库的导出导入工具exp和imp在处理空表时的问题及解决方案" 在Oracle数据库中,`exp` 和 `imp` 是传统的数据泵工具,用于数据的导出和导入。在Oracle 11GR2版本中,由于一个新特性,空表在没有数据的情况下可能不会分配segment,导致在使用`exp`工具导出时无法包含这些空表。这个问题可以通过两种主要方法来解决。 首先,一种解决办法是向空表中插入一条数据,然后立即回滚事务。这样做会触发Oracle为表分配segment。操作步骤如下: 1. 使用`INSERT INTO table_name VALUES (some_value);` 2. 然后执行`ROLLBACK;`来撤销刚才的插入操作。 完成这一步后,空表将有segment,从而可以在导出时被包含。 另一种方法是修改系统参数`deferred_segment_creation`。这个参数默认值为`TRUE`,意味着只有在数据插入时才会分配segment。将其设置为`FALSE`,无论表是否为空,都会立即分配segment。执行如下SQL语句: ```sql ALTER SYSTEM SET deferred_segment_creation=FALSE SCOPE=BOTH; ``` 请注意,这个设置只对设置后的新增表生效,对之前的空表无效。若需导出之前的空表,仍需使用上述的第一种方法。 如果你需要找出数据库中的所有空表,可以运行以下SQL查询: ```sql SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;' FROM user_tables WHERE num_rows = 0; ``` 执行查询结果中的语句,为每个空表分配extent,然后就可以用`exp`导出了。 自Oracle 10g起,还引入了增强版的数据泵工具 `expdp` 和 `impdp`。这两个工具提供了更高级的功能,包括处理空表的能力。使用`expdp`导出空表的命令示例如下: ```bash expdp system/manager@orcls schemas=system dumpfile=expdp.dmp directory=DB_BAK ``` 同样,要赋予用户在指定目录上的读写权限: ```sql GRANT READ, WRITE ON DIRECTORY DB_BAK TO SYSTEM; ``` `expdp` 和 `impdp` 的使用涉及到多个参数,包括指定用户名、口令、连接的数据库实例、要导出的模式或表、导出文件的位置以及目录对象等。这些工具提供了更多的灵活性和控制,是处理Oracle数据导入导出的首选方式。 总结来说,当遇到Oracle 11GR2中空表无法通过`exp`导出的问题时,可以通过插入并回滚数据、调整系统参数或使用`expdp`工具来解决。对于`expdp`和`impdp`,理解其基本用法和参数配置是高效管理数据库数据的关键。