title: Oracle系列之一:备份还原之:EXP、IMP和EXPDP、IMPDP
categories: Linux
tags:
- Oracle
timezone: Asia/Shanghai
date: 2019-02-01
环境
[root@rehl7501 oracle]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.5 (Maipo)
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
简介
1、exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。
2、expdp和impdp是服务端的工具程序,他们只能在oracle服务端使用,不能在客户端使用。
3、imp只适用于exp导出的文件,不适用于expdp导出文件;impdp只适用于expdp导出的文件,而不适用于exp导出文件。
EXP\IMP方式在备份的时候如果备份文件已经存在,会直接覆盖
EXPDP\IMPDP数据泵方式如果备份文件已经存在,会报错
方法1:EXP\IMP方式备份和还原数据库
1.1.EXP备份:传统路径导出
# 用户模式:备份admin用户的所有表
exp admin/[email protected]/oracledb FILE=/home/oracle/full.dmp LOG=/home/oracle/full.log OWNER=admin
# 表模式(只导出C_CONS, DATASOURCE两个表数据)
exp admin/[email protected]/oracledb FILE=/home/oracle/full.dmp LOG=/home/oracle/full.log TABLES=C_CONS, DATASOURCE
ROWS=N # 可以加此参数只导出数据库结构而不导出数据
1.2.EXP备份:直接路径导出
# 用户模式:备份admin用户的所有表
exp admin/[email protected]/oracledb FILE=/home/oracle/full.dmp LOG=/home/oracle/full.log OWNER=admin \
recordlength=65535 direct=y buffer=104857600
# 表模式(只导出C_CONS, DATASOURCE两个表数据)
exp admin/[email protected]/oracledb FILE=/home/oracle/full.dmp LOG=/home/oracle/full.log TABLES=C_CONS, DATASOURCE \
recordlength=65535 direct=y buffer=104857600
ROWS=N # 可以加此参数只导出数据库结构而不导出数据
1.3.传统路径导出和直接路径导出对比
1.两者的差异
a.传统路径模式,使用SQL SELECT语句抽取表数据。数据从磁盘读入到buffer cache缓冲区中,行被转移到评估缓冲区。
在此之后根据SQL表达式,将记录返回给导出客户端,然后写入到dump文件。
b.直接导出模式,数据直接从磁盘中读取到导出session的PGA中,行被直接转移到导出session的私有缓冲区,从而跳过SQL命令处理层。
避免了不必要的数据转换。最后记录返回给导出客户端,写到dump文件。
2.性能问题
a.直接路径导出方式比传统路径方式具有更优的性能,速度更快,因为绕过了SQL命令处理部分。
b.直接路径导出方式支持RECORDLENGTH参数(最大为64k),该参数值通常建议设置为系统I/O或者DB_BLOCK_SIZE的整数倍
c.影响直接路径导出的具体因素(DB_BLOCK_SIZE,列的类型,I/O性能,即数据文件所在的磁盘驱动器是否单独于dump文件所在的磁盘驱动器)
d.无论是直接路径导出还是传统路径导出产生的dump,在使用imp方式导入时,会耗用相同的时间
3、直接路径导出的限制
a.直接路径导出不支持交互模式
b.不支持表空间传输模式(即TRANSPORT_TABLESPACES=Y不被支持),支持的是FULL,OWNER,TABLES导出方式
c.不支持QUERY查询方式,如exp scott/tige TABLES=emp QUERY="WHERE job=‘SALESMAN’ " 不被支持
e.直接路径导出使用RECORDLENGTH设置一次可以导出数据的量,取代传统路径使用buffer的设置
e.直接路径导出要求NLS_LANG环境参数等于数据库字符集,负责收到EXP-41警告及EXP-0终止错误
2.IMP还原:
# 用户模式:恢复所有表
imp admin/xiaoliu FILE=/home/oracle/full.dmp LOG=/home/oracle/full.log FROMUSER=user_pssc_sm64 TOUSER=admin
imp admin/xiaoliu FILE=/home/oracle/full.dmp LOG=/home/oracle/full.log FULL=y
# 表模式:(只恢复C_CONS, DATASOURCE两个表数据)
imp admin/xiaoliu FILE=/home/oracle/full.dmp FROMUSER=user_pssc_sm64 TOUSER=admin TABLES=C_CONS, DATASOURCE
imp admin/xiaoliu FILE=/home/oracle/full.dmp TABLES=C_CONS, DATASOURCE
ignore=y # 表示忽略创建错误,继续后面的操作
# Oracle不执行CREATE TABLE语句,直接将数据插入到表中
# 假如插入的记录违反了约束条件,比如主键约束
# 则出错的记录不会插入,但合法的记录会添加到表中。
ignore=n # Oracle不执行CREATE TABLE语句
# 同时也不会将数据插入到表中
# 而是忽略该表的错误,继续恢复下一个表。
方法2:EXPDP\IMPDP数据泵方式备份和还原数据库
准备工作
su - oracle
mkdir -p /home/oracle/bak/
sqlplus / as sysdba
select * from dba_directories;
CREATE OR REPLACE DIRECTORY bak AS '/home/oracle/bak/';
GRANT READ, WRITE ON DIRECTORY test_dir TO scott;
1.用户模式:备份和恢复admin的所有表
# 普通方式导入导出
expdp admin/xiaoliu SCHEMAS=admin DIRECTORY=bak DUMPFILE=full.dmp LOGFILE=full.log COMPRESSION=all
impdp admin/xiaoliu SCHEMAS=admin DIRECTORY=bak DUMPFILE=full.dmp LOGFILE=full.log
# 开启并行模式
expdp admin/xiaoliu SCHEMAS=admin DIRECTORY=bak DUMPFILE=full_%U.dmp LOGFILE=full.log COMPRESSION=all PARALLEL=2
impdp admin/xiaoliu SCHEMAS=admin DIRECTORY=bak DUMPFILE=full_%U.dmp LOGFILE=full.log PARALLEL=2
COMPRESSION={ALL | DATA_ONLY | METADATA_ONLY | NONE}
ALL:压缩元数据和数据。
DATA_ONLY:仅压缩数据。
METADATA_ONLY:仅压缩元数据。这是默认设置。
NONE:什么都没有被压缩。
PARALLEL=4 # 并行导入和导出,这里的4一般设置为CPU的个数,可提高效率
CLUSTER=NO # 对于小作业,最好指定CLUSTER = NO来约束作业在启动它的实例上运行。
# 使用CLUSTER参数可能会影响性能
# 因为跨Oracle RAC实例分发导出作业会产生一些额外的开销。
2.表模式:只备份和恢复C_CONS, DATASOURCE表
expdp admin/xiaoliu TABLES=C_CONS, DATASOURCE DIRECTORY=bak DUMPFILE=full.dmp LOGFILE=full.log COMPRESSION=all
impdp admin/xiaoliu TABLES=C_CONS, DATASOURCE DIRECTORY=bak DUMPFILE=full.dmp LOGFILE=full.log
COMPRESSION={ALL | DATA_ONLY | METADATA_ONLY | NONE}
ALL:压缩元数据和数据。
DATA_ONLY:仅压缩数据。
METADATA_ONLY:仅压缩元数据。这是默认设置。
NONE:什么都没有被压缩。
PARALLEL=4 # 并行导入和导出,这里的4一般设置为CPU的核数,可提高效率
CLUSTER=NO # 对于小作业,最好指定CLUSTER = NO来约束作业在启动它的实例上运行。
# 使用CLUSTER参数可能会影响性能
# 因为跨Oracle RAC实例分发导出作业会产生一些额外的开销。
3.按查询条件
expdp admin/xiaoliu DIRECTORY=bak DUMPFILE=full.dmp LOGFILE=full.log COMPRESSION=all TABLES=C_CONS QUERY=WHERE ROWNUM < 1000
impdp admin/xiaoliu DIRECTORY=bak DUMPFILE=full.dmp LOGFILE=full.log
COMPRESSION={ALL | DATA_ONLY | METADATA_ONLY | NONE}
ALL:压缩元数据和数据。
DATA_ONLY:仅压缩数据。
METADATA_ONLY:仅压缩元数据。这是默认设置。
NONE:什么都没有被压缩。
PARALLEL=4 # 并行导入和导出,这里的4一般设置为CPU的个数,可提高效率
CLUSTER=NO # 对于小作业,最好指定CLUSTER = NO来约束作业在启动它的实例上运行。
# 使用CLUSTER参数可能会影响性能
# 因为跨Oracle RAC实例分发导出作业会产生一些额外的开销。
附录:EXPDP\IMPDP数据泵方式在RAC环境中使用的说明
在Oracle RAC环境中导出期间使用PARALLEL
在Oracle Real Application Clusters(Oracle RAC)环境中,如果导出操作的PARALLEL = 1,则所有Data Pump进程都驻留在启动作业的实例上。 因此,目录对象可以指向该实例的本地存储。
如果导出操作将PARALLEL设置为大于1的值,则数据泵进程可以驻留在作业启动的实例之外的实例上。 因此,目录对象必须指向可由Oracle RAC的所有实例访问的共享存储。
限制
此参数仅在Oracle Database 11g企业版中有效。
####英文:
Using PARALLEL During An Export In An Oracle RAC Environment
In an Oracle Real Application Clusters (Oracle RAC) environment, if an export operation has PARALLEL=1, then all Data Pump processes reside on the instance where the job is started. Therefore, the directory object can point to local storage for that instance.
If the export operation has PARALLEL set to a value greater than 1, then Data Pump processes can reside on instances other than the one where the job was started. Therefore, the directory object must point to shared storage that is accessible by all instances of the Oracle RAC.
Restrictions
This parameter is valid only in the Enterprise Edition of Oracle Database 11g.