对分区表导入导出的水平,垂直切分(r2第22天)

在工作中有时候碰到一些分区表,业务数据量很大,可能几百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个分区,这样会对系统的负载减轻不少,同时也能提高速度。可以看做是水平切分

parallel_no=$5 
target_schema=$4 
for i in {1..${parallel_no}} 
do 
sqlplus -s $1 <<EOF 
set linesize 150 
set pages 0 
set feedback off 
set trimspool  on 
spool $2_partition_parallel_$i.par_temp 
select 'tables=' from dual; 
spool off; 
spool $2_partition_parallel_$i.par_temp append 
 select table_name||':'||partition_name||',' from  ( 
 select rownum,mod(rownum,${parallel_no})+1  parallel_no,table_name,partition_name,num_rows from user_tab_partitions where  table_name=upper('$2') order by num_rows desc  nulls last 
 ) 
where parallel_no=$i; 
spool off; 
spool $2_partition_parallel_$i.par_temp2 
select 'tables=' from dual; 
spool off; 
spool $2_partition_parallel_$i.par_temp2 append 
 select  'PRDAPPO'||'.'||table_name||':'||partition_name||',' from ( 
 select rownum,mod(rownum,${parallel_no})+1  parallel_no,table_name,partition_name,num_rows from user_tab_partitions where  table_name=upper('$2') order by num_rows desc  nulls last 
 ) 
 where parallel_no=$i; 
spool off; 
EOF 
sed -e '/^$/d' -e '$s/.$//'   $2_partition_parallel_$i.par_temp>$2_partition_parallel_$i.par_imp 
rm $2_partition_parallel_$i.par_temp 
sed -e '/^$/d' -e '$s/.$//'   $2_partition_parallel_$i.par_temp2>$2_partition_parallel_$i.par_impdp 
rm $2_partition_parallel_$i.par_temp2 
echo exp $1 file=par${i}_$2.dmp log=par${i}_$2_exp.log   statistics=none grants=n constraints=n indexes=n   parfile=$2_partition_parallel_$i.par_imp buffer=9102000  "&" >>  $2_partition_parallel_export.sh 
echo imp $1 file=par${i}_$2.dmp log=par${i}_$2_imp.log   statistics=none grants=n constraints=n indexes=n   parfile=$2_partition_parallel_$i.par_imp buffer=91020000 ignore=Y commit=y  "&" >> $2_partition_parallel_import.sh 
echo expdp $1 directory=memo_dir dumpfile=par${i}_$2.dmp  logfile=par${i}_$2_expdp.log parfile=$2_partition_parallel_$i.par_imp   exclude=statistics,constraint,ref_constraint,index,comment,grant  "  &"  >> $2_partition_parallel_expdp.sh & 
echo "nohup " impdp $1 directory=memo_dir  dumpfile=par${i}_$2.dmp parallel=2 include=table_data  logfile=par${i}_$2_impdp.log parfile=$2_partition_parallel_$i.par_impdp  TABLE_EXISTS_ACTION=append REMAP_SCHEMA=prdappo:MIG_TEST  DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS   "  &" >>  $2_partition_parallel_impdp.sh & 

生成的parfile文件和parallel导入导出脚本如下:

-rw-r--r-- 1 testuser1  dba  1231 Jun 19 14:16 big_table_partition_parallel_1.par_imp
-rw-r--r-- 1  testuser1 dba  1687 Jun 19 14:16  big_table_partition_parallel_1.par_impdp
-rw-r--r-- 1 testuser1 dba  1253 Jun  19 14:16 big_table_partition_parallel_2.par_imp
-rw-r--r-- 1 testuser1 dba   1717 Jun 19 14:16 big_table_partition_parallel_2.par_impdp
-rw-r--r-- 1  testuser1 dba  1255 Jun 19 14:16  big_table_partition_parallel_3.par_imp
-rw-r--r-- 1 testuser1 dba  1719 Jun  19 14:16 big_table_partition_parallel_3.par_impdp
-rw-r--r-- 1 testuser1 dba   1255 Jun 19 14:16 big_table_partition_parallel_4.par_imp
-rw-r--r-- 1  testuser1 dba  1719 Jun 19 14:16  big_table_partition_parallel_4.par_impdp
-rw-r--r-- 1 testuser1 dba  1273 Jun  19 14:16 big_table_partition_parallel_5.par_imp
-rw-r--r-- 1 testuser1 dba   1737 Jun 19 14:16 big_table_partition_parallel_5.par_impdp
-rw-r--r-- 1  testuser1 dba  2150 Jun 19 14:16  big_table_partition_parallel_expdp.sh
-rw-r--r-- 1 testuser1 dba   905 Jun 19  14:16 big_table_partition_parallel_export.sh
-rw-r--r-- 1 testuser1 dba  1410  Jun 19 14:16 big_table_partition_parallel_impdp.sh
-rw-r--r-- 1 testuser1  dba  1010 Jun 19 15:08 big_table_partition_parallel_import.sh
-rw-r--r-- 1  testuser1 dba  5609 Jun 19 10:52 par1_big_table_expdp.log
-rw-r--r-- 1  testuser1 dba  5120 Jun 19 14:36 par1_big_table_exp.log
-rw-r--r-- 1  testuser1 dba     0 Jun 19 15:10 par1_big_table_imp.log
-rw-r--r-- 1  testuser1 dba  5688 Jun 19 10:52 par2_big_table_expdp.log
-rw-r--r-- 1  testuser1 dba  5200 Jun 19 14:37 par2_big_table_exp.log
-rw-r--r-- 1  testuser1 dba     0 Jun 19 15:10 par2_big_table_imp.log
-rw-r--r-- 1  testuser1 dba  5688 Jun 19 10:53 par3_big_table_expdp.log
-rw-r--r-- 1  testuser1 dba  5200 Jun 19 14:46 par3_big_table_exp.log
-rw-r--r-- 1  testuser1 dba     0 Jun 19 15:10 par3_big_table_imp.log
-rw-r--r-- 1  testuser1 dba  5688 Jun 19 10:53 par4_big_table_expdp.log
-rw-r--r-- 1  testuser1 dba  5200 Jun 19 14:38 par4_big_table_exp.log
-rw-r--r-- 1  testuser1 dba     0 Jun 19 15:10 par4_big_table_imp.log
-rw-r--r-- 1  testuser1 dba  5698 Jun 19 10:52 par5_big_table_expdp.log
-rw-r--r-- 1  testuser1 dba  5200 Jun 19 14:37 par5_big_table_exp.log
-rw-r--r-- 1  testuser1 dba     0 Jun 19 15:10 par5_big_table_imp.log 

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

最简单的Docker镜像教程:从头基于空镜像scratch创建一个新的Docker镜像

我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下...

27600
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和使用Docker Compose

Docker是一个很棒的工具,但要真正充分发挥其潜力,最好是应用程序的每个组件都在自己的容器中运行。对于具有大量组件的复杂应用程序,编排所有容器以一起启动和关闭...

48810
来自专栏A周立SpringCloud

Docker系列教程12-使用Maven插件构建Docker镜像

我们知道,Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,那么我们的工作就能得到进一步的简化。 经过调研,以下几款Mave...

50390
来自专栏Java 源码分析

Docker 入门

27960
来自专栏容器云生态

如何优雅的编写Dockerfile

在生产环境中一般我们会对基本的环境进行自构建,从而利用images的分层特性去层层构建上层的业务镜像。 1.默认情况下我们会首先构建一个基本的base镜像,这...

1.2K80
来自专栏极客慕白的成长之路

系统学习Docker践行DevOps理念(一)

0x1.传统应用运维的弊端 * 部署非常慢成本非常高资源浪费 * 难于迁移和扩展可 * 能会被限定硬件厂商

11610
来自专栏沈唁志

什么是Docker?Docker的快速入门教程

Docker 从2013年发布至今, 许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?

9630
来自专栏磨磨谈

基于docker部署ceph以及修改docker image

容器和ceph的结合已经在一些生产环境当中做了尝试,容器的好处就是对运行环境的一个封装,传统的方式是集成为ISO,这个需要一定的维护量,而容器的相关操作会简单很...

17420
来自专栏写代码的海盗

Docker学习总结之docker入门 What is Docker?What can I use Docker for?What are the major Docker components?

  Understanding Docker 以下均翻译自Docker官方文档 ,转载请注明:Vikings翻译。 What is Docker? Dock...

28030
来自专栏吴伟祥

Docker学习总结——理解Docker与安装(一) 顶

Docker 是一个开源的应用容器引擎(软件工业上的集装箱技术),让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上...

12210

扫码关注云+社区

领取腾讯云代金券