本文共 2921 字,大约阅读时间需要 9 分钟。
数据库模式
数据库模式主要是作为全库备份使用的,可以导出除sys之外的数据库里的所有对象,在数据量较小的情况下是一个不错的选择。
expdp system/oracle dumpfile=db_backup.dmp full=y directory=test_dir
表模式
表模式可以导出某个用户下指定的表,比如我们需要导出的表名为:test1,test2
expdp n1/n1 dumpfile=table_mode.dmp tables=test1,test2 directory=test_dir
用户模式
用户模式可以导出指定用户下所有的对象,比如导出用户user1下所有的对象
expdp n1/n1 file=user_mode.dmp schemas=user1 directory=test_dir
传输表空间模式 常作为数据迁移时的一种方法,在数据迁移篇中会有详细的描述
在impdp中也会存在同样的四种模式,使用方法都是类似的。
除了常用的4种模式之外,使用query选项选择性导出数据也是一种很使用的方法。比如存在一个表test,我们希望根据字段object_id=1的条件来选择性导出数据,可以使用query选项完成。
使用Query选项做选择性数据导出
expdp n1/n1 dumpfile=query_bak.dmp query=\' where object_id=1 \' tables=test directory=test_dir
在这个方面,expdp的query功能更为强大。 比如我们需要导出两个表test1,test2,对于test1需要根据条件"where object_id=1"来导出,test2没有其它过滤条件 我们可以这样使用expdp的query选项,使用一个parfile来更高效完成。 parfile的内容如下: tables=(t,test_tab01) query=t:"where object_id=1" 然后使用expdp命令导出即可。 expdp n1/n1 dumpfile=query_bak.dmp parfile=dp.par directory=test_dir 当然了,expdp的一些实用特性还是蛮多的。可以举几个例子。第一个就是表空间不匹配的问题 比如表中存在lob字段或者与目标环境的表空间不一致,使用Imp导入dump的时候就会抛出下面的错误。 IMP-00003: ORACLE error 959 encounteredORA-00959: tablespace 'DATAS01' does not exist 对于这类问题使用exp/imp的时候还是比较棘手的,可能需要解析dump文件,或者使用dbms_metadata来从源库中得到ddl语句。 在expdp中解决起来就很容易。我们可以使用remap_tablespace的选项,比如我们在导出的环境中存在表空间TEST_OLD,在目标环境没有这个表空间,我们需要把表创建在TEST_NEW表空间下,我们可以使用remap_tablespaces选项。 impdp n1/n1 dumpfile=table_mode.dmp tables=test1,test2 directory=test_dirremap_tablespace=TEST_OLD:TEST_NEW第二个就是导出procedure,function等对象的信息 在exp中,如果你使用用户模式和全库模式,会默认导出存储过程,序列这些对象的信息,但是这些不是由我们手工去控制的。在导入的时候如果使用full=y的时候才会把这些对象给隐式导入。 在datapump中解决起来也很容易。 比如我们只需要导出用户test下的存储过程,函数和序列信息。就可以直接使用下面的语句来做。 expdp test/test dumpfile=query_bak.dmp directory=test_dir schemas=test include=procedcure,function,sequence 甚至我们可以更加挑剔,直接去筛选哪些需要导出,哪些不需要。 比如我们到处sequence的时候只导出序列名为:_seq结尾的序列 我们还是使用parfile来简单配置。 parfile的内容为: include=procedure include=function include=sequence:"like '%_SEQ%'" schemas=test 然后我们使用命令导出: expdp test/test dumpfile=query_bak.dmp directory=test_dir parfile=dp.par第三个就是使用排除选项exclude exp/imp的时候我们还不能使用排除选项,比如用户test下有100张表,我们不希望导出某张表test1 我们可以使用datapump轻松实现。 我们使用parfile来配置。 exclude=table:"='TEST1'" 使用如下的命令即可。 expdp test/test dumpfile=query_bak.dmp directory=test_dir parfile=dp.par转载地址:http://ecszx.baihongyu.com/