通过定时任务执行mysql的定期删除和新建分区,此处是按日分区

使用python脚本作为命令脚本,linux的定时任务来每天定时执行

#!/usr/bin/python  
# -*- coding: utf8 -*-  
import pymysql  
import datetime  
import calendar  
  
#要分区的表  
table_name = 'my_table'  
#连接数据库的信息  
host,user,passwd,db = ('127.0.0.1','root','123456','test')  
#保留数据的天数  
days = 2  
  
#===================================================  
''''' 
#根据月分区,计算出要删除的上月分区名称和下月新增的分区名称 
def add_months(dt,months): 
    month = dt.month - 1 + months 
    year = dt.year + month / 12 
    month = month % 12 + 1 
    day = min(dt.day,calendar.monthrange(year,month)[1]) 
    return dt.replace(year=year, month=month, day=day) 

today = datetime.datetime.today() 
last_date = add_months(today,-1)  
next_date = add_months(today,1) 
next_next_date = add_months(next_date,1) 

last_p = 'p%s' % last_date.strftime('%Y%m') 
next_p = 'p%s' % next_date.strftime('%Y%m') 
'''  
  
#===================================================  
#根据天分区,根据保留的天数计算出要删除的分区名称和要新增的分区名称  
today = datetime.datetime.today()  
last_date = today-datetime.timedelta(days)  
next_date = today+datetime.timedelta(1)  
next_next_date = today+datetime.timedelta(2)  
  
last_p = 'p%s' % last_date.strftime('%Y%m%d')  
next_p = 'p%s' % next_date.strftime('%Y%m%d')  
  
sql_add_p = 'alter table %s add partition (partition %s values less than (to_days(\'%s\')))' %(table_name,next_p,next_next_date.strftime('%Y-%m-%d'))  
sql_del_p = 'alter table %s drop partition %s' %(table_name,last_p)  
  
  
#===================================================  
#连接数据库,执行删除和新增分区的sql语句  
#print sql_add_p  
#print sql_del_p  
print '==============================================\nstart work:\n%s\n%s' %(sql_add_p,sql_del_p)  
conn = pymysql.connect(host,user, passwd, db)  
cur = conn.cursor()  
cur.execute(sql_add_p)  
cur.execute(sql_del_p)  
conn.close()  

 如果是以前没有分过区的表,则需要先创建一个分区,然后才能执行上面的代码

 

转载于:https://my.oschina.net/mickelfeng/blog/832647

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 MySQL分区表可以提高查询性能,并且可以通过按时间范围进行自动分区,以便更好地管理和维护数据。下面是按天执行分区表SQL的步骤: 1. 创建分区表 您可以使用以下命令创建一个按天分区的表: ``` CREATE TABLE mytable ( id INT NOT NULL, created_at TIMESTAMP NOT NULL ) PARTITION BY RANGE(TO_DAYS(created_at)) ( PARTITION p0 VALUES LESS THAN (TO_DAYS('2022-01-01')), PARTITION p1 VALUES LESS THAN (TO_DAYS('2022-01-02')), PARTITION p2 VALUES LESS THAN (TO_DAYS('2022-01-03')), ... PARTITION pn VALUES LESS THAN MAXVALUE ); ``` 这将创建一个名为“mytable”的分区表,其中“created_at”列将用于分区分区将按天进行。您需要为每个分区指定值范围,例如“p0”分区包含所有在“2022-01-01”之前创建的记录。 2. 创建分区维护事件 您可以创建一个事件,定期检查表并创建新的分区。以下是一个示例事件: ``` CREATE EVENT partition_maintenance ON SCHEDULE EVERY 1 DAY DO ALTER TABLE mytable ADD PARTITION ( PARTITION pmax VALUES LESS THAN MAXVALUE ); ``` 这将创建一个名为“partition_maintenance”的事件,每天运行一次,它将在“mytable”表中创建一个新的分区。 3. 自动分区 您可以在表中插入数据时自动创建分区。以下是一个示例触发器: ``` CREATE TRIGGER partition_insert BEFORE INSERT ON mytable FOR EACH ROW BEGIN DECLARE partition_name VARCHAR(20); SET partition_name = CONCAT('p', DATE_FORMAT(NEW.created_at, '%Y%m%d')); SET @partition_sql = CONCAT('PARTITION ', partition_name, ' VALUES LESS THAN (TO_DAYS(\'', DATE_ADD(DATE(NEW.created_at), INTERVAL 1 DAY), '\'))'); SET @sql = CONCAT('ALTER TABLE mytable ADD ', @partition_sql); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; ``` 这将创建一个名为“partition_insert”的触发器,在插入新记录时自动创建新的分区。该触发器将使用新记录的“created_at”值计算分区名称,并为该名称创建一个新的分区。 总之,以上是按天执行分区表SQL的步骤,希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值