批量转换分区表为普通表

简介: 今天数据迁移的小组找到我,希望我能够重新构建一些测试环境,其中测试环境中的一些分区表都需要去掉分区,转换成普通表的形式,因为他们在做一些工作的时候碰到了问题,而且希望必要的约束等都保留,这个需求听起来倒不复杂,很清晰,我看了下需要转换的表,一看有将近100多个,而且重构好几套环境,想想都头疼。
今天数据迁移的小组找到我,希望我能够重新构建一些测试环境,其中测试环境中的一些分区表都需要去掉分区,转换成普通表的形式,因为他们在做一些工作的时候碰到了问题,而且希望必要的约束等都保留,这个需求听起来倒不复杂,很清晰,我看了下需要转换的表,一看有将近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  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


目录
相关文章
|
负载均衡 Oracle 网络协议
Oracle RAC中REMOTE_LISTENER和local_listener的作用是什么?
Oracle RAC中REMOTE_LISTENER和local_listener的作用是什么?
1172 0
|
4天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1106 0
|
3天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
527 10
|
13天前
|
人工智能 运维 安全
|
12天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
4天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
301 0
|
11天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
807 23
|
4天前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。