Python 实现 MySQL 自动增删分区的完整方案

Hazel
Hazel
发布时间:2026-10-14 | 4人浏览过
原创

本文介绍使用 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 自动分区的内容,请参考本站历史文章或继续浏览后续内容。感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表