本文主要介绍如何使用EXPDP/IMPDP也就是数据泵方式导入导出Oracle数据库。


导库权限管理

备份恢复数据库可以设置一个专门的用户赋予导出导入权限,导出:exp_full_database导入:imp_full_database权限。(本文后面使用的是system默认就有权限)

    查看scott是否有导入导出权限

select * from dba_role_privs where grantee='SCOTT';

    赋予scott用户导入导出权限

grant exp_full_database,imp_full_database to scott;

    回收scott导入导出权限

revoke select on dba_directories from scott;


directory管理

在介绍Oracle导入导出之前先介绍一下directory目录,directory主要用来指定存储路径。查看DBA_directories视图可以查看到目录信息。这里我也简单介绍一下directory目录的管理命令。

    创建名为zhanky的directory,对应的路径G:\zhanky

create or replace directory zhanky as 'G\zhanky';

    查看所有directory

select * from dba_directories;

    删除指定的directory

drop directory zhanky;


为了方便大家的理解,这里简单做了DIRECROEY和EXPDP/IMPDP的对应关系图,创建directory是为了在导入到处时引用。



前面讲解了导库前准备操作,首选需要确定导出用户要有exp_full_database权限(如果使用system或sys默认就有),导入用户需要imp_full_database权限。然后需要创建directory供存放备份文件。

开始进入正题了,导入导出的日常常用参数通过测试来了解。


EXPDP导出

常用日常备份,导出全库到zhanky目录中,备份文件命名zhanky.dmp,日志文件命名zhanky_out.log。

expdp system/manager@zhanky directory=zhanky dumpfile=zhanky.dmp logfile=zhanky_out.log full=y

DIRECTORY:用于转储文件和日志文件的目录对象。
DUMPFILE:指定导出备份文件的命名。
LOGFILE:指定导出备份日志的命名。里面记录了备份中的信息。
FULL:导出整个数据库 (默认是N,就是默认只会导出登录用户的所有数据)。


将sh和scott用户下除去sales和emp表以外百分之四十的数据导出到zhanky目录中,备份文件命名zhanky2.dmp。

expdp system/manager@zhanky directory=zhanky dumpfile=zhanky2.dmp schemas=sh,scott exclude=table:\"IN\(\'SALES\',\'EMP\'\)\" sample=40

SCHEMAS:要导出的方案的列表 [登录方案]。

EXCLUDE:排除特定对象类型。(表名要大写)

SAMPLE:要导出的数据的百分比。


将users和example表空间导出到zhanky目录中版本为11.2.0.1,导出使用两个进程备份,文件分别命名zhanky1.dmp、zhanky2.dmp。如果文件存在,直接覆盖目标转储文件。

expdp system/manager@zhanky directory=zhanky dumpfile=zhanky1.dmp,zhanky2.dmp tablespaces=users,example version=11.2.0.1 parallel=2 reuse_dumpfiles=y

TABLESPACES:标识要导出的表空间的列表。

VERSION:指定导出数据库的版本,一般用于高版本数据库的数据要导入到低版本数据库中时用到。

PARALLEL:更改当前作业的活动 worker 的数量。

REUSE_DUMPFILES:覆盖目标转储文件 (如果文件存在) [N]。


将sh.selas表中cust_id列值为987的数据导出到zhanky目录中,备份文件命名为zhanky3.dmp,备份任务名叫zhankycs

expdp system/manager@zhanky directory=zhanky dumpfile=zhanky3.dmp tables=sh.selas QUERY=selas:"where cust_id=987"  JOB_NAME=zhankycs

TABLES:标识要导出的表的列表。例如, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995。

QUERY:用于导出表的子集的谓词子句。例如, QUERY=employees:"WHERE department_id > 10"。

JOB_NAME:要创建的导出作业的名称。


更多导出参数可以通过 expdp -hlep获得



IMPDP导入

        IMPDP的大概过程:首先会验证用户名、密码、库等参数信息,然后创建表空间、用户、角色等,最后导入表、索引等对象。在这个步骤中创建表空间用户最重要,如果创建表空间或用户失败,那这个表空间或用户的数据在新库中就没了。创建用户失败的原因一般都是表空间不存在,所以表空间创建的是否成功事关重要。在导入过程自动创建表空间时会按照备份文件(也就是备份文件数据源库)中的参数信息。所有参数正确那么就可以出问题的地方就只有存储空间和路径了。所以我们只需要确认服务器空间是否足够和源库中数据文件的路径在服务器上是否存在。而单实例环境从windows导入到linux这种情况,路径肯定没法保证一致,所以建议在导入之前先创建表空间。一般如果是生产环境公司都会有创建表空间脚本。


常用日常恢复,将zhanky目录下zhanky.dmp备份文件中所有数据导入到zhanky库中导出日志命名为zhanky_in.log。

impdp system/manager@zhanky directory=zhanky dumpfile=zhanky.dmp logfile=zhanky_in.log full=y

DIRECTORY             供转储文件, 日志文件和 sql 文件使用的目录对象。

DUMPFILE              要从 (expdat.dmp) 中导入的转储文件的列表,
LOGFILE               日志文件名 (import.log)。

FULL                  从源导入全部对象 (Y)。


将zhanky目录下zhanky.dmp备份文件中sh和scott用户下除去sales和emp表以外的所有数据导入到zhanky库中。并将导入作业命名zhankycs_in

impdp system/manager@zhanky directory=zhanky dumpfile=zhanky.dmp schemas=sh,scott exclude=table:\"IN\(\'SALES\',\'EMP\'\)\" job_name=zhankycs_in

SCHEMAS               要导入的方案的列表。

EXCLUDE               排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。

JOB_NAME              要创建的导入作业的名称。


将zhanky目录下zhanky1.dmp、zhanky2.dmp备份文件中users和example表空间导入到zhanky库中,导入使用两个进程导入。

expdp system/manager@zhanky directory=zhanky dumpfile=zhanky1.dmp,zhanky2.dmp tablespaces=users,example reuse_datafiles=y parallel=2

TABLESPACES           标识要导入的表空间的列表。
REUSE_DATAFILES       如果表空间已存在, 则将其初始化 (N)

PARALLEL              更改当前作业的活动 worker 的数目。


将zhanky目录下zhanky.dmp备份文件中sh.selas表里cust_id列值为987的数据指定为10.2.0.4版本导入到zhanky库中,如果指定库种sh.selas表则将数据附加到表中

impdp system/manager@zhanky directory=zhanky dumpfile=zhanky.dmp tables=sh.selas QUERY=selas:"where cust_id=987" version=10.2.0.4 TABLE_EXISTS_ACTION=REPLACE

QUERY                 用于导入表的子集的谓词子句。

VERSION               要导出的对象的版本, 其中有效关键字为:

TABLES                标识要导入的表的列表。

TABLE_EXISTS_ACTION   导入对象已存在时执行的操作。 有效关键字: (SKIP)跳过, APPEND附加, REPLACE 替换和 TRUNCATE清空表后在添加。


将zhanky目录下zhanky.dmp备份文件中所有数据导入到zhanky库中,但是将users表空间中的数据导入到cs表空间中,scott用户的数据导入到zhanky用户中,sh.selas表的数据导入到system.cstable中。

impdp system/manager@zhanky directory=zhanky remap_tablespace=users:cs remap_schema=scott:zhanky remap_table=sh.selas:cstable full=y

REMAP_TABLESPACE     将表空间对象重新映射到另一个表空间。

REMAP_SCHEMA          将一个方案中的对象加载到另一个方案。

REMAP_TABLE    将表名重新映射到另一个表。例如, REMAP_TABLE=EMP.EMPNO:REMAPPKG.EMPNO。


其实数据泵的导入导出很简单,主要就是理解各个参数的用途,然后各种搭配之用。这次的内容就写到这里,如果有问题欢迎留言指出。