1、什么是数据泵技术?
几乎所有DBA都熟悉 Oracle 的导出和导入实用程序,它们将数据装载进或卸载出数据库,在 Oracle database 10g和11g中,你必须使用更通用更强大的数据泵导出和导入(Data Pump Export and Import)实用程序导出和导入数据。以前的导出和导入实用程序在oracle database 11g中仍然可以使用,但是Oracle强烈建议使用数据泵(Data Pump)技术,因为它提供了更多的高级特性。例如:
你可以中断导出/导入作业,然后恢复它们;
可以重新启动已失败的导出和导入作业;
可以重映射对象属性以修改对象;
可以容易地从另一个会话中监控数据泵的作业,甚至可以在作业过程中修改其属性;
使用并行技术很容易快速移动大量的数据;
因为oracle提供了针对数据泵技术的API,所以可以容易地在PL/SQL程序中包含导出/导入作业;
可以使用更强大的可移植表空间特性来快速移植大量的数据,甚至可在不同操作系统平台之间移动。
与旧的导出和导入实用程序不同,数据泵程序有一组可以在命令行中使用的参数以及一组只能以交互方式使用的特殊命令,你可以通过在命令行中输入expdp help = y 或者 impdp help = y快速获取所有数据泵参数及命令的概述。
2、数据泵技术的优缺点
原有的导出和导入技术基于客户机,而数据泵技术基于服务器。默认所有的转储,日志和其他文件都建立在服务器上。数据泵技术的主要优点有:
改进了性能;
重新启动作业的能力;
并行执行的能力;
关联运行作业的能力;
估算空间需求的能力;
操作的网格方式;
细粒度数据导入功能;
重映射能力;
当然、数据泵技术也有其自身的缺点:数据泵是服务端的实用程序,只能在数据库服务器上执行,不能在客户端执行。
3、数据泵技术应用场景
将数据从开发环境转到测试环境或产品环境;
在不同的操作系统平台上的oracle数据库直接的传递数据;
在修改重要表之前进行备份;
备份数据库;
把数据库对象从一个表空间移动到另一个表空间;
在数据库直接移植表空间;
提取表或其他对象的DDL;
注意:数据库不建立完备的备份,因为在导出文件中没有灾难发生时的最新数据。但是对于较小的数据库和个别的表空间的导出,数据导出仍然是一个可行的备份工具。
4、数据泵的组成
数据泵技术主要有三个以下部件组成:
DBMS_DATAPUMP:这是驱动数据字段元数据装载和卸载的主要引擎。DBMS_DATAPUMP程序包包括数据泵技术的核心部分,此核心部分以过程的形式出现,实际驱动数据装载和卸载。
DBMS_METADATA:为了提取并修改元数据,Oracle提供了DBMS_METADATA程序包。
命令行客户机:两个实用程序——-expdp和impdp进行导出和导入工作。
5、数据泵的导出
我们一般通过expdp命令进行数据导出,一般expdp流程为:新建逻辑目录–查看目录是否存储–执行expdp导出数据。为了避免出现错误,我们最好以system等管理员用户创建逻辑目录。Oracle不会自动创建实际的物理目录,Oracle仅仅是执行了逻辑路径的定义。例如:D:\oracleData(创建逻辑目录后我们需要手动去创建此目录),具体操作如下:
# 查看管理员目录
select * from dba_directories;
# 创建目录,用于数据的导出路径
创建目录:D:\oracle\DATA_DIR
create directory DATA_DIR as 'D:\oracle\DATA_DIR';
3.给目录赋权用户(也可以使用system用户)
grant read,write on directory DATA_DIR to scott;
注:system用户默认就具有所有管理权限、不用单独赋权。
创建完逻辑目录以后我们就可以通过下面的命令来导出数据了(在CMD命令行下执行下面的命令)。
# 按用户导出(修改为对应数据库的管理用户)
expdp system/12345678 schemas=system dumpfile=system_user.dmp DIRECTORY=DATA_DIR;
# 并行进程parallel
expdp system/12345678 DIRECTORY=DATA_DIR dumpfile=system_user.dmp parallel=40 job_name=system;
# 按表名导出
expdp system/12345678 TABLES=emp dumpfile=system_user.dmp DIRECTORY=DATA_DIR;
# 按查询条件导出
expdp system/12345678 directory=DATA_DIR dumpfile=SALGRADE.dmp tables=salgrade query=salgrade:'WHERE hisal>1400';
# 按表空间导出
expdp system/12345678 DIRECTORY=DATA_DIR DUMPFILE=casdb.dmp TABLESPACES=casdb;
# 导出整个数据库
expdp system/12345678 DIRECTORY=DATA_DIR DUMPFILE=full.dmp FULL=y;
注:这里我们把整个数据库全部导出、执行完上面的导出命令之后,我们可以等待数据导出完成;完成之后我们可以看到“成功完成”几个字;也可以去 D:\oracle\DATA_DIR 目录查看导出日志和导出的数据库文件。
6、数据泵的导入
在正式导入数据前,要先确保要导入的用户已存在,如果没有存在,我们需要先新建用户。我们可以去原数据库里面查询已有的关联用户,然后在新环境里面进行创建:
# 查询OPEN用户
select username from dba_users where account_status='OPEN';
# 创建用户
create user username identified by password;
create user z0ukun identified by 123456;
# 修改用户密码
alter user z0ukun identified by 234556;
# 撤销用户
drop user z0ukun;
当使用IMPDP完成数据库导入时,如遇到表已存在时,Oracle提供给我们如下四种处理方式:
- 忽略(SKIP,默认行为);
- 在原有数据基础上继续增加(APPEND);
- 先DROP表,然后创建表,最后完成数据插入(REPLACE);
- 先TRUNCATE,再完成数据插入(TRUNCATE)。
# 导到指定用户下
impdp system/12345678 DIRECTORY=DATA_DIR DUMPFILE=scott_user.dmp SCHEMAS=c##scott TABLE_EXISTS_ACTION=REPLACE;
# 改变表的owner
impdp system/12345678 DIRECTORY=DATA_DIR DUMPFILE=SALGRADE.dmp REMAP_SCHEMA=c##scott:c##dm_ca remap_tablespace=USERS:casdb;
# 导入表空间
impdp system/12345678 DIRECTORY=DATA_DIR DUMPFILE=casdb.dmp TABLESPACES=casdb;
# 导入数据库
impdp system/12345678 DIRECTORY=DATA_DIR DUMPFILE=full.dmp FULL=y;
注:我们可以使用上面的命令进行数据导入,感兴趣的同学可以自动测试、这里就不再详细描述了。