对分区表导入导出的水平,垂直切分(r2第22天)
时间:2022-05-04
本文章向大家介绍对分区表导入导出的水平,垂直切分(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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法