[toc] 这节内容为expdp命令的介绍,版本为Oracle 11g 上节我们说到调用expdp有三种方式 - 命令行 - 参数文件 - 交互式命令 这节讲第一种方式,命令行模式通过参数来控制导出的行为 首先我们必须在最开始提供用户密码,如不指定密码,则需要在弹出的提示中输入 默认导出用户下所有对象 ``` expdp username/password ``` expdp所有参数可参考如下图表 [https://docs.oracle.com/cd/B28359_01/server.111/b28319/dp_export.htm#BEHBGGEB](https://docs.oracle.com/cd/B28359_01/server.111/b28319/dp_export.htm#BEHBGGEB) 在开始说命令行方式的参数前我们约定: 1. 我们使用hr用户来举例 2. 我们已经建立了dpump_dir1 和 dpump_dir2目录,并赋予额hr用户read,write权限 3. hr用户被赋予了EXP_FULL_DATABASE 和 IMP_FULL_DATABASE权限 上节说了前面一部分,这节讲接下来的 ##REMAP_DATA 该参数可以让你指定一个function用来处理导出表的数据 例如原表中有个存放身份证号码的栏位,我们不希望将明文导出 这时我们可以使用该参数将一些号码替换 ``` REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function ``` **举例** ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=remap1.dmp TABLES=employees REMAP_DATA=hr.employees.employee_id:hr.remap.minus10 REMAP_DATA=hr.employees.first_name:hr.remap.plusx ``` ##REUSE_DUMPFILES 默认值:n 该参数控制是否覆盖已存在的dump文件 默认情况下如果有重复名称会报错 **举例** ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=enc1.dmp TABLES=employees REUSE_DUMPFILES=y ``` ##SAMPLE 该参数指定需要到处多少比例的数据 有时我们处于测试目的只需要一些样本数据,这时可以使用该参数 该参数可以指定某张表 下面语句表示导出50%数据量的employee表 ``` SAMPLE="HR"."EMPLOYEES":50 ``` 如不指定表则表示整个数据库的比例 **举例** ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=sample.dmp SAMPLE=70 ``` ##SCHEMAS 默认值:当前用户的schema 该参数指定当前导出模式为schame模式,这是默认模式 如果用户具有 EXP_FULL_DATABASE 权限则可以导出其他schema数据 该权限也可以让你导出其他信息,如定义信息和权限信息 **举例** ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=expdat.dmp SCHEMAS=hr,sh,oe ``` ##STATUS 默认值:0 该参数指定导出过程中信息的刷新频率 如果该参数未指定则除了对象导出的完成信息,没有其他额外的信息 ``` > expdp hr DIRECTORY=dpump_dir1 SCHEMAS=hr,sh STATUS=300 ``` ##TABLES 该参数指定需要导出的表,指定则表示当前导出为table 模式 该模式只会导出指定的表,分区和相关的对象 所有表必须是同一用户下,指定别的用户你必须有EXP_FULL_DATABASE权限 可以使用通配符 如 TABLES=emp% 表示导出所有以emp开头的表 可以将TRANSPORTABLE=ALWAYS 参数和tables一起使用以启用TRANSPORTABLE模式 **举例** 导出hr用户的employees,jobs,departments表 ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tables.dmp TABLES=employees,jobs,departments ``` 导出sh用户sales表的sales_Q1_2000,sales_Q2_2000分区 ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tables_part.dmp TABLES=sh.sales:sales_Q1_2000,sh.sales:sales_Q2_2000 ``` ##TABLESPACES 指定在表空间模式下导出的表空间名称 他表导出时,其依赖的对象也会被导出,但是用户没有权限的对象不会被导出 **举例** 下面表示导出tbs_4, tbs_5, tbs_6表空间的表以及相关的对象(有权限的) ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tbs.dmp TABLESPACES=tbs_4, tbs_5, tbs_6 ``` ##TRANSPORT_FULL_CHECK 默认值 N 该参数只会在**传输表空间**模式下使用 该参数控制是否检查对象是否存在于指定的表空间内和外 接下来通过下面语句来说明 ``` TABLESPACES=tbs_4 ``` **TRANSPORT_FULL_CHECK=y** 如果tbs_4表空间中有a表,但是没有a表的索引,则导出失败 同时如果tbs_4表空间中有a表的索引,但是没有a表,则导出也会失败 **TRANSPORT_FULL_CHECK=n** 如果tbs_4表空间中有a表,但是没有a表的索引,则导出不会失败 同时如果tbs_4表空间中有a表的索引,但是没有a表,由于索引依赖与表,则导出也会失败 **举例** ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tts.dmp TRANSPORT_TABLESPACES=tbs_1 TRANSPORT_FULL_CHECK=y LOGFILE=tts.log ``` ##TRANSPORT_TABLESPACES 该参数表示当前导出模式为传输表空间模式 他会导出指定表空间的元数据 日志文件会记录用到的数据文件和dump文件以及 containment violations 如果只想导出制定的表或者分区 可以和tables一起使用 传输表空间模式的一些限制: - 不可以重新启动 - 只能使用一并行度 - 需要有EXP_FULL_DATABASE 权限 - 不支持加密的列 - 执行导出的用户不可以包含在指定的表空间中 - 不支持SYS和SYSAUX 表空间 - 导出过程中表空间必须设为只读 **举例** ``` > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tts.dmp TRANSPORT_TABLESPACES=tbs_1 TRANSPORT_FULL_CHECK=y LOGFILE=tts.log ``` ##TRANSPORTABLE 默认值:Never 该参数制定在tables模式中是否启用transportable选项,也只能在tables模式 ``` TRANSPORTABLE = {ALWAYS | NEVER} ``` **举例** ``` > expdp sh DIRECTORY=dpump_dir1 DUMPFILE=tto1.dmp TABLES=sh.sales2 TRANSPORTABLE=always ``` ``` > impdp system PARTITION_OPTIONS=departition TRANSPORT_DATAFILES=oracle/dbs/tbs2 DIRECTORY=dpump_dir1 DUMPFILE=tto1.dmp REMAP_SCHEMA=sh:dp ``` ##VERSION 该参数指定到处对象的版本,可以让导出的dump文件兼容以前版本的数据库 但是不可以是10g以前的版本 如果版本的值不支持表的数据类型,则该表不会被导出 ``` VERSION={COMPATIBLE | LATEST | version_string} ``` **举例** ``` > expdp hr TABLES=hr.employees VERSION=LATEST DIRECTORY=dpump_dir1 DUMPFILE=emp.dmp NOLOGFILE=y ```