批量转换分区表为普通表(r2笔记92天)
今天数据迁移的小组找到我,希望我能够重新构建一些测试环境,其中测试环境中的一些分区表都需要去掉分区,转换成普通表的形式,因为他们在做一些工作的时候碰到了问题,而且希望必要的约束等都保留,这个需求听起来倒不复杂,很清晰,我看了下需要转换的表,一看有将近100多个,而且重构好几套环境,想想都头疼。
这个需求是很特别,至少从数据库层面是不支持的。
一种类似就是通过exp/imp 做数据结构的同步,生成对应的ddl语句,然后解析ddl语句,把分区的部分剔除。
因为exp生成的ddl语句含有很多的存储细节,storage,segment_attributes等,解析的过程也更为复杂,不好控制。
还有一种思路就是通过dbms_metadata来生成ddl语句,先过滤一些不必要的ddl细节,然后在生成的ddl语句中剔除分区信息。
这个部分相对来说要稍微容易一些。
可以通过如下的脚本来生成不含有分区信息的ddl语句。
大体思路就是先生成ddl语句,然后在关键字中截取"PARTITION BY"之上的部分。
#chg_partition.sh
sqlplus -s n1/n1@testdb <<EOF
select *from dual;
set linesize 300
set pages 0
col sql_text format a300
set feedback off
set long 99999
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',true);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'REF_CONSTRAINTS',false);
spool tmp_$1.sql
select 'select DBMS_METADATA.GET_DDL('||chr(39)||'TABLE'||chr(39)||','||chr(39)||table_name||chr(39)||','||chr(39)||owner||chr(39)||') sql_text from dual; 'FROM all_tables where owner='N1' and table_name in
(
upper('$1')
);
spool off;
spool $1_ddl.tmp
@tmp_$1.sql
spool off
EOF
last_line=`grep -n "PARTITION BY" $1_ddl.tmp|awk -F: '{print $1}'`
last_line=`expr $last_line - 1`
sed -n '1,'$last_line'p' $1_ddl.tmp > tmp_$1_ddl.sql1
sed 's/PRDAPPO/'$2'/' tmp_$1_ddl.sql1 > tmp_$1_ddl.sql
echo ";" >> tmp_$1_ddl.sql
rm $1_ddl.tmp
rm tmp_$1_ddl.sql1
如果我们指定需要处理的表为 CUSTOMER_INFO,处理之后生成的文件就会使如下的样子。
-rw-r--r-- 1 xxxxx dba 5723 Sep 11 14:32 tmp_CUSTOMER_INFO_ddl.sql
如果目前有100多个表。
可以写一个简单的入口文件来调用chg_partition.sh 即可,这样不管有多少表需要转换都可以一次搞定,最后生成一个run.sql的文件,直接运行run.sql就可以创建所有的表了。
ksh chg_partition.sh MENT_RESOURCE CONV_TEST
ksh chg_partition.sh ES_HISTORY CONV_TEST
ksh chg_partition.sh GED_TRIAL_BALANCE CONV_TEST
ksh chg_partition.sh HARGES CONV_TEST
ksh chg_partition.sh HARGE_GROUP CONV_TEST
ksh chg_partition.sh REDIT_DEBIT_LINK CONV_TEST
ksh chg_partition.sh USTOMER_CREDIT CONV_TEST
ksh chg_partition.sh NVOICE CONV_TEST
ksh chg_partition.sh AYMENT CONV_TEST
ksh chg_partition.sh AYMENT_ACTIVITY CONV_TEST
ksh chg_partition.sh AYMENT_DETAILS CONV_TEST
ksh chg_partition.sh AX_ITEM CONV_TEST
ksh chg_partition.sh RANSACTION_LOG CONV_TEST
ksh chg_partition.sh NAPPLIED_CREDIT CONV_TEST
ksh chg_partition.sh ILL_STATEMENT CONV_TEST
ksh chg_partition.sh HARGE CONV_TEST
ksh chg_partition.sh USTOMER_INFO CONV_TEST
ksh chg_partition.sh YCLE_CUSTOMERS CONV_TEST
ksh chg_partition.sh YC_PAYER_POP CONV_TEST
ksh chg_partition.sh OCUMENT CONV_TEST
ksh chg_partition.sh NVOICE CONV_TEST
ksh chg_partition.sh NV_CHARGE_REL CONV_TEST
ksh chg_partition.sh C_RATES CONV_TEST
ksh chg_partition.sh AX CONV_TEST
ksh chg_partition.sh AX_ITEM CONV_TEST
ksh chg_partition.sh REATMENT_ACTIVITY CONV_TEST
ksh chg_partition.sh GREEMENT_PARAM CONV_TEST
ksh chg_partition.sh GR_PRM_HISTORY CONV_TEST
ksh chg_partition.sh R_GRP_MEMBERS CONV_TEST
ksh chg_partition.sh EMO CONV_TEST
ls -lrt *.sql |awk '{print "@"$9}' > run.sql
- js处理异常try{}catch(e){}
- 1634: [Usaco2007 Jan]Protecting the Flowers 护花
- C#用链式方法表达循环嵌套1
- C#用链式方法表达循环嵌套2
- 【开源】1句代码搞定图片批量上传,无需什么代码功底【无语言界限】
- C#异步调用的方法
- 【David Silver 深度强化学习教程代码实战07】 DQN的实现
- AutoMapper随笔记
- 简析.NET Core 以及与 .NET Framework的关系
- 1627: [Usaco2007 Dec]穿越泥地
- 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
- 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
- Polyspace不认识Interrupt,肿么办?
- 1639: [Usaco2007 Mar]Monthly Expense 月度开支
- 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 数组属性和方法
- 一天一大 lee(恢复二叉搜索树)难度:困难-Day20200808
- 一天一大 leet(最小区间)难度:困难-Day20200801
- 一天一大 lee(全排列 II)难度:中等-Day20200918
- 一天一大 lee(冗余连接 II)难度:困难-Day20200917
- 一天一大 lee(左叶子之和)难度:简单-Day20200919
- 【一天一大 lee】 把二叉搜索树转换为累加树 (难度:简单)-Day20200921
- 【一天一大 lee】子集 (难度:中等)-Day20200920
- 用了这个jupyter插件,我已经半个月没打开过excel了
- Webpack学习笔记
- 正则表达式学习笔记
- R 可视化 | 华夫饼图
- 绝了!Python定时爬取微博热搜+pyecharts动态图展示
- 实战 | Python爬取B站柯南弹幕+Gephi梳理主线剧情
- 别再问我 Python 怎么识别数字验证码了!
- Python自动化办公 | 同事要我帮忙补写178份Word日报!别闹!