文章目錄
- 一、簡介
- 二、設計邏輯
- 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 統一配置信息并且校驗配置正確性;