[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
```