一次大数据表分区方案设计

1.分区方案的背景设计

由于系统架构老旧,模型方案设计时的欠缺,导致分区方案的整改碰到了很多问题,以往使用的是历史归档表的形式归档数据,使得主表数据量减少,核心功能的读写就不会碰到问题,但是缺点时导致数据库表数量增加,账单整理困难,以往历史数据查询连表太多,查询速度太慢等问题,考虑用分区方案解决,分区方案的设计使用了组合分区的形式。

2.问题集合

1)由于表结构的设计太过集中,没有按照三个范式的原则进行设计,导致业务增加及数据量增加后,只能把业务集中在一张数据表,导致应用功能与数据库表之间耦合度太强,动一发而牵全身,数据库业务主表出现问题,会使得整个平台无法运转,甚至崩溃的程度,容错性较低,原则上的设计提出的方案是进行整体架构的升级重构,但是碍于时间原因,以及保守观念的影响,无法进行原则上的整改,只能退一步只采用分区的方案。

2)分区方案的采用分区方案的形式,oracle11g的子分区没有自动分区的功能,所有需要用pl/sql进行以往分区的建立

BEGIN

  DBMS_OUTPUT.ENABLE(1000000);

  OPEN C_CUR;

  LOOP

    FETCH C_CUR

      INTO V_DAY;

    EXIT WHEN C_CUR%NOTFOUND;

    V_DAYTIME := V_DAY || ' 23:59:59';

    V_NAME    := replace(V_DAY, '-');

    DBMS_OUTPUT.PUT_LINE(V_DAYTIME);

    EXECUTE IMMEDIATE 'alter table tablename modify partition P2 add subpartition P2' ||

                      V_NAME || ' ' || 'VALUES LESS THAN (' || 'TO_DATE(''' ||

                      V_DAYTIME ||

                      ''' ,''YYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN''))' ||

                      'tablespace <tablespaceName>';

  END LOOP;

  CLOSE C_CUR;

END;

然后这段pl/sql改一改变成存储过程,再用job定时执行就可以按照你约定的时间进行创建子分区。

CREATE OR REPLACE PROCEDURE PAR_PRODUCE is

  V_DAY     VARCHAR2(30);

  V_DAYTIME VARCHAR2(60);

  V_NAME    VARCHAR2(60);

BEGIN

  V_DAY     := TO_CHAR(sysdate, 'yyyy-mm-dd');

  V_NAME    := replace(V_DAY, '-');

  V_DAYTIME := V_DAY || ' 23:59:59';

  EXECUTE IMMEDIATE 'alter table <talename> modify partition P2 add subpartition P2' ||

                    V_NAME || ' ' || 'VALUES LESS THAN (' || 'TO_DATE(''' ||

                    V_DAYTIME ||

                    ''' ,''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN''))' ||

                    'tablespace <tablespaceName>';

END PAR_PRODUCE;

再贴上job的语法

declare

  job number;

begin

  dbms_job.submit(job,

                  'PAR_PRODUCE;',

                  to_date('24-11-2017 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),

                  'sysdate+86400/86400');

end;

以上就是组合分区的实现。

3)做过分区的同学估计都知道行迁移,原则上分区方案选择的字段都不应该选用经常会被修改的字段,因为这可能会导致被修改的数据改变分区,也就是行迁移,这样会使io变高,一次update操作相当于执行了delete,insert,update,大数据量的写操作,会使数据库服务器本身的负载过高,也有可能导致服务器的崩溃,锁表,或者其他业务读取写入速度变慢,但是本次修改无法避免的用了行迁移的形式,本人是考虑整体修改,但是碍于技术经理的一些原则,尽量不做大的变动,所以考虑了多种分区,导入数据测试的结构还是采用了使用行迁移的方式。而且技术经理考虑oracle本身性能高,但是我是觉得性能在高,也不能浪费,但是架构的整改重构本身要承受很大的风险问题,权衡下还是觉得领导说对就是对吧。。。。。

4)数据导入采用的是oracle的数据泵,导入dmp文件,导入的方式:

impdp mobileplat/hjhz6666  directory=dmporacle  dumpfile=$command logfile=logfile.log remap_table=$commands:SEND_NEW2 remap_schema=MOBILEINFOPLAT:MOBILEPLAT table_exists_action=append

directory是需要在oracle上创建虚拟文件路径,要不然你的dmp文件无法执行会报错

create or replace directory directory文件名称 as '你的dmp文件路径'

remap_schema 是同步不同的schema remap_table 是同步不同表名字,相同表结构。

导入数据后可以在分区表创建组合分区建的联合索引,建议创建本地索引,效率应该会更快。

 

3.这个过程耗费了很多时间和精力,导入大数据量建议数据表不要建立索引主键,导入速度会很快,导入数据先考虑表空间是否足够,不够的话需要扩展表空间,创建索引建议不要超过6个,不然索引的占用空间可能比表本身都要大,不太利于写操作。分区后统计功能,也就是count函数可能速度较慢,考虑位图索引,但是需要谨慎使用,因为本身查询条件带入了非分区字段,oracle11g的解释计划会看到回表的操作,这个操作会导致时间的大幅度增长,而且很难避免。

转载于:https://my.oschina.net/u/3744098/blog/1586120

支持自动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、付费专栏及课程。

余额充值