Python 实现 MySQL 自动增删分区的完整方案
本文介绍使用 Python 结合 pymysql 库实现 MySQL 数据库自动增删分区的方法。通过连接数据库查询当前最大分区日期,利用 datetime 和 dateutil 计算新分区时间并执行 ALTER TABLE 添加分区;同时查询最小分区,若超过保留期限则自动删除旧分区。脚本通过命令行参数指定主机、数据库和表名,实现自动化维护,适用于大数据量表的长期存储管理。
建立 MySQL 数据库连接
首先,需要建立与 MySQL 数据库的连接。代码中定义了一个 connect_mysql 类,在初始化时传入主机地址和数据库名称。配置信息包含主机、端口(示例中为 33071)、用户名(sysbench)、密码(970125)、数据库名、字符集(utf8mb4)等。提供 select_db 方法用于执行查询语句,返回结果集;提供 excute_db 方法用于执行非查询语句(如增删改),提交事务或回滚,并处理异常。
数据库连接类实现
#!/usr/bin/python
#-*- coding:utf-8 -*-
import time
import pymysql
class connect_mysql(object):
def __init__(self, host, dbname):
self.mysql_config = {
'host': host,
'port': 33071,
'user': 'sysbench',
'passwd': '970125',
'db': dbname,
'charset': 'utf8mb4',
}
self.dbname = dbname
def select_db(self, sql):
mysql_conn = pymysql.connect(**self.mysql_config)
try:
query = "%s" %(sql)
cur = mysql_conn.cursor()
cur.execute(query)
results = cur.fetchall()
cur.close()
mysql_conn.close()
return results
except Exception as err:
print(err)
def excute_db(self, sql):
mysql_conn = pymysql.connect(**self.mysql_config)
try:
cur = mysql_conn.cursor()
cur.execute(sql)
mysql_conn.commit()
cur.close()
mysql_conn.close()
return 0
except Exception as err:
mysql_conn.rollback()
print(err)
自动增删分区逻辑
接着实现分区自动增删逻辑。脚本通过命令行接收主机、数据库名和表名作为参数。新增分区时,查询 INFORMATION_SCHEMA.PARTITIONS 获取当前最大分区名(去除前缀 'p' 后解析为日期),基于该日期加一天计算新分区名,加两天计算新分区值(格式为 '%Y-%m-%d')。执行 ALTER TABLE 添加新分区。同时,查询最小分区名,若存在且需清理,则执行 DROP PARTITION 删除旧分区,确保分区数量在合理范围内。
分区管理脚本代码
#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
import pymysql
import importlib
import logging
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
from connect_db_forbatch import connect_mysql
def incr_partition():
print("新增分区...")
max_partition_sql = "SELECT REPLACE(partition_name,'p','') FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='%s' and table_name='%s' ORDER BY partition_ordinal_position DESC LIMIT 1;" %(db_name,table_name)
# print(max_partition_sql)
max_partition = connect_mysql(host,db_name).select_db(max_partition_sql)
max_date = str(max_partition[0][0])
max_partition_name = (datetime.strptime(max_date, "%Y%m%d") + relativedelta(days=1)).strftime("%Y%m%d")
max_partition_value = (datetime.strptime(max_date, "%Y%m%d") + relativedelta(days=2)).strftime("'%Y-%m-%d'")
alter_max_partition_sql = "ALTER TABLE %s.%s ADD PARTITION (PARTITION p%s VALUES LESS THAN (to_days(%s)) ENGINE = InnoDB);" %(db_name,table_name,max_partition_name,max_partition_value)
print(alter_max_partition_sql)
connect_mysql(host,db_name).excute_db(alter_max_partition_sql)
def del_partition():
print("删除分区...")
min_partition_sql = "SELECT REPLACE(partition_name,'p','') FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='sbtest' and table_name='t1' ORDER BY partition_ordinal_position LIMIT 1;"
# print(min_partition_sql)
min_partition = connect_mysql(host,db_name).select_db(min_partition_sql)
min_date = str(min_partition[0][0])
min_partition_name = (datetime.strptime(min_date, "%Y%m%d") + relativedelta(days=0)).strftime("%Y%m%d")
alter_min_partition_sql = "ALTER TABLE %s.%s DROP PARTITION p%s;" %(db_name,table_name,min_partition_name)
print(alter_min_partition_sql)
connect_mysql(host,db_name).excute_db(alter_min_partition_sql)
if __name__ == "__main__":
host = sys.argv[1]
db_name = sys.argv[2]
table_name = sys.argv[3]
incr_partition()
del_partition()
以上介绍了 Python 实现 MySQL 自动增删分区的方法。更多相关 Python 操作 MySQL 自动分区的内容,请参考本站历史文章或继续浏览后续内容。感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













