今天个人使用expdp和impdp弄了几个小时,终于整理出大概,对于数据磊工具的原理整理出下面的心得。
expdp/impdp是通过API调用,把传统的exp和imp交互模式的操作转化为oracle内部的job来完成,所以可以实现任务的中止和重启动.
oracle10g中出现了数据磊,数据磊的所有工作都由数据库实例来完成,数据库可以并行来处理这些工作。
可以建立多个数据磊进程来读写正在导入的数据,也可以建立并行I/O服务器进程来读取数据,从而exp和imp的单进程瓶颈得到解决
expdp impdp和exp imp的不同点除了可控制job还有局限于数据磊工具必须在服务器端运行。因为是一种数据库内部的job任务,而且可调控的重启动job任务,加上并行处理的优势往往这些是我们选择expdp和impdp最吸引人的地方
在os界面下expdp -help和imp exp一样oracle软件中存在参考文档。
其中就我们使用过程中于expdp与exp不同的就是directory参数,directory字典参数是什么了,oracle文档的解释是供转储文件和日志文件的使用的目录对象
有过exp和imp使用经验的朋友大概能摸清个大概了
exp ashuang/ashuang file=d:test.dmp log=d:test.log full=y
上面的file也就是转储文件的目录,log也就是日志文件的目录
expdp数据磊把directory参数放dmp转储文件和log文件了,数据磊由于在服务器端工作,导出文件需要写到server端,directory就是存放的位置了
我们可以创建一个directory
create or replace directory expdir_test as 'd:oracleproduct10.2.0expdir'
然后查看dba_directories
select * from dba_directories where directory_name='EXPDIR'
owner directory_name direcort_path
SYS ORACLE_OCM_CONFIG_DIR D:oracleproduct10.2.0db_1ccrstate
其中oracle默认的存储了一个expdp的位置也就是directory_name='DATA_PUMP_DIR'
select * from dba_directories where directory_name='DATA_PUMP_DIR
owner directory_name direcort_path
SYS DATA_PUMP_DIR D:oracleproduct10.2.0admintestdpdump
不设置directory时,oracle将把转储文件和日志文件放置在data_pump_dir目录下
如同exp和imp一样使用数据磊工具也需要授权,由于dmp和log需要放在directory目录下涉及到directory expdir字典进行读写
grant read,write on directory expdir to ashuang
如果此时不授予read,write on directory directory_name使用expdp工具无法打开日志文件进行读写到directory目录下,当然也无法继续expdp当然dba等role是默认的封装在role中了。
准备工作完毕后先在开始试试expdp吧
os环境下:expdp ashuang/ashuang directory=expdir dumpfile=ashuang.dmp logfile=ashuang.log
导出成功,注意上面的dumpfile和logfile不要加路径,因为oracle会存放在directory参数目录下,加路径oracle反而会报错
上面不是提到expdp和impdp是可以oracle内部可以调控的任务job,可以让其重启动和停止。
在数据库内部,重启动是需要一个数据结构MT(Master Table 任务主表),该表用于记录导出和导入的进度。
expdp帮助文档中最后有一些交互模式的参数
continue_client 返回到记录模式,如果系统处于空闲状态,将重新启动作业
start_job 启动恢复作业
status 作业监视状态
stop_job 顺序关闭执行的作业并退出客户机,stop_job=immediate将立即关闭数据类作业
首先启动expdp执行导出操作
expdp ashuang/ashuang directory=expdir dumpfile=ashuang.dmp full=y job_name=expfull
job_name参数在帮助文档中说明是要创建导出作业的名称,字面上就是job的name,好让重启动expdp任务时通过这个来识别吧
其中这个job_name不设置,oracle也会内部创建一个name,但是具体的name是多少,个人查过资料但是生成的table_name确实查不出来。
我们crtl+c退出当前交互模式,退出之后,导出操作不会停止不同于exp,一旦由于网络 个人等因素退出就能基本忠告你这些导出失败
export> status 列出了一些schemas模式 并行度等信息
此时oracle内部还是在进行导出工作,因为job还存在,所以expdp依job存在而存在
export>stop_job 停止该任务
oracle有个交互的工作询问是否停止该作业,需要我们不停的确认y然后停止,如果确认不成功oracle则还是要继续该job,
export>start_job重新启动导出
关于上面的停止任务和开启任务,当我们下次利用attach来继续该job_name时,如果关于attach的job已经结束此时我们无法用attach来连接job_name任务,因为此job_name的job已经结束了。记得上面的提到的MT任务主表吗,job_name是该次expdp的job的名称,在数据库中也可以查到导出任务所创建的MT表
select * from expfull
是可以查到存在此任务主表的。
接下来我们通过attach这个参数再次连接到该任务
os环境下 expdp ashuang/ashuang attach=expfull
用attach参数连接到没有完成的job_name,如果job已经完成了,该任务主表expfull也将随job的执行一起结束
export>continue_client
直接在交互模式下启动continue_client来启动导出任务
MT表中记录了导出过程的详细信息,包括任务设置,启动停止时间等,在oracle内部是通过高级队列来控制任务进度的。oracle在expdp完成以后,通过更新mt来修改对象的状态,这也说明了一个job的完成对应着一个mt任务列表的维护结束。
在expdp排除部分对象的导出。
前面在exo中排除部分表的导出一直比较棘手,oracle10g的expdp增加参数exclude来排除特定的对象类型,include包括特定的对象类型
oracle文档中特定参数的介绍存在一些问题eygle书中给予的用法是
exclude=object_type[:name_clause][,...]
include=object_type[:name_clause][,...]
expdp ashuang/ashuang schemas=ashuang exclude=sequence,table:"IN ('INF_APPLY','INF_APPLY_PROCESS','INF_APPLY_RESULT')"
include和exclude一样,这里就不列举了,其中object_type可以同时定义多个对象类别,name_clause可以定义多个对象列表
当然eygle讲到由于是使用exclude参数可能存在很多特殊字符,在不同的操作系统中可能需要转义字符才能顺利执行,关于所以字符的个人也觉得麻烦,这里我们偷个懒使用parfile参数文件。
首先创建一个parfile.par文件
directory=expdir
schemas=ashuang
dumpfile=test.dmp
include=table: "in ('INF_APPLY','INF_APPLY_PROCESS')"
同样include也支持通配符匹配的导出操作include=TABLE: "LIKE '%INF%'"
然后我们就可以在os下面执行
expdp ashuang/ashuang parfile=d:oracleproduct10.2.0expdirparfile.par
这里和exp的query参数一样,expdp也可以用query参数来检索表中的数据,由于涉及到转义字符,很麻烦的,这里直接用parfile来展示吧
dumpfile=test01.dmp logfile=test01.log directory=dump tables=test04 query=test04:"where rownum<4"
数据磊还有些参数这里就不介绍,由于本人也没有深究过其中的参数使用,关键还是要自己实践才能出东西,数据磊工具是oracle的内部job任务,用MT任务列表来维护,oracle用高级队列来控制任务,所以一旦expdp impdp命令成功,其余的交给oracle的job吧,除非stop_job,不然其job一直在运作直到expdp和impdp结束
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1053083/ ,如需转载,请注明出处,否则将追究法律责任。