Oracle 11g空表导出解决方案与新工具expdp/impdp详解

需积分: 9 1 下载量 146 浏览量 更新于2024-09-09 收藏 49KB DOC 举报
Oracle数据库的数据迁移、备份和恢复是数据库运维中的重要任务。本文主要关注Oracle 11g R2版本中遇到的一个问题:使用exp工具导出空表时,由于新特性导致无法正常导出。11g R2在处理空表时,会避免分配存储空间以节省资源,但这也使得空表在export操作中无法被识别。为解决这个问题,文章提供了两种方法: 1. **插入数据然后回滚**: - 在空表中插入一行数据,这会触发Oracle为表分配存储空间(segment)。 - 插入后立即执行一个ROLLBACK操作,撤销数据更改,但保留了segment。 - 这时,可以使用exp工具导出包含空表的数据。 2. **修改`deferred_segment_creation`参数**: - 将系统参数`deferred_segment_creation`设为`FALSE`,无论表是否为空,都会在导出时强制分配segment。 - 但是,这个改变仅对后续新建或修改的表有效,对历史空表没有影响,需要单独处理。 为了导出历史空表,可以使用SQL查询来找到这些表,然后执行`ALTER TABLE`命令分配extent,例如: ```sql SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;' FROM user_tables WHERE num_rows = 0; ``` 执行查询结果后,就可以导出包含这些空表的数据库了。 Oracle 10g及更高版本引入了expdp和impdp工具,它们专门用于数据传输,相比于传统的exp和imp,提供了更高级的功能。以下是使用expdp的基本步骤: - **创建逻辑目录**: - 使用管理员账户(如system)创建一个逻辑目录,如'db_bak',路径为'd:\test\dump',注意这只是在Oracle内部表示的,不直接对应操作系统中的目录。 - 创建命令:`createdirectory db_bak as 'd:\test\dump';` - **检查和赋权**: - 查看当前目录权限:`select * from dba_directories;` - 给system用户在指定目录的读写权限:`grant read, write on directory db_bak to system;` - **导出数据**: - 使用expdp命令,指定用户名(如system或manager)、目标服务器(如orcls),以及导出选项(schemas=system, dumpfile=expdp.d`)。 通过以上方法,无论是利用传统exp工具还是新式的expdp工具,都可以有效地进行Oracle数据库的数据导入导出,包括处理空表的问题。这对于数据库管理员来说是一项重要的技能,确保数据的完整性和一致性,以及在必要时进行有效的数据备份和恢复。