[TOC] ## 1. Oracle 数据泵介绍 Oracle数据泵是用来替换原始的export和import工具(exp,imp) 它从Oracle 10g开始提供 它可以快速和高效的将数据从一个数据库移动到另一个数据库 对于单线程数据泵导出性能比原始的快大约两倍,导入性能比原始的快15到40倍,配合并行度会得到更大幅度的提升 数据泵的信息记录在一张master table中,对于被用来处理大对象的工作,如果有大量小的对象则可能会变慢 可以使用compression参数压缩dump文件,但是需要高级压缩组件 ##2. 数据泵的新概念 数据泵相对于原始的exp/imp有2个新的概念 ### 2.1 目录对象(Directory Objects) 不同于原始的exp/imp工具,数据泵在服务器端使用服务器进程的一个Job,服务器进程使用Directory Objects来定位文件位置 DBA可以对目录设定权限 ###2.2 交互式命令行模式(Interactive Command-Line Mode) 我们可以使用它来监控和控制数据泵的进程 这个下期介绍 ##3. 使用数据泵 ###3.1 创建目录 ``` 1. SQL> CREATE DIRECTORY dpump_dir1 AS ‘/usr/apps/datafiles’; ``` ###3.2 跟用户赋予目录权限 ``` 2. SQL> GRANT READ,WRITE ON DIRECTORY dpump_dir1 TO scott; ``` 注意这里只是数据库层面的赋予scoot用户dpump_dir1读写的权限 操作系统层面我们需要数据库软件用户对该目录有权限 ###3.3 导出数据库 在操作系统提示符下运行 ``` 3. >expdp username/password DIRECTORY=dpump_dir1 dumpfile=scott.dmp ``` ##4. 和exp/imp的一些对比 ###4.1 import不同用户 注意这里remap_schema代替了fromuser/touser **imp:** ``` > imp username/password FILE=scott.dmp FROMUSER=scott TOUSER=jim TABLES=(*) ``` **impdp:** ``` > impdp username/password DIRECTORY=dpump_dir1 DUMPFILE=scott.dmp TABLES=scott.emp REMAP_SCHEMA=scott:jim ``` ###4.2 INCLUDE和EXCLUDE 数据泵提供更加方便的过滤功能,我们可以使用include和exlude来控制导出的内容 注意inlcude和exclude不能同时使用 ``` > exp username/password FULL=y FILE=dba.dmp GRANTS=y INDEXES=y ROWS=y > > expdp username/password FULL=y INCLUDE=GRANT INCLUDE= INDEX DIRECTORY=dpump_dir1 DUMPFILE=dba.dmp CONTENT=ALL ``` ##5. 数据泵性能调优 不像原始的imp/exp工具有很多参数用来调优(BUFFER, COMMIT, COMPRESS, CONSISTENT, DIRECT, 和RECORDLENGTH) 数据泵无需设置这些参数,它本身会找到最适合的方式来进行动作 注意数据泵只有Parallelism参数来提升性能 ##6. 不同版本间的数据移动 原始的imp/exp工具针对不同版本的数据库, 如需要从11g导出数据并导入到10g的数据库中,需要使用10g的exp工具导出数据 而数据泵则可以使用11g的exodp导出数据,只需要指定version参数 注意不可以指定10g以前的版本号因为那是并不存在数据泵 同时impdp无法读取exp出来的数据 ``` > expdp username/password TABLES=hr.employees VERSION=10.1 DIRECTORY=dpump_dir1 DUMPFILE=emp.dmp ``` ##7.并行度数据泵 我们可以使用Parallelism参数来提高expdp和impdp的性能(仅支持企业版) 我们可以通过命令行工具更改并行度 为达到并行的最大性能,需要满足如下条件 1. 保证操作系统资源足够(CPU,内存) 2. 为每个并行度分配一个dump文件 3. 为每个dump文件分配不同的磁盘用来提供IO性能 4. 对于expdp来说可以使用%U变量来讲dump文件分割成多个文件 ``` > expdp username/password DIRECTORY=dpump_dir1 JOB_NAME=hr DUMPFILE=par_exp%u.dmp PARALLEL=4 ``` ``` > expdp hr full=y dumpfile=dpump_dir1:full1%u.dmp, dpump_dir2:full2%u.dmp filesize=2g parallel=3 logfile=dpump_dir1:expfull.log job_name=expfull ``` ##8.REMAP参数 ###8.1 REMAP_TABLESPACE 该参数可以将表导入到不同的表空间中 ``` > impdp username/password REMAP_TABLESPACE=tbs_1:tbs_6 DIRECTORY=dpumpdir1 DUMPFILE=employees.dmp ``` ###8.2 REMAP_DATAFILES 该参数可以在impdp中将数据文件映射为不同的数据文件 由于数据文件名称需要用引号,这里推荐使用参数文件 ``` vim payroll.par DIRECTORY=dpump_dir1 FULL=Y DUMPFILE=db_full.dmp REMAP_DATAFILE=”’C:\DB1\HRDATA\PAYROLL\tbs6.dbf’:’/db1/hrdata/payroll/tbs6.dbf ’” ``` ``` > impdp username/password PARFILE=payroll.par ``` ##9.数据泵一些其他功能 ###9.1 交互式命令行工具 由于数据泵是服务端工具我们可以运行一个expdp或impdp Job,然后退出(detach)它,然后在需要时重新连接并监控它 - 查看Job的状态 - 当磁盘空间不足时增加新的dump文件 - 更改默认的dump文件大小 - 停止然后把重新启动它 - 重启它 - 增加和减少并行度 - 从远程数据连接它并监控状态 可以使用如下试图查看JOB情况 - DBA_DATAPUMP_JOBS - all active Data Pump jobs and the state of each job - USER_DATAPUMP_JOBS – summary of the user’s active Data Pump jobs - DBA_DATAPUMP_SESSIONS – all active user sessions that are attached to a Data Pump job - V$SESSION_LONGOPS – shows all progress on each active Data Pump job ###9.2 Network Mode 我们可以使用Network Mode 来export 只读数据库,例如Standby database 使用network_link参数 具体可参考 ``` https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:9530201800346481934 ``` ###9.3 生成SQLFILE 我们可以是expdp生成数据库对象的DDL语句 ``` > impdp username/password DIRECTORY=dpumpdir1 DUMPFILE=expfull.dmp SQLFILE=dpump_dir2:expfull.sql INCLUDE=TABLE,INDEX ```