实现了下自动按月表分区,开发环境为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后重启即可。
这一次的节点更新覆盖了欧洲、日本、新加坡、加拿大、韩国、美国、香港等地区,最高速度可达18.3 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
这一次的节点更新覆盖了美国、韩国、日本、香港、新加坡、欧洲、加拿大等地区,最高速度可达21.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。 有没有办法不保存镜像而直接修改
摘要: 今天给各位分享动物疫苗工艺有哪些种类的知识,其中也会对动物疫苗工艺流程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、所有疫苗的种类的区别.
进程 进程就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进程保存着程序每一个时刻运行的状态。进程的两个基本元素是程序代码和与代码关联的数据集。进程执行的任意时刻包含了
在原来python2里有一个函数apply来做这种事情,如下: # File: builtin-apply-example-1.py def function(a, b): print a
摘要: 本篇文章给大家谈谈我想开宠物店,以及我想开宠物店怎么申请对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、开一个宠物店大概需要多少投资?...
这一次的节点更新覆盖了日本、加拿大、新加坡、韩国、欧洲、香港、美国等地区,最高速度可达20.3 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。
摘要: 今天给各位分享领养孩子协议书需要公证吗怎么写的知识,其中也会对领养孩子的协议书样本进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、领养孩子.
摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于动物疫苗的生产及检验的问题,于是小编就整理了3个相关介绍动物疫苗的生产及检验的解答,让我们一起看看吧。动物检疫合格证明需要查什么