Mysql分区自动管理
一、 MYSQL的分区表简介
1. 什么是表分区?
是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。 例如: CREATE TABLE `rangeyear_t1_kafka_consume_log` ( `id` int(11) NOT NULL COMMENT 'id', `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '消息接收时间', PRIMARY KEY (`id`,`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE (YEAR(create_time)) (PARTITION p2012 VALUES LESS THAN (2012) ENGINE = InnoDB, PARTITION p2013 VALUES LESS THAN (2013) ENGINE = InnoDB, PARTITION p2014 VALUES LESS THAN (2014) ENGINE = InnoDB); cnsz22pl0015:cmdpsit > ll|grep rangeyear_t1_kafka_consume_log -rw-rw---- 1 mysql mysql 8889 Jun 18 13:55 rangeyear_t1_kafka_consume_log.frm -rw-rw---- 1 mysql mysql 128 Jun 18 13:55 rangeyear_t1_kafka_consume_log.par -rw-rw---- 1 mysql mysql 98304 Jun 18 11:27 rangeyear_t1_kafka_consume_log#P#p2012.ibd -rw-rw---- 1 mysql mysql 98304 Jun 18 11:27 rangeyear_t1_kafka_consume_log#P#p2013.ibd -rw-rw---- 1 mysql mysql 98304 Jun 18 11:27 rangeyear_t1_kafka_consume_log#P#p2014.ibd
2. 表分区有什么好处?
1)分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 2)和单个磁盘或者文件系统相比,可以存储更多数据 3) 优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果,类似oracle库中的分区修剪技术。 4)分区表更容易维护。例如:想批量删除大量数据可以truncate或者drop整个分区。 5)可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问。
例如: CREATE TABLE users ( uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT , email VARCHAR(30) NOT NULL DEFAULT ) PARTITION BY RANGE (uid) ( PARTITION p0 VALUES LESS THAN (3000000) DATA DIRECTORY = '/data0/data' INDEX DIRECTORY = '/data1/idx', PARTITION p1 VALUES LESS THAN (6000000) DATA DIRECTORY = '/data2/data' INDEX DIRECTORY = '/data3/idx', PARTITION p2 VALUES LESS THAN MAXVALUE DATA DIRECTORY = '/data6/data' INDEX DIRECTORY = '/data7/idx' );
3. 分区表的限制因素
1)一个表最多只能有1024个分区 2)MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。MYSQL5.5之后支持整数、日期时间、字符串。 3)如果分区表有唯一索引(主键),所有分区表达式中的列必须包含在唯一索引(主键)中 4)分区表中无法使用外键约束 5)MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区;即只有局部索引,没有全局索引。
4. 分区表的分类
1)range分区, 按照数据的区间范围分区(连续递增)
partition by range(exp)( //exp可以为列名或者表达式,比如to_date(created_date)
partition p0 values less than(num)
)
# range范围覆盖问题:当插入的记录中对应的分区键的值不在分区定义的范围中的时候,插入失败
#分区键的值如果是NULL,将被作为一个最小值来处理
2)LIST分区:按照List中的值分区(枚举)
partition by list(exp)( //exp为列名或者表达式
partition p0 values in (3,5) //值为3和5的在p0分区
)
#不适合分区经常变动的需求
3)HASH分区 :主要用来分散热点读,使用取模算法
partition by hash(store_id) partitions 4;
#数据尽可能的均匀分布。 缺点:不适合分区经常变动的需求
#mysql提供了线性hash分区,与普通hash分区相比起对分区变更处理更迅速,但数据分布不大均衡
partition by LINER hash(store_id) partitions 4;
4)Key分区,类似Hash分区,Hash分区允许使用用户自定义的表达式,但Key分区不允许使用用户自定义的表达式。Hash仅支持整数分区,而Key分区支持除了Blob和text的其他类型的列作为分区键。
partition by key(exp) partitions 4;//exp是零个或多个字段名的列表
5) Composite(复合模式)
6) Columns分区,MySQL5.5中引入的分区类型,解决了5.5版本之前range分区和list分区只支持整数分区的问题。 Columns分区可以细分为 range columns分区和 list columns分区,他们都支持整数,日期时间,字符串三大数据类型。(不支持text和blob类型作为分区键) columns分区还支持多列分区。
PARTITION BY RANGE COLUMNS(create_time)
(PARTITION p2015 VALUES LESS THAN ('2015-01-01') ENGINE = InnoDB,
PARTITION p20180211 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)
二、 MYSQL分区管理procedure的架构
1. 分区管理的架构逻辑
根据对总部所有mysql库中的分区表的汇总和分析,主要的分区类型为range、range columns、hash;其中range分区占到62%,range columns分区占到23%;而这两种分区类型中99%的分区键是按照时间字段作为分区的依据。所以针对SF分区表的使用情况,编写了一套统一的分区管理工具。 由上一节分区表的基础知识介绍可得知range和range columns的区别,首先,两种分区的关键字不同;其次range分区的依据可以是一个表达式range(exp),并且该表达式的值必须是一个整数,而range columns的分区依据不支持表达式,但可以是多个列RANGE COLUMNS(create_time),其中列的类型也不限于整数,可支持时间,字符串。 根据以上信息,mysql分区管理工具的架构逻辑如下图所示 上图中红色小字标识得为存储过程的名字,首先,整个管理工具是由proc_main_partition发起调用,其次,proc_main_partition会读取配置表main_partition_table_config中的表名、策略等信息,最后,根据配置信息调用指定的子存储过程执行添加和删除分区的操作。
2. 各存储过程的功能介绍
proc_main_partition_config #该存储过程的执行权限会授权给用户,供用户把业务表加入的分区管理策略当中,实现自动维护 proc_main_partition #该procedure会根据配置表中的信息调用下面一系列的存储过程 proc_main_partition_range_nofunc #如为range类型的分区,且其分区键为递增的数字时,该procedure完成其增删分区的具体行为 #如:PARTITION BY RANGE (store_id) proc_main_partition_range_day #如为range类型的分区,且其分区策略为按天分区,或者按周分区,该procedure完成其增删分区的具体行为 proc_main_partition_range_period #对于有些数据需要按照上旬、中旬、下旬的策略进行分区,比如6月,6.1-6.11之前为一个分区,6.11-6.21为一个分区,,6.21-7.01为一个分区 #如为range类型的分区,且其分区策略为按上旬、中旬、下旬分区,该procedure完成其增删分区的具体行为 proc_main_partition_range_month #如为range类型的分区,且其分区策略为按月分区,该procedure完成其增删分区的具体行为 proc_main_partition_range_year #如为range类型的分区,且其分区策略为按年分区,该procedure完成其增删分区的具体行为 proc_main_part_rangecolumn_day #如为range columns类型的分区,且其分区策略为按天分区,或者按周分区,该procedure完成其增删分区的具体行为 proc_main_part_rangecolumn_period #对于有些数据需要按照上旬、中旬、下旬的策略进行分区,比如6月,6.1-6.11之前为一个分区,6.11-6.21为一个分区,,6.21-7.01为一个分区 #如为range columns类型的分区,且其分区策略为按上旬、中旬、下旬分区,该procedure完成其增删分区的具体行为 proc_main_part_rangecolumn_month #如为range columns类型的分区,且其分区策略为按月分区,该procedure完成其增删分区的具体行为 proc_main_part_rangecolumn_year #如为range columns类型的分区,且其分区策略为按年分区,该procedure完成其增删分区的具体行为
3. 配置表的功能介绍
main_partition_table_config #配置表,记录加入分区自动维护的所有分区表的分区策略等信息 main_partition_table_config_log #proc_main_partition_config存储过程的执行log信息 main_partition_operation_log #所有procedure执行的log信息,该表会记录某个时间点对某个表做了什么操作 main_partition_scheduler_log #所有procedure调用的log信息,该表主要用于当分区管理工具出现异常时,调试之用
三、 使用案例
1. 把表加入到分区自动管理的procedure
--下面是存储过程的参数
CREATE PROCEDURE `proc_main_partition_config`(
OUT v_MSG varchar(400), --@v_MSG,只是一个变量会输出配置的结果或报错,保持默认即可
IN v_username varchar(100), --保持默认即可
IN v_schema_name varchar(100), --database
IN v_table_name varchar(100), --分区表
IN v_part_column varchar(50), --分区键,该自动分区管理procedure只支持单列分区
IN v_policy varchar(50), --分区策略,分区类型只可以为YEAR, MONTH, PERIOD, WEEK, DAY,数字
IN v_valid_flag tinyint(4), --这个是标志位,参数只能为1,2,3,4, 1 加删,2不加不删,3,只加不删,4 只删不加
IN v_keep_offset int(4), --保留的分区数量,最少会保留3个分区
IN v_add_offset int(4), --添加分区的数量
IN v_ifexist ENUM('true','false') --一般使用false,当要添加的表如果之前已有配置,如果需要重新配置,则该值置为true
)
#常规案例 call dbamon.proc_main_partition_config (@v_MSG,current_user(),'库名','表名','分区键','分区规则',1,保留分区数,预添加分区数,'false');
2. 该分区管理工具使用的约束与限制
1)该分区管理工具只支持分区键为单键值的分区方式,且分区键的类型如下:'date','datetime','time','timestamp','year','tinyint','smallint','mediumint','int','integer','bigint'。 对于分区类型为:period,意为把一个月分为上中下旬,如2月,把大于1月31号小于2月11号定位一个分区p1,把大于2月11号小于2月21号定位一个分区p2,把大于2月21号小于3月01号定位一个分区p2。 2) 如果是range分区,分区策略如是按天、周、上中下旬、或月分区,则分区依据的表达式只支持to_days函数,如:PARTITION BY RANGE (to_days(order_dt))。不支持其他复杂的函数如month,extract等。 3)如果是range分区,分区策略如是按年分区,则分区依据的表达式只支持year函数, 如:PARTITION BY RANGE (year(order_dt)) 。 4)因为要迎合顺丰数据保留3+1的策略,分区自动删分区的逻辑要求最少保留4个分区,如用户业务要求数据不需要保留4个分区,则需要手动删除。 5)对与数字类型的分区支持,因为考虑到误删数据,则暂时不提供删除分区的功能, 如:PARTITION BY RANGE (store_id) 。 6)在配置分区管理时,如果所配置的表不是分区表会报错退出 7)在分区维护job:dbamon.job_main_partition在维护某个表T1的过程中,如果正好A事务对该表做了操作而忘记提交,如此因为mysql无法在数据字典中获取T1表的锁信息,所以,该job会处于一直等到状态。 8)在分区维护job:dbamon.job_main_partition在维护某个表T1的过程中,对于大事务,或者有会话正在不断操作表T1,则会每5s查找一次数据字典看该表是否空闲,如果5min内该表一直被其余事务使用,则放弃对该表的maintenance 9)对于时间类型分区表的分区命名为:【p+分区表达式的值】,对于数字类型的分区,如果已有分区名不是p开始计算,则会以p1为分区名,持续添加。 10)对于指定了maxvalue的分区表,在自动添加分区时如果检测到max分区中有数据,那么就会导致分区迁移,当max分区大于1G时,因为迁移的时间较长,所以暂定不进行分区自动维护,需要手动处理。
3. 配置案例
#1range year
CREATE TABLE `rangeyear_t1_kafka_consume_log` ( `id` int(11) NOT NULL COMMENT 'id', `topic` varchar(255) DEFAULT NULL COMMENT '消息队列名称/主题名称', `message` text COMMENT '消息内容', `status` varchar(255) DEFAULT NULL COMMENT '消息处理状态,成功:1 ,失败 0', `deal_time` int(11) DEFAULT NULL COMMENT '消息处理耗时时间(单位:毫秒)', `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '消息接收时间', PRIMARY KEY (`id`,`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE (YEAR(create_time)) (PARTITION p2012 VALUES LESS THAN (2012) ENGINE = InnoDB, PARTITION p2013 VALUES LESS THAN (2013) ENGINE = InnoDB, PARTITION p2018 VALUES LESS THAN (2014) ENGINE = InnoDB, PARTITION p2017 VALUES LESS THAN (2015) ENGINE = InnoDB, PARTITION p2016 VALUES LESS THAN (2016) ENGINE = InnoDB); call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangeyear_t1_kafka_consume_log','create_time','YEAR',1,5,10,'false');
#2range month
CREATE TABLE `rangemonth_tt_express_order` ( `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `cust_code` varchar(64) DEFAULT NULL COMMENT '月结账号', `currency_code` varchar(32) DEFAULT NULL COMMENT '币别', `order_dt` date NOT NULL COMMENT '订单日期', `order_no` varchar(64) DEFAULT NULL COMMENT '订单号码', `waybill_no` varchar(64) DEFAULT NULL COMMENT '运单号码', `sender_province` varchar(64) DEFAULT NULL COMMENT '寄件省份', `sender_city_code` varchar(32) DEFAULT NULL COMMENT '寄件城市代码', `sender_name` varchar(64) DEFAULT NULL COMMENT '寄件联系人', `sender_company` varchar(64) DEFAULT NULL COMMENT '寄件公司名称', `sender_phone` varchar(100) DEFAULT NULL, `sender_tel` varchar(100) DEFAULT NULL, PRIMARY KEY (`order_id`,`order_dt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='电商快递订单表' PARTITION BY RANGE (to_days(order_dt)) (PARTITION p20170301 VALUES LESS THAN (736754) ENGINE = InnoDB, PARTITION p20170601 VALUES LESS THAN (736785) ENGINE = InnoDB, PARTITION p20170701 VALUES LESS THAN (736815) ENGINE = InnoDB, PARTITION p20170801 VALUES LESS THAN (736846) ENGINE = InnoDB, PARTITION p20170701_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB); call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangemonth_tt_express_order','order_dt','MONTH',1,10,20,'false');
#3range nofunc
CREATE TABLE `nofunc_repo_flowtask_prop` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `task_id` bigint(20) NOT NULL, `step_id` bigint(20) NOT NULL DEFAULT '0', `prop_id` varchar(100) NOT NULL, `prop_name` varchar(100) NOT NULL, `prop_value` varchar(100) DEFAULT NULL, `prop_value_name` varchar(100) DEFAULT NULL COMMENT '值的显示名', `prop_def_id` bigint(10) DEFAULT NULL COMMENT '关联flow_prop_template_def表', `component_id` int(4) DEFAULT NULL COMMENT '流程组件ID', PRIMARY KEY (`id`,`task_id`), KEY `prop_index` (`prop_id`,`prop_value`), KEY `indexFlowtaskPropTaskId` (`task_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1522469 DEFAULT CHARSET=utf8 PARTITION BY RANGE (task_id) (PARTITION p1 VALUES LESS THAN (100000) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (200000) ENGINE = InnoDB, PARTITION p_30000 VALUES LESS THAN (300000) ENGINE = InnoDB); call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','nofunc_repo_flowtask_prop','task_id','100000',1,10,20,'false');
#4rangeperiod
CREATE TABLE `rangeperiod_tt_express_order` ( `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `cust_code` varchar(64) DEFAULT NULL COMMENT '月结账号', `currency_code` varchar(32) DEFAULT NULL COMMENT '币别', `order_dt` date NOT NULL COMMENT '订单日期', `order_no` varchar(64) DEFAULT NULL COMMENT '订单号码', `waybill_no` varchar(64) DEFAULT NULL COMMENT '运单号码', `sender_province` varchar(64) DEFAULT NULL COMMENT '寄件省份', `sender_city_code` varchar(32) DEFAULT NULL COMMENT '寄件城市代码', `sender_name` varchar(64) DEFAULT NULL COMMENT '寄件联系人', `sender_company` varchar(64) DEFAULT NULL COMMENT '寄件公司名称', `sender_phone` varchar(100) DEFAULT NULL, `sender_tel` varchar(100) DEFAULT NULL, PRIMARY KEY (`order_id`,`order_dt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='电商快递订单表' PARTITION BY RANGE (to_days(order_dt)) (PARTITION p20170311 VALUES LESS THAN (736764) ENGINE = InnoDB, PARTITION p20170621 VALUES LESS THAN (736774) ENGINE = InnoDB, PARTITION p20170701 VALUES LESS THAN (736785) ENGINE = InnoDB, PARTITION p20170411 VALUES LESS THAN (736795) ENGINE = InnoDB, PARTITION p20170421 VALUES LESS THAN (736805) ENGINE = InnoDB, PARTITION p20170501 VALUES LESS THAN (736815) ENGINE = InnoDB); call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangeperiod_tt_express_order','order_dt','PERIOD',1,10,20,'false');
#5rangeday
CREATE TABLE `rangeday_tt_express_order1` ( `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `cust_code` varchar(64) DEFAULT NULL COMMENT '月结账号', `currency_code` varchar(32) DEFAULT NULL COMMENT '币别', `order_dt` date NOT NULL COMMENT '订单日期', PRIMARY KEY (`order_id`,`order_dt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='电商快递订单表' PARTITION BY RANGE (to_days(order_dt)) (PARTITION p20170519 VALUES LESS THAN (736833) ENGINE = InnoDB, PARTITION p20170520 VALUES LESS THAN (736834) ENGINE = InnoDB, PARTITION p20170521 VALUES LESS THAN (736835) ENGINE = InnoDB, PARTITION p20170727 VALUES LESS THAN (736836) ENGINE = InnoDB, PARTITION p20170728 VALUES LESS THAN (736837) ENGINE = InnoDB, PARTITION p20170524 VALUES LESS THAN MAXVALUE ENGINE = InnoDB); call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangeday_tt_express_order1','order_dt','DAY',1,30,60,'false');
#6rangeweek
CREATE TABLE `rangeweek_tt_express_order` ( `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `cust_code` varchar(64) DEFAULT NULL COMMENT '月结账号', `currency_code` varchar(32) DEFAULT NULL COMMENT '币别', `order_dt` date NOT NULL COMMENT '订单日期', PRIMARY KEY (`order_id`,`order_dt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='电商快递订单表' PARTITION BY RANGE (to_days(order_dt)) (PARTITION p20170409 VALUES LESS THAN (736793) ENGINE = InnoDB, PARTITION p20170625 VALUES LESS THAN (736800) ENGINE = InnoDB, PARTITION p20170618 VALUES LESS THAN (736807) ENGINE = InnoDB, PARTITION p20170430 VALUES LESS THAN (736814) ENGINE = InnoDB, PARTITION p20170507 VALUES LESS THAN MAXVALUE ENGINE = InnoDB); call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangeweek_tt_express_order','order_dt','WEEK',1,10,20,'false');
#7rangecolumnmonth
CREATE TABLE `rangecolumnmonth_t1_tt_waybill_version` (
`version_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '主键',
`waybill_no` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '运单号',
`order_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`waybill_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单主键',
`list_audited_version` int(2) DEFAULT NULL COMMENT '清单审核版本号',
`ackList_audited_version` int(2) DEFAULT NULL COMMENT '回单审核版本号',
`third_audited_version` int(2) DEFAULT NULL COMMENT '第三方单主键',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`dispatch_type_code` varchar(3) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分发类型(1:清单;2回单;3:第三方;6:清,第三方;7:回,第三方)',
PRIMARY KEY (`version_id`,`create_time`),
KEY `idx_waybill_version_id_order_no` (`waybill_id`,`order_no`) USING BTREE,
KEY `idx_waybillNo_orderNo` (`order_no`,`waybill_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='运单审核版本号'
PARTITION BY RANGE COLUMNS(create_time)
( PARTITION p20170301 VALUES LESS THAN ('2017-03-01') ENGINE = InnoDB,
PARTITION p20170801 VALUES LESS THAN ('2017-04-01') ENGINE = InnoDB,
PARTITION p20170901 VALUES LESS THAN ('2017-05-01') ENGINE = InnoDB,
PARTITION p20170601 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);
call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangecolumnmonth_t1_tt_waybill_version','create_time','MONTH',1,10,20,'false');
#8rangecolumweek
CREATE TABLE `rangecolumweek_t1_tt_waybill_version` (
`version_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '主键',
`waybill_no` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '运单号',
`order_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`waybill_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单主键',
`list_audited_version` int(2) DEFAULT NULL COMMENT '清单审核版本号',
`ackList_audited_version` int(2) DEFAULT NULL COMMENT '回单审核版本号',
`third_audited_version` int(2) DEFAULT NULL COMMENT '第三方单主键',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`dispatch_type_code` varchar(3) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分发类型(1:清单;2回单;3:第三方;6:清,第三方;7:回,第三方)',
PRIMARY KEY (`version_id`,`create_time`),
KEY `idx_waybill_version_id_order_no` (`waybill_id`,`order_no`) USING BTREE,
KEY `idx_waybillNo_orderNo` (`order_no`,`waybill_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='运单审核版本号'
PARTITION BY RANGE COLUMNS(create_time)
(PARTITION p20170409 VALUES LESS THAN ('2017-04-09') ENGINE = InnoDB,
PARTITION p20170416 VALUES LESS THAN ('2017-04-16') ENGINE = InnoDB,
PARTITION p20171112 VALUES LESS THAN ('2017-04-23') ENGINE = InnoDB,
PARTITION p20171119 VALUES LESS THAN ('2017-04-30') ENGINE = InnoDB,
PARTITION p20170507 VALUES LESS THAN ('2017-05-07') ENGINE = InnoDB);
call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangecolumweek_t1_tt_waybill_version','create_time','WEEK',1,10,20,'false');
#9rangecolumperiod
CREATE TABLE `rangecolumperiod_t1_tt_waybill_version` (
`version_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '主键',
`waybill_no` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '运单号',
`order_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`waybill_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单主键',
`list_audited_version` int(2) DEFAULT NULL COMMENT '清单审核版本号',
`ackList_audited_version` int(2) DEFAULT NULL COMMENT '回单审核版本号',
`third_audited_version` int(2) DEFAULT NULL COMMENT '第三方单主键',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`dispatch_type_code` varchar(3) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分发类型(1:清单;2回单;3:第三方;6:清,第三方;7:回,第三方)',
PRIMARY KEY (`version_id`,`create_time`),
KEY `idx_waybill_version_id_order_no` (`waybill_id`,`order_no`) USING BTREE,
KEY `idx_waybillNo_orderNo` (`order_no`,`waybill_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='运单审核版本号'
PARTITION BY RANGE COLUMNS(create_time)
(PARTITION p20170301 VALUES LESS THAN ('2017-03-01') ENGINE = InnoDB,
PARTITION p20170311 VALUES LESS THAN ('2017-03-11') ENGINE = InnoDB,
PARTITION p20171111 VALUES LESS THAN ('2017-03-21') ENGINE = InnoDB,
PARTITION p20171121 VALUES LESS THAN ('2017-04-01') ENGINE = InnoDB,
PARTITION p20170411 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);
call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangecolumperiod_t1_tt_waybill_version','create_time','PERIOD',1,10,20,'false');
#10rangecolumday
CREATE TABLE `rangecolumday_t1_tt_waybill_version` (
`version_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '主键',
`waybill_no` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '运单号',
`order_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`waybill_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单主键',
`list_audited_version` int(2) DEFAULT NULL COMMENT '清单审核版本号',
`ackList_audited_version` int(2) DEFAULT NULL COMMENT '回单审核版本号',
`third_audited_version` int(2) DEFAULT NULL COMMENT '第三方单主键',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`dispatch_type_code` varchar(3) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分发类型(1:清单;2回单;3:第三方;6:清,第三方;7:回,第三方)',
PRIMARY KEY (`version_id`,`create_time`),
KEY `idx_waybill_version_id_order_no` (`waybill_id`,`order_no`) USING BTREE,
KEY `idx_waybillNo_orderNo` (`order_no`,`waybill_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='运单审核版本号'
PARTITION BY RANGE COLUMNS(create_time)
(PARTITION p20170519 VALUES LESS THAN ('2017-05-19') ENGINE = InnoDB,
PARTITION p20170520 VALUES LESS THAN ('2017-05-20') ENGINE = InnoDB,
PARTITION p20170521 VALUES LESS THAN ('2017-05-21') ENGINE = InnoDB,
PARTITION p20170803 VALUES LESS THAN ('2017-05-22') ENGINE = InnoDB,
PARTITION p20170804 VALUES LESS THAN ('2017-05-23') ENGINE = InnoDB,
PARTITION p20170524 VALUES LESS THAN ('2017-05-24') ENGINE = InnoDB);
call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangecolumday_t1_tt_waybill_version','create_time','DAY',1,30,60,'false');
#11rangecolumday
CREATE TABLE `rangecolumnyear_t1_tt_waybill_version1` (
`version_id` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '主键',
`waybill_no` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '运单号',
`order_no` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`waybill_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单主键',
`list_audited_version` int(2) DEFAULT NULL COMMENT '清单审核版本号',
`ackList_audited_version` int(2) DEFAULT NULL COMMENT '回单审核版本号',
`third_audited_version` int(2) DEFAULT NULL COMMENT '第三方单主键',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`dispatch_type_code` varchar(3) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分发类型(1:清单;2回单;3:第三方;6:清,第三方;7:回,第三方)',
PRIMARY KEY (`version_id`,`create_time`),
KEY `idx_waybill_version_id_order_no` (`waybill_id`,`order_no`) USING BTREE,
KEY `idx_waybillNo_orderNo` (`order_no`,`waybill_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='运单审核版本号'
PARTITION BY RANGE COLUMNS(create_time)
(PARTITION p20170301 VALUES LESS THAN ('2013-01-01') ENGINE = InnoDB,
PARTITION p20170801 VALUES LESS THAN ('2014-01-01') ENGINE = InnoDB,
PARTITION p2020 VALUES LESS THAN ('2015-01-01') ENGINE = InnoDB,
PARTITION p2018 VALUES LESS THAN ('2016-01-01') ENGINE = InnoDB,
PARTITION p2019 VALUES LESS THAN ('2017-01-01') ENGINE = InnoDB);
call dbamon.proc_main_partition_config (@v_MSG,current_user(),'sf592811','rangecolumnyear_t1_tt_waybill_version1','create_time','YEAR',1,5,10,'false');
五、 错误排查
select * from dbamon.main_partition_table_config; select * from dbamon.main_partition_table_config_log; select * from dbamon.main_partition_operation_log; select * from dbamon.main_partition_scheduler_log;

浙公网安备 33010602011771号