实现了下自动按月表分区,开发环境为Mysql 5.7.28

核心的两个存储过程:
auto_create_partition为创建表分区,调用后为该表创建到下月结束的表分区。
auto_del_partition为删除表分区,方便历史数据空间回收。

DELIMITER $$ DROP PROCEDURE IF EXISTS auto_create_partition$$ CREATE PROCEDURE `auto_create_partition`(IN `table_name` varchar(64)) BEGIN 			SET @next_month:=CONCAT(date_format(date_add(now(),interval 2 month),'%Y%m'),'01'); 			SET @SQL = CONCAT( 'ALTER TABLE `', table_name, '`', 					' ADD PARTITION (PARTITION p', @next_month, " VALUES LESS THAN (TO_DAYS(", 							@next_month ,")) );" ); 			PREPARE STMT FROM @SQL; 			EXECUTE STMT; 			DEALLOCATE PREPARE STMT; END$$  DROP PROCEDURE IF EXISTS auto_del_partition$$ CREATE PROCEDURE `auto_del_partition`(IN `table_name` varchar(64),IN `reserved_month` int) BEGIN 	DECLARE v_finished INTEGER DEFAULT 0; 	DECLARE v_part_name varchar(100) DEFAULT ""; 	DECLARE part_cursor CURSOR FOR  		select partition_name from information_schema.partitions where table_schema = schema() 			and table_name=@table_name and partition_description < TO_DAYS(CONCAT(date_format(date_sub(now(),interval reserved_month month),'%Y%m'),'01')); 	DECLARE continue handler FOR  		NOT FOUND SET v_finished = TRUE; 	OPEN part_cursor; read_loop: LOOP 	FETCH part_cursor INTO v_part_name; 	if v_finished = 1 then 		leave read_loop; 	end if; 	SET @SQL = CONCAT( 'ALTER TABLE `', table_name, '` DROP PARTITION ', v_part_name, ";" ); 	PREPARE STMT FROM @SQL; 	EXECUTE STMT; 	DEALLOCATE PREPARE STMT; 	END LOOP; 	CLOSE part_cursor; END$$  DELIMITER ; 

下面是示例

-- 假设有个表叫records,设置分区条件为按end_time按月分区 DROP TABLE IF EXISTS `records`; CREATE TABLE `records` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `start_time` datetime NOT NULL,   `end_time` datetime NOT NULL,   `memo` varchar(128) CHARACTER SET utf8mb4 NOT NULL,   PRIMARY KEY (`id`,`end_time`) )  PARTITION BY RANGE (TO_DAYS(end_time))( 	PARTITION p20200801 VALUES LESS THAN ( TO_DAYS('20200801')) );  DROP EVENT IF EXISTS `records_auto_partition`;  -- 创建一个Event,每月执行一次,同时最多保存6个月的数据 DELIMITER $$ CREATE EVENT `records_auto_partition` ON SCHEDULE EVERY 1 MONTH ON COMPLETION PRESERVE ENABLE DO BEGIN call auto_create_partition('records'); call auto_del_partition('records',6); END$$ DELIMITER ; 

几点注意事项:

对于Mysql 5.1以上版本来说,表分区的索引字段必须是主键
存储过程中,DECLARE 必须紧跟着BEGIN,否则会报看不懂的错误
游标的DECLARE需要在定义声明之后,否则会报错
如果是自己安装的Mysql,有可能Event功能是未开启的,在创建Event时会提示错误;修改my.cnf,在 [mysqld] 下添加event_scheduler=1后重启即可。

热门文章

2月13日更新18.3M/S,2025年最新高速V2ray/Shadowrocket/Clash/SSR订阅链接免费节点地址分享

这一次的节点更新覆盖了欧洲、日本、新加坡、加拿大、韩国、美国、香港等地区,最高速度可达18.3 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

1月17日更新21.2M/S,2025年最新高速V2ray/Shadowrocket/Clash/SSR订阅链接免费节点地址分享

这一次的节点更新覆盖了美国、韩国、日本、香港、新加坡、欧洲、加拿大等地区,最高速度可达21.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

修改docker容器端口映射的方法

大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。 有没有办法不保存镜像而直接修改

动物疫苗工艺有哪些种类(动物疫苗工艺流程)

摘要: 今天给各位分享动物疫苗工艺有哪些种类的知识,其中也会对动物疫苗工艺流程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、所有疫苗的种类的区别.

并发编程基础底层原理学习_在线工具

进程 进程就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进程保存着程序每一个时刻运行的状态。进程的两个基本元素是程序代码和与代码关联的数据集。进程执行的任意时刻包含了

python里函数怎么样使用元组或字典作为参数调用

在原来python2里有一个函数apply来做这种事情,如下: # File: builtin-apply-example-1.py def function(a, b): print a

我想开宠物店(我想开宠物店怎么申请)

摘要: 本篇文章给大家谈谈我想开宠物店,以及我想开宠物店怎么申请对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、开一个宠物店大概需要多少投资?...

2月23日更新20.3M/S,2025年最新高速V2ray/SSR/Clash/Shadowrocket订阅链接免费节点地址分享

这一次的节点更新覆盖了日本、加拿大、新加坡、韩国、欧洲、香港、美国等地区,最高速度可达20.3 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

领养孩子协议书需要公证吗怎么写(领养孩子的协议书样本)

摘要: 今天给各位分享领养孩子协议书需要公证吗怎么写的知识,其中也会对领养孩子的协议书样本进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、领养孩子.

动物疫苗的生产及检验 动物疫苗的生产及检验方法

摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于动物疫苗的生产及检验的问题,于是小编就整理了3个相关介绍动物疫苗的生产及检验的解答,让我们一起看看吧。动物检疫合格证明需要查什么

归纳