对分区表导入导出的水平,垂直切分

在工作中有时候碰到一些分区表,业务数据量很大,可能几百G,上T的规模,而且做数据的导入导出的时候,会感觉到exp/expdp的时候生成的dump文件太大了,做导入的时候也是很重的负担。比如500G的dump,你在使用imp做导入的时候,别无选择,只能看着日志里partition里的数据一个一个被导入。impdp可能稍微好点,还能指定个并行,但是问题又来了,一个500G的dump。impdp是在最后才做commit。对于数据空间和Undo,cpu资源都是挑战。


分区表有一个地方和普通表不同,对于每个分区可以单独做dml,不会影响其他的分区,当然了,你得指定分区名。
基于以上的情况,我写了一个脚本来完成exp/expdp,把一个很大的分区表按照分区生成对应的dump文件,如果分区有100个分区,那么就会有100个dump文件。在数据导入的时候,也可以分区导入,以分区的形式单独做导入,相当于把一个大的事物分成很多小的部分。可以看做是垂直切分
比如说表big_table有100个分区,生成了100个dump,导出的时候一般比较快,导入的时候问题就来了。如果开启100个单独的进程去导入,系统负载不一定能接受,Undo的大小肯定不能保证这么多的大事务,很可能会有Undo空间的问题。

这个时候可以考虑开启几个并行的进程来做数据导入,比如开启5个进程来做数据导入,每个进程包含20个分区,这样会对系统的负载减轻不少,同时也能提高速度。可以看做是水平切分


查询含有LONG类型字段的表

select DISTINCT a.table_name fromdba_tab_columns a,dba_segments b where a.table_name=b.segment_name and b.owner='BILL' AND A.DATA_TYPE IN ('LONG') AND B.segment_TYPE='TABLE'order by 1;


查看分区表大小:

 

SQL>select segment_name,sum(bytes)/1024/1024/1024 from dba_segments where owner='BILL'andsegment_name in(select DISTINCT table_name from dba_tables where partitioned = 'YES' and owner='BILL') group bysegment_name;


每个分区生成一个dmp文件

setline 300 pagesize 49999

Select'exp bill/bisys3#$ buffer=209715200 direct=y CONSTRAINTS=no TRIGGERS=noINDEXES=no STATISTICS=none recordlength=65535file='||table_name||'_'||partition_name||'.dmplog='||table_name||'_'||partition_name||'.logtables='||table_name||':'||partition_name||'' From dba_tab_partitions WhereTABLE_OWNER='BILL' and table_name='DAILYSESSION_TABLE';


set line 300 pagesize 49999

Select 'imp BILL/BILL buffer=209715200 feedback=100000ignore=y recordlength=65535 file='||table_name||'_'||partition_name||'.dmp log=imp_'||table_name||'_'||partition_name||'.logtables='||table_name||':'||partition_name||'' From dba_tab_partitions WhereTABLE_OWNER='BILL' and table_name='DAILYSESSION_TABLE';


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值