##删除表droptable`proxy_history`;##重新创建表,日期记得修改CREATETABLE`proxy_history`(`id`bigintunsignedNOTNULLAUTO_INCREMENT,`itemid`bigintunsignedNOTNULL,`clock`intNOTNULLDEFAULT'0',`timestamp`intNOTNULLDEFAULT'0',`source`varchar(64)COLLATE utf8mb4_bin NOTNULLDEFAULT'',`severity`intNOTNULLDEFAULT'0',`value`longtextCOLLATE utf8mb4_bin NOTNULL,`logeventid`intNOTNULLDEFAULT'0',`ns`intNOTNULLDEFAULT'0',`state`intNOTNULLDEFAULT'0',`lastlogsize`bigintunsignedNOTNULLDEFAULT'0',`mtime`intNOTNULLDEFAULT'0',`flags`intNOTNULLDEFAULT'0',`write_clock`intNOTNULLDEFAULT'0',PRIMARYKEY(`id`,`clock`),KEY`proxy_history_1`(`clock`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITIONBY RANGE ( clock)(PARTITION p2023_03_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-13 00:00:00"))ENGINE=InnoDB,PARTITION p2023_03_14 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-15 00:00:00"))ENGINE=InnoDB)
python
安装
yum -y install python3
PIP模块
pip3 install python-dateutil
pip3 pymysql
python脚本
import pymysql
import datetime
from dateutil.relativedelta import relativedelta
### mysql信息,请更换host、user、password、db
mysql_host ='1.1.1.1'
mysql_user ='zabbix'
mysql_password ='password'
mysql_db ='zabbix_proxy'### 要分区的表信息
partition_table_name ='proxy_history'### 连接数据库
mysqlcon = pymysql.connect(host=mysql_host,user=mysql_user,password=mysql_password,port=3306,db=mysql_db)
cursor = mysqlcon.cursor()### 获取当前日期
current_date = datetime.datetime.now()### 获取要保留的分区最大日期
last_month_date = current_date - relativedelta(months=1)### 计算要保留的分区名称
last_month_partition_name ="p"+ last_month_date.strftime("%Y_%m_%d")### 添加分区的函数defadd_partition(table_name, partition_name, partition_date):
add_partition_query ="""
ALTER TABLE {} ADD PARTITION ( PARTITION {} VALUES LESS THAN (UNIX_TIMESTAMP('{}')) ENGINE = InnoDB )
""".format(table_name, partition_name, partition_date)
cursor.execute(add_partition_query)### 删除分区的函数defdrop_partition(table_name, partition_name):
drop_partition_query ="""
ALTER TABLE {} DROP PARTITION {}
""".format(table_name, partition_name)
cursor.execute(drop_partition_query)### 获取表分区的函数defget_partitions(table_name):
cursor.execute('''SELECT partition_name FROM information_schema.partitions WHERE table_schema = '{}' AND table_name = '{}' '''.format(mysql_db, table_name))
partitions =[partition[0]for partition in cursor.fetchall()]return partitions
### 获取当前要分区的表的分区信息
partitions = get_partitions(partition_table_name)### 添加分区,并且每执行一次,创建30天for daytime inrange(1,31):### get partiton date
max_partition_date = current_date + relativedelta(days=daytime)### get partition storage date
partition_date_tmp = max_partition_date - relativedelta(days=1)### get partition name
partition_name ="p"+ partition_date_tmp.strftime("%Y_%m_%d")### if partition is not exist , add itif partition_name notin partitions:### add partition
add_partition(partition_table_name, partition_name, max_partition_date.strftime("%Y-%m-%d"))### 删除冗余分区,保留一个月分区数据for partition in partitions:if partition < last_month_partition_name:
drop_partition(partition_table_name, partition)### 数据提交,游标关闭,数据库连接关闭
mysqlcon.commit()
cursor.close()
mysqlcon.close()