Oracle IMPDP/EXPDP使用小结

数据泵主要解决的问题

  1. IMP/EXP更加灵活,支持多种元数据过滤策略,多种导入/导出模式,如将AB用户导到C库中D用户,则只需要REMAP_SCHEMA即可
  2. 空表问题,Oracle11G新的表并且表中无数据也未使用过则表的SEGMENT空间是不会分配的,这样在EXP时表是导不出来的,这个问题的解决就是给表分配SEGMENT或使用EXPDP
    1. SELECT 'ALTER TABLE ' || TABLE_NAME || ' ALLOCATE EXTENT;' FROM USER_TABLES WHERE NUM_ROWS=0,将查询结果导出成sql脚本执行即可
    2. ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE SCOPE=BOTH
  1. 效率问题,普通情况下EXPDP/IMPDP要比EXP/IMP效率要高

导出指定的表的相关内容

EXPDP NSTCSA224/642506@NSDEV DIRECTORY=EXPDP_DIR DUMPFILE=NSTCSA224_TABLE.DMP TABLES=(GP_CELL_VALUES,GP_POST,IMES_ATTENTIONCLIENT) LOGFILE=NSTCSA224_TABLE.LOG VERSION=10.2.0.1

正常导入

IMPDP NSTCSA224/642506@NSDEV DIRECTORY=IMPDP_DIR DUMPFILE=NSTCSA224_TABLE.DMP LOGFILE='SMSDATA_TABLE.LOG' version=10.2.0.1

分析数据文件生成SQL文件,不真正导入到数据库

IMPDP NSTCSA224/642506@NSDEV DIRECTORY=IMPDP_DIR DUMPFILE=NSTCSA224_TABLE.DMP SQLFILE=SQLFILE.SQL VERSION=10.2.0.1

通过DB_LINK远程使用数据泵

创建DB_LINK

执行导出

EXPDP NSTCSA224/642506@NSDEV DIRECTORY=IMPDP_DIR NETWORK_LINK=DB_LINK DUMPFILE=NSTCSA224_FB_TABLES.DMP LOGFILE=NSTCSA224_FB.LOG VERSION=11.1

注意,如果客户端数据泵与服务器的版本不一致将不能正常工作

重复导入时会使用到的TABLE_EXISTS_ACTION参数

这里TABLE_EXISTS_ACTION表示当前库中已经有某张表,然后导入的时候我们可以对已有的表做处理,如跳过、删除重建、追加数据等,更复杂些的导入/导出需求可以结合TABLE_EXISTS_ACTIONINCLUDEEXCLUDECONTENTQUERY等多个参数完成(可以查阅Oracle文档)

IMPDP NSTCSA224/642506@NSDEV DIRECTORY=IMPDP_DIR DUMPFILE=NSTCSA224.DMP LOGFILE=NSTCSA224.LOG TABLE_EXISTS_ACTION=SKIP

数据泵版本兼容问题

IMPDP/EXPDP是在Oracle 10加入的工具,该工具默认不向下兼容(即使用EXPDP导出的Oracle11G是不能被Oracle10G导入的),这时就需要EXPDP时加入VERSION标记。

正常情况下在源数据库上使用EXPDP命令加上VERSION标记后导出的数据库文件可正常被指定版本的IMPDP识别并导入,但在实际实践的过程中发现导出时加上相应版本号在有些情况下也并未能正常的再被版本指定的IMPDP导入,在这里我们遇到的问题就要是从Oracle 11.2.0.1上抽取版本为11.2.0.1之前的版本如10.2.0.1\11.1.0.2甚至是Oracle 9版本,但导出的数据文件并不能被低版本的Oracle导入。

此种情况下的一种解决办法


涉及到的一些命令

  1. IMPDP USER_01/USER_01@ORCL DIRECTORY=IMPDP_DIR DUMPFILE=TEST_01.DMP LOGFILE=TEST_01.LOG
  2. IMPDP USER_01/USER_01@ORCL DIRECTORY=IMPDP_DIR DUMPFILE=TEST_01.DMP SQLFILE=TEST_01.SQL TABLES=(A,B,C,D,E)
  3. SQLPLUS中执行放到C:\盘下的某个SQL脚本

  1. IMPDP USER_01/USER_01@ORCL DIRECTORY=IMPDP_DIR DUMPFILE=TEST_01.DMP LOGFILE=TEST_01.LOG TABLE_EXISTS_ACTION=SKIP
  2. 使用USER_01登陆当前数据库,查看数据对象与原始库对象是否一致,如表数量是否相等
    1. SELECT COUNT(1) FROM USER_TABLES
  1. 重新编译函数\过程对象
    1. 利用第三方工具如PL/SQL Developer
    2. 手工
      1. 查:SELECT OBJECT_TYPE,COUNT(1) FROM USER_OBJECTS WHERE STATUS='INVALID' GROUP BY OBJECT_TYPE
      2. 构建重新编译语句:SELECT 'ALTER ' || OBJECT_TYPE || ' ' || OBJECT_NAME || ' COMPILE;' FROM USER_OBJECTS WHERE STATUS='INVALID'
      3. 存储成SQL脚本然后执行

参考资源

  1. Oracle®Database Utilities11G Release 2(11.2)
  2. baidu/google

你可能感兴趣的:(Oracle IMPDP/EXPDP使用小结)