Oracle EXPDP/IMPDP 简要教程

Oracle 备份方式:

物理方式:rman
逻辑方式:exp-imp/expdp-impdp
exp-imp/expdp-impdp:两者不同之处在于exp/imp支持服务端/客户端导出导入,而expdp/impdp只能在服务端执行。

延迟段

show parameter DEFERRED_SEGMENT_CREATION; 

DEFERRED_SEGMENT_CREATION {true | flase}
–true 当该参数值等于true的时候,我们数据库中新创建的表,并且没有insert过任何数据的情况下,采用导出时不会将该表导出, 因为在dba_segments和user_segments是查不到该表的信息,只有当我们插入记录才会在两表中生成段的信息,并能导出该表。
–flase 当此参数为false时,不存在dba_segments和user_segments中的段表也可以通过导出的方式将该表导出。

-- 不启用延迟段创建
alter system set DEFERRED_SEGMENT_CREATION=flase scope=both; 

这里重点介绍expdp/impdp,exp和imp实用场景较少,可以自行尝试,expdp和impdp的先决条件需要先创建目录,exp/imp不需要创建,以下场景模拟在linux环境:

--创建目录
mkdir -p /opt/oracle/oracle_dump
create directory directory_name as '/opt/oracle/oracle_dump';
--赋予目录访问权限,默认目录的owner都是sys,所以想将此目录的读写权限赋予其他用户需要新进行赋权。
grant read,write on directory directory_name to other_user;
--查询创建后的目录,expdp导出后的文件会生成在此目录所对应的路径下
select * from dba_directory;

expdp导出案例演示

--导出某用户,用普通用户导出
--dumpfile 需要生成的物理文件名称
--logfile 将导出的过程记录日志
expdp test/test@localhost:1521/opt directory=directory_name dumpfile=test.dmp logfile=test.log
--通过system用户导出某用户
expdp system/Oracle123 directory=directory_name schema=test dumpfile=test2.dmp logfile=test2.log

Note:
1、 在Linux环境中导出前要查看数据库的字符集和Linux的字符集是否匹配,不然会有乱码。
cat .bash_profile
export NLS_LANG=american_america.zhs16gbk --该字符集需要跟数据库对应
2、当我们执行导出的过程中,因为数据量较大可能导出的时间也会较长,这时可以新建一个会话,查询导出的任务情况
3、每个expdp导出的命令都会生成一个job name,这个job的情况会存在于dba_datapump_jobs select * from
dba_datapump_jobs; --通过job_nmame和status可以查看对应导出任务的情况

--通过sys用户导出全库
--full=y 在全库导出下需要将此参数设置成Y
--expdp \"/ as sysdba\" directory=directory_name dumpfile=test3.dmp logfile=test3.log full=y
--通过普通用户导出全库
--赋权限
--datapump_exp_full_database --普通用户没有导出全库的权限,需要通过管理员将此权限赋予才可执行全库导出。
--datapump_imp_full_database --同理,这个是导入前赋权。
grant datapump_exp_full_database to test;
expdp test/test directory=directory_name dumpfile=test4.dmp logfile=test4.log full=y
--导出当前用户名下的表
--tables --指定需要导出的表名,导出多个表需要逗号间隔
expdp test/test directory=directory_name dumpfile=test5.dmp logfile=test5.log tables=test1,test2
--通过system用户导出test用户下t开头的所有表
expdp system/Oracle123 directory=directory_name dumpfile=test6.dmp logfile=test6.log tables=test.t%
--导出当前用户下的表,并剔除某些表,这里只导出test1,剔除test2
--exclude 需要在导出过程中指定剔除的表名,该参数区分大小写,表名必须大写,不然无效。
expdp test/test directory=directory_name dumpfile=test7.dmp logfile=test7.log exclude=table:"in('TEST2')"
--只导出表结构
expdp test/test directory=directory_name dumpfile=test7.dmp logfile=test7.log content=metadata_only tables=test1,test2
--指定版本导出
--version 假设我们在oracle 12c的环境expdp导出,需要在19c的环境导入,如果不加此参数会报错,所以在我们进行
--跨版本的数据迁移或数据库升级导出时,必须要指定导入数据库的版本号,以下我在12c的环境要将数据导入19c
expdp test/test directory=directory_name dumpfile=test7.dmp logfile=test7.log version=19.14.0.0.0

Note:还有其他的一些对象导出方式,例如表空间、程序等都可以指定模块导出。

EXPDP数据一致性导出

FLASHBACK_SCN 选项

  • 用于将会话快照设置回以前状态的 SCN。 – 指定导出特定SCN时刻的表数据
    FLASHBACK_TIME 用于获取最接近指定时间的
    SCN 的时间。 –指定导出特定时间点的表数据,注意FLASHBACK_SCN和FLASHBACK_TIME不能同时使用
SELECT to_char(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER,9999999999999) from dual;

select current_scn as FLASHBACK_SCN from v$database;

expdp hr/hr DIRECTORY=dpump_dir1 DUMPFILE=hr_scn.dmp FLASHBACK_SCN=384632

FLASHBACK_TIME选项

  • 指定导出特定时间点的表数据,可以联系一下FLASHBACK功能。
expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_flash.dmplogfile=orcldev_flash.log SCHEMAS=orcldev FLASHBACK_TIME=“TO_TIMESTAMP(2013-09-28 14:30:00,‘DD-MM-YYYYHH24:MI:SS’)

Note:此一致性校验一般用于生产环境的指定时间点恢复的精确导出。

IMPDP导入案例演示

Note:在日常工作中,多数导出导入的工作都会采用数据泵EXPDP/IMPDP的方式,因为它的功能更强大且效率更高,对大数据量的库或表会比EXP/IMP更友好。

导入表
--首先会先进行导出的操作,将test用户下的所有数据和表结构一并导出。
expdp test/test directory=directory_name dumpfile=test.dmp LOGFILE=test.log flashback_time=sysdate --根据当前时间导出当前的数据截结构和数据
--这里可以做个实验,首先删掉test用户的test1表,再通过test.dmp的只导入test1表的方式进行导入,观察此表数据是否恢复,行数是否正确
impdp test/test directory=directory_name dumpfile=test.dmp tables=test1 
--只导入表结构,不导入数据
impdp test/test directory=directory_name dumpfile=test.dmp tables=test1 content=metadata_only
--只导入表数据,不导入表结构
impdp test/test directory=directory_name dumpfile=test.dmp tables=test1 content=data_only
导入用户
--导入dmp文件包含的所有数据,如果包含超出了test用户权限的数据,需要给予赋予更高的权限test用户才可导入对应数据。
impdp test/test directory=directory_name dumpfile=test.dmp
--将test用户的数据导入test2用户下,跨用户导入建议赋予DBA权限执行
impdp test/test directory=directory_name dumpfile=test.dmp remap_schema=test:test2

Note: 还有更多的导入参数,可以自行了解。

处理数据泵JOB后台进程:

1、Ctrl+C组合键:在执行过程中,可以按Ctrl+C组合键退出当前模式,退出之后,导出操作不会停止。
2、Export>status --查看当前JOB的状态及相关信息
3、Export>stop_job --暂停JOB(暂停JOB后会退出Export>模式)
4、重新进入Export>模式下: expdp test/test attach=test.JOBNAME,这里的JOBNAME在我们执行export开始的时候会打印,也可以通过数据库表(dba_datapump_jobs )查询任务名称
select * from dba_datapump_jobs where state=‘EXECUTING’;
5、Export>start_job --打开暂停的JOB
6、Export>kill_job --取消当前的JOB并释放相关客户会话(将JOB删除同时会删除对应的dmp文件)
7、Export>exit --通过此命令退出Export>模式(通过4)可再进入Export>模式下
8、有时候导入导出开启并行,可以通过以下视图查看 select * from dba_datapump_sessions;

使用480300事件对expdp进行跟踪

1、在expdp/impdp命令后加上一个trace参数,该参数由一个7位的16进制数据组成。
2、前三位指定DataPump组件的代码,后四位一般是0300
3、在使用trace参数时,执行数据泵操作的用户需要具有DBA角色或者EXP_FULL_DATABASE/IMP_FULL_DATABASE的权限。

示例:

--在执行下述导出命令后,我们/trace目录下会生成对应的跟踪文件,dw.trc开头文件表示工作进程文件,dm.trc开头的表示主进程文件,可以通过这两个文件来观察导出的情况
expdp test/test directory=directory_name dumpfile=test.dmp trace=480300

在数据泵卡主的时候,有一个很好的方法来判断:

EXPDP:
在执行导出操作后,会生成对应的dmp文件,如果我们是在数据量较大的情况下导入,有可能会卡在导出某张大表而一直等待,这时可以通过观察dmp文件大小是否在实时变化得知EXPDP是否正常。

IMPDP:
在执行导入操作后,查看导入数据所处的表空间大小的变化,只要表空间大小在变化,说明IMPDP是正常的。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值