文章目录
- 一、简介
- 二、设计逻辑
- 1、配置文件检查
- 2、创建逻辑
- 3、 删除逻辑
- 4、重建表分区逻辑
- 5、recognize maxvalue分区表逻辑
- 6、创建多个未来分区逻辑
- 7、定时检测分区是否创建成功,否则发送告警邮件。
- 三、解决的问题
- 四、配置例子与介绍
一、简介
-
操作数据库,连接配置读取.env;
-
分区信息配置config,内涵分区规则,log日志路径,邮件redis配置;
-
每天定时任务进行执行(每一个小时执行),采用获取表分区的值(partition_value)对比当前时间(00:00:00)进行区分处理。
-
依赖python3,pymysql、datetime , relativedelta
-
以00:00:00秒创建分区,及处理过期分区。
二、设计逻辑
1、配置文件检查
- 参数类型应用强类型,int或者str,不对则退出程序。
2、创建逻辑
-
配置years,months,weeks,day_week,days值来创建年,月,星期,星期几,日来创建分区;
-
检测如该分区表名称不存在,创建分区。否则不建。
3、 删除逻辑
- 获取保留天数days_reserve_patition状态值,有值,则进行计算最先创建的表分区paritition_value值与当前时间相差大于等于需要保留的时间,即删除分区
4、重建表分区逻辑
- 如不是分区表,需要创建,则配置partition_key,用来做分区表中key。
- 支持unique key ,配置 unique_key_status 为 true
- 支持指定partition_field_type 范围分区类型,INT,TO_DAYS,UNIX_TIMESTAMP。必须一定要配置partition_key
5、recognize maxvalue分区表逻辑
- 如分区包含maxvalue,则用recogize来创建分区。
- recognize 表,也就是有maxvalue的分区表,记录上一次recognize的分区名称,计算未来的几个分区名称,和分区值,判断分区是否存在,进行创建。
6、创建多个未来分区逻辑
- 重建表分区以及创建表分区完成后,生成未来几个分区名和分区值,并判断是否已经创建,未创建则进行创建。
7、定时检测分区是否创建成功,否则发送告警邮件。
三、解决的问题
- 1)、不是分区的表,变成分区表;
- 2)、所有分区表批量管理,按年、月、周、日,来创建每次的分区;
- 3)、过期分区定时清除;
- 4)、创建分区失败,配置文件有问题会发送告警邮件;
- 5)、创建多个未来分区;
- 6)、创建规则可配置config;
- 7)、支持TO_DAYS。UNIX_TIMESTAMP类型,范围分区类型;
- 8)、支持maxvalue分区表再分区;
- 9)、支持unique key,primary key 组合类型的表分区。
四、配置例子与介绍
- env配置例子
{"dbname": "database_name","hosts": "ip","username": "username","pwd": "password","port": 3306,},
- config配置例子:
{"database_name": "bitcc_orderlog","table_name": "t_user_cancel_order_log_*","weeks": 1,"multi_partitions": 5,"days_reserve_partition": 14,},每一个星期一创建未来5个星期的分区,
会删除14天之前的分区,
\*为范匹配,多个相同前缀的表。
-1)、配置文件
conf.config 配置文件为注册需要被管理的分区或非分区表
- 年,月,星期,日分区参数,必选其一,必填(注意项):
参数 | 类型 | 必填项 1是,0否 | 备注 |
---|---|---|---|
database_name | string | 1 | 数据库名称,如"bitcc_money" |
table_name | string | 1 | 需要分区的表,支持(*),如 t_user_trade_*; |
years | int | 0 | 按每多少个年来创建分区 |
months | int | 0 | 按每多少个月来创建分区 |
weeks | int | 0 | 按每多少个星期来创建分区 |
day_week | int | 0 | 星期几执行创建分区,当按周来创建分区时,必填 ,默认0,代表星期一 |
days | int | 0 | 按每多少个天来创建分区 |
days_reserve_patition | int | 0 | 分区保存多少天,配置这个参数就会删除过期分区 |
partition_key | string | 0 | 哪个字段来分区;如该表不是分区表,则必须填, 如需创建例子:“create_at” |
maxvalue_status | int | 0 | 如该表分区设置了maxvalue,则必须填,1是,0否 |
multi_partitions | int | 0 | 需要创建多少个未来分区,默认是0代表一个 |
partition_field_type | str | 0 | 范围分区类型的选型,目前支持TO_DAYS,UNIX_TIMESTAMP。默认是UNIX_TIMESTAMP |
unique_key_status | int | 0 | 表中有primary key和unique key 同时出现,需要配置为1,为1时必须配置partition_key组合使用 |
- cc_email_str cc邮件收件人,列表即可;
- log_path 打印日志路径。
- redis 连接信息配置
-2 )、项目代码结构介绍
- 1)、conf.config.py 表分区规则配置;
- 2)、lib.partition_operation.alter_partition.py 修改非分区表为分区表;
- 3)、lib.partition_operation.create_partition.py 创建表分区;
- 4)、lib.partition_operation.delete_partition.py 删除表分区表;
- 5)、lib.partition_operation.recognize_partition.py maxvalue创建表分区;
- 6)、lib.partition_operation.select_partition.py 查询表分区信息;
- 7)、lib.conn_mysql.py 连接mysql操作函数;
- 8)、lib.conn_redis.py 连接redis操作函数;
- 9)、lib.calculate_partition.py 计算时间差,以及分区值partition_value
- 10)、lib.logging_lib.py 打印日志函数;
- 11)、lib.compution_time.py 计算不同格式的时间;
- 12)、partition_main.py 管理主函数,进入函数;
- 13)、lib.send_email 发送日志邮件函数;
- 14)、lib.check_env_info.py 获取env config信息;
- 15)、lib.check_config.py 统一配置信息并且校验配置正确性;