expdp/impdp 数据泵parallel 参数优化测试

expdp/impdp在进行数据迁移时速度极快,通过一定的优化方法,我们让expdp和impdp跑得更加快
1,parallel,在很多oracle的程序中都离不开并行操作,通过利用多core cpu的处理能力(根据自己机器实际情况优化一般不要超过core的2倍),速度增加相当明显
例:frank用户主要有表T1,T2,T3,每个表

中数据有500万行
[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc.dmp
real    0m41.692s
user    0m0.011s
sys     0m0.032s
[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc.dmp parallel=3
real    0m26.710s
user    0m0.019s
sys     0m0.007s
速度提升相当明显,如果每个dw进程都使用单独的dmp文件会更快
[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc%U.dmp parallel=3
real    0m22.928s
user    0m0.017s
sys     0m0.008s
一般建议parall设置不要超过cpu*2.
2,transport_tablespace方法,直接复制表空间文件的方式。使用expdp和impdp只导出了数据字典信息.表空间
要是自包含的
SQL> exec dbms_tts.transport_set_check('USERS',true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
transport tablespace的方法是迁移数据最快的方法。因为数据本身是不需要oracle的sql层来处理.但是表空间
在expdp期间要设置成只读状态

3,network_link模式.当数据文件比较大的时候,这时候在目标库上直接通过network_link模式在目标
库上进行导入,而不需要在源库上进行expdp操作,处理方式和正常的expdp/impdmp过程类似。这样做的
好处主要是可以避免了在源库上写大文件,然后还需要移动到目标库上.
dongdongtang> grant datapump_exp_full_database to frank;
Grant succeeded.
目标库
dongdongtang> create database link frank connect to frank identified by frank using 'frank';
Database link created.
[oracle@localhost admin]$ impdp \'/ as sysdba\' network_link=frank schemas=frank
network_link 定义了一个db_link名称,该过程把源端的frank schemas导入到目标库上.

4,使用适当的方法.expdp/impdp包括了两种主要方法direct_path和external_table
使用direct_path会skip掉sql layer,速度会更快,但是不能定义query
[oracle@localhost ~]$ expdp frank/frank dumpfile=abc.dmp query=T1:"where a>5" access_method=direct_path
ORA-39033: Data cannot be filtered under the direct path access method.
其他的方法还有一些限制,具体可以参考mos相关文档。datapump一般会在启动的时候自动决定使用哪种方式,而且一
旦决定不可以通过interactive的方式修改.可以使用400300来进行trace使用了哪种方式
KUPW:02:03:30.332: 1: TABLE_DATA:"FRANK"."T1" direct path, parallel: 1
KUPW:02:03:30.332: 1: In function GATHER_PARSE_ITEMS
KUPW:02:03:30.332: 1: In function CHECK_FOR_REMAP_NETWORK
 
5,对于index不会并行,对大表有索引的情况下,考虑索引以后单独 使用parallel,nologging重建。事实上在
expdp的导出过程中对索引不会像表数据那样需要导出,索引只导出了ddl语句.

6,statistics的导入可能会非常慢,特别是在10.2之前。在expdp中尽量exclude,在impdp后,使用单独的收集
任务来完成.

7,利用强大的过滤功能,主要的选项有tables,include,exclude和query。tables定义只导出某些需要的表,
include表示只导出某些对像,exclude表示排除某些对像.query可以对表中数据进行过滤,只导出我们需要的
那部分数据.
 
8,利用压缩过功能可以减少dump文件的大小
[oracle@localhost dpdump]$ expdp frank/frank dumpfile=abc.dmp tables=t1
[oracle@localhost dpdump]$ ls -l abc.dmp 
-rw-r----- 1 oracle oinstall 1583874048 Jan 20 03:54 abc.dmp

[oracle@localhost dpdump]$ expdp frank/frank dumpfile=abc.dmp tables=t1 compression=all
[oracle@localhost dpdump]$ ls -l abc.dmp 
-rw-r----- 1 oracle oinstall 197234688 Jan 20 04:29 abc.dmp
可以看到压缩前1.5G,压缩过后只有190M左右.
在12c的版本中,可以通过compression_algorithm来定义压缩算法,常用的压缩级别有:basic,low,medium,high。
结合paralell,可以非常好的利用多core cpu的处理能力.

在11G以前的版本中也有很多的bug会导致datapump变慢的情况,可以查询相关的mos文档.datapump是使用dbms_metadata
和dbms_datapump两个包来完成的,所以shared pool要保证不会太小.
————————————————
版权声明:本文为CSDN博主「当代小学生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shilukun/article/details/82877098

 

 

--------------------------------------------分割线--------------------------------------------------------------------

注,关于并行数量与文件数的关系,网上有如下说法,本人未验证,但可能有用,记录如下:

1、导出文件数量少于并发数时,多于并发将不会工作,也就是说导出文件dumpfile的个数就是有效的parallel并行个数。

2、如果dumpfile 指定一个文件,并发设置过大,在导出过程中可能直接报错(ORA-39095: Dump file space has been exhausted: Unable to allocate 8192 bytes)

3、导入是paralle要小于dump文件数。 如果paralle 大于dump文件的个数,就会因为超过的那个进程获取不到文件,就不能对性能提高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值