重新定义分区 - 大表分区的彻底解决方案与配套工具

                           当前生产环境下,已有很多表成长成了记录数上亿,体积2、30G的大表,站在运维的角度:这种大表再不分区,存在性能与管理隐患;分区,需要停机,影响同步,过程痛苦;为什么不一开始设计时就分区呢? 站在开发的角度:开发任务紧,只会选择熟悉与最快的方式建表,分区我不熟,没有时间去折腾,先让我上线,以后量大了再说;真到量大的时候呢,转换分区太麻烦,能拖则拖; 都是套路,怎么破?
    
运维的痛点是大表转分区麻烦,因为一直采用传统的转换方式:先创建一个新分区表,再把数据插过去,再重命名,重建索引与权限等;已经有了更好的解决方案就是ORACLE自己提供的 在线重定义 ,可以在不停机(不影响交易)情况下的轻松实现分区表转换,应该大力推广,上线就不会那么头疼了;

开发的痛点是不会写合适的分区脚本,以及在线重定义脚本,公司80%以上的开发是不太熟悉分区的,并且他们不愿意投入时间去更深入地学习数据库(搞JAVA的),因此,我特地设计与打造了一个分区脚本自动生成工具,让建分区的成本降低到与普通表完全一样:
attachment.ashx?id=RgAAAAAFPeKPcx3RQrTZ6bMHP7W4BwBmyyY1XpRdTLno998UmCbxAAAKHDAlAADRjYPApDyDSaUhX0SI%2baGTAM3o74tSAAAJ&attcnt=1&attid0=EADc2WRJPiPFQopEhGXmN%2bnM&attcid0=image007.jpg%4001D2F103.F1129B10


attachment.ashx?id=RgAAAAAFPeKPcx3RQrTZ6bMHP7W4BwBmyyY1XpRdTLno998UmCbxAAAKHDAlAADRjYPApDyDSaUhX0SI%2baGTAM3o74tSAAAJ&attcnt=1&attid0=EADXbmS8cuMBTLP6aImLqOuC&attcid0=image008.jpg%4001D2F103.F1129B10


主要实现的功能有 :

1、   普通表转分区表的在线重定义脚本;

只需要简单选择分区方式,就能生成完整的分区转换脚本,按照顺序执行脚本,就能实现已有的表转分区了;oracle推出的在线重定义是个好方案,但问题是,开发人员 不会写脚本, 甚至很多DBA也不熟悉,从而不敢用,生成的脚本我是测试过多次的,而且随着测试次数越多,会越来越可靠,从而现有大表转分区也不再太担心了;



所以,有了这个工具,基本上分区无难事了,从而,表设计规范也要相应的调整:

1、 对于新表,除去基础信息表、配置表,只要是随着时间会不断增长的表(包括日志表),都要求分区,并且审核时将不会再因为上线急而让步;

2、 优先采用自动分区,除非自动分区不适用,才考虑手工分区;

3、 尽量按业务时间 分区,业务时间不适用时,方考虑create_time分区;

4、 如果是预计增长较慢或不确定的(每天不足 1000条的),按“年”分区,不要说量小分区不合算,按年归档,买不了吃亏也买不了上当^_^;

5、 如果是预计增长较快的(每天不超过 10000的),按月分区;

6、 如果是预计增长很快的(每天 1万以上),按天分区,并根据数据量可灵活按(3天、7天)分;

7、 对于生产环境 已经 超过 5G的大表,开发人员可利用工具生成转换脚本,测试后,提交上线;

8、 对于个别不适用于在线重定义的表,仍采用传统的转换方式,后续可考虑支持此种脚本生成;


最后附上工具的下载,就是mydbtools插件,增加了分区生成的新功能,也有了更新,其中get full sql text做了一个彻底的改进,现在已能相当好的实现参数的替换,对于长的绑定变量SQL简直是神器,另外还附加了一个自动安装工具,支持懒人^_^:


20180901更新:


这个功能又进来了彻底的重构,界面更清晰,使用更方便,功能更强大,新建分区、传统分区转换、在线分区转换、以及增加分区都可一键生成,大大提升效率。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13365316/viewspace-2141452/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13365316/viewspace-2141452/

支持自动ORACLE大表分区: 版本进度: 31. 20110420 V2.2 支持任意任意时间字段分区 以下为安装部署部分: 1.分区相关脚本部署执行顺序,安装前请确保该用户拥有管理员权限, 同时请执行GRANT CREATE ANY TABLE TO DBUSER, 因为使用到了动态的CREATE TABLE语句; 01) >AGGRE_ERROR_INFO_DDL.SQL 如果日志AGGRE_ERROR_INFO已经存在,该步骤跳过。 02) >GET_MILLISECOND.SQL 如果函数GET_MILLISECOND已经存在,该步骤跳过。 03) >GET_DATE_FROM_MILLISECOND.SQL 如果函数GET_DATE_FROM_MILLISECOND已经存在,该步骤跳过。 04) >AGGRE_PM_PARTITIONF.SQL 2.注意事项: 01) >部署完后注意检查分区维护JOB[对应存储过程为AGGRE_PM_PARTITIONM], 如果有多个相同的分区维护JOB,则请删除后面创建的JOB,只保留一个分区维护JOB。 检查脚本如下:select t.what,t.* from user_jobs t 02) >本产品中使用的分区调度名称为AGGRE_PARTITION_TASK,可以根据该中信息观察分区情况。 以下为说明解释部分: 2.分区改造主过程:AGGRE_PM_PARTITIONF.SQL, 意思是PARTITIONING THE FIRST TIME; 参数解释如下: -- @PARAM VARCHAR2 PARTTABLENAME---可以指定对某个大小大于等于TABLEONSIZE_M(单位为MB)的进行按指定时间字段的自动分区; -- @PARAM NUMBER TABLEONSIZE_M---大表自动分区起始大小,单位为兆字节(MB),如不想指定具体大小则置0即可; -- @PARAM NUMBER PARTINTERVAL----取值范围为[1/24,365],分区时长,单位为天,默认为1,采用一天一分区; -- @PARAM 若为7,则采用一周一分区,若为30,则采用一月一分区; -- @PARAM NUMBER PARTRESERVED----数据保留时长,单位为天; -- @PARAM NUMBER BACKINTERVAL----取值范围为[3600,7*86400],数据回迁时的循环步长,即一次回迁多长时间的数据,单位为秒; -- @PARAM VARCHAR2 PARTWEEKDAY-----取值范围为(SUN,MON),PARTINTERVAL为7时起作用,指定一周的起始天为星期日还是星期一; -- @PARAM VARCHAR2 PARTFIELD-------指定的分区时间字段名称 -- @PARAM VARCHAR2 FIELDFORMAT-----指定的分区时间字段的格式 -- @PARAM VARCHAR2 TISPARTITIONED--取值范围为(TRUE,FALSE),指定PARTTABLENAME参数所指定的是否是分区,默认为FALSE -- @PARAM VARCHAR2 PARTEXCHANGE----取值范围为(TRUE,FALSE),是否使用交换分区方法实现非分区分区化改造,默认为FALSE -- @PARAM 注意:当PARTEXCHANGE参数为TRUE时,TISPARTITIONED参数只能为FALSE, -- @PARAM 即已经分好区的分区是不能够使用交换分区的方法转换为另一种分区的; -- @PARAM VARCHAR2 DROPPABLE-------取值范围为(TRUE,FALSE),指定分区完后是否DROP掉分区备份; 其中参数FIELDFORMAT的取值范围如下: /** * FIELDFORMAT * 0 NUMBER/CHAR MILLISECOND 1300200064000 13BITS * 1 NUMBER/CHAR SECOND 1300200064 10BITS * 2 NUMBER/CHAR YYYYMMDDHH24MISS 20110315224030 * 3 NUMBER/CHAR YYYYMMDDHH24MI 201103152240 * 4 NUMBER/CHAR YYYYMMDDHH24 2011031522 * 5 NUMBER/CHAR YYYYMMDD 20110315 * 6 NUMBER/CHAR YYYYMM 201103 * 7 NUMBER/CHAR YYYY 2011 * 8 CHAR YYYY-MM 2011-03 * 9 CHAR YYYY-MM-DD 2011-03-15 * 10 CHAR YYYY-MM-DD HH24 2011-03-15 22 * 11 CHAR YYYY-MM-DD HH24:MI 2011-03-15 22:40 * 12 CHAR YYYY-MM-DD HH24:MI:SS 2011-03-15 22:40:30 * 13 CHAR YYYY-MM-DD HH24:MI:SSXFF 2011-03-15 22:40:30.765000 * 14 CHAR YYYY"年" 2011年 * 15 CHAR YYYY"年"MM"月" 2011年03月 * 16 CHAR YYYY"年"MM"月"DD"日" 2011年03月15日 * 17 CHAR YYYY"年"MM"月"DD"日" HH24"时" 2011年03月15日 22时 * 18 CHAR YYYY"年"MM"月"DD"日" HH24"时"MI"分" 2011年03月15日 22时40分 * 19 CHAR YYYY"年"MM"月"DD"日" HH24"时"MI"分"SS"秒" 2011年03月15日 22时40分30秒 * 100 DATE 2011-3-15 23:00:01 * 101 TIMESTAMP 15-3月 -11 10.59.30.953000 下午 +08:00 */ -- 第一次分区尽量在数据库闲时操作,这样更能保证分区的数据一致性; -- 通常使用的现有大表分区方法:A.使用RENAME分区 B.使用交换分区 C.使用联机重定义 只有C方案才能保证数据的完全一致性; -- 但是经过测试发现方案B和C都存在分区过程的不透明性,对EXCEPTION不好控制,另外C方案比较适合手工操作,不适合自动运行; -- B方案比较适合将非分区中的数据放到分区中的一个分区中,不符合要求,所以本分区存储过程默认采用A方案; -- 当然,也支持通过新增参数PARTEXCHANGE来控制是否使用B方案;PARTEXCHANGE为TRUE,使用B方案,为FALSE,使用A方案; -- 手动运行示例: 自动对800M以上的非分区大表PM_RAW_B_RESTEST进行分区,一天一分区; -- 手动运行示例: SQL> EXEC AGGRE_PM_PARTITIONF('PM_RAW_B_RESTEST',800,1,10,3600,'SUN','DCTIME','0','FALSE','FALSE','FALSE'); -- 推荐以以上这种方式对单个进行分区,并将DROPPABLE参数设为'FALSE', -- 这样有什么问题可以跟踪,等完后再可手动将分区备份DROP掉; -- 注意:分区之前请确保相关空间足够大。 -- 注意:如果在分区化改造过程中数据回迁之前抛出异常,则手动数据回迁前注意检查分区有无主键索引。 3.分区维护主过程:AGGRE_PM_PARTITIONM.SQL, 意思是PARTITION MANAGEMENT; 4.创建分区维护JOB -- 对在分区调度中的已经分区进行分区清理以及分区追加等 -- 分区维护操作由该JOB自动完成,该过程不用手动干预。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值