MySQL创建分区表,并按天自动分区
Posted 雅冰石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL创建分区表,并按天自动分区相关的知识,希望对你有一定的参考价值。
#创建测试数据库
create database csl_test character set utf8 collate utf8_unicode_ci;
#创建测试表
注:要分区的字段 需要为主键。
use csl_test; # 切换到刚刚创建的测试数据库
create table t_partition_test (
pk_id bigint(20) not null auto_increment,
time datetime not null,
msg varchar(200),
primary key (pk_id,time)
)engine=innodb default charset=utf8 collate utf8_unicode_ci comment="test partition";
#插入测试数据
insert into t_partition_test(time,msg) values
('2021-02-01 13:34:23',"20210201133423"),
('2021-02-02 14:23:13',"20210202142313");
#对表进行分区
#修改主键字段
alter table t_partition_test drop primary key, add primary key (pk_id, time);
#批量分区
alter table t_partition_test partition by range columns(time)(
partition p20210201 values less than('2021-02-02'),
partition p20210202 values less than('2021-02-03'),
partition p20210203 values less than('2021-02-04')
);
#查看表分区
select partition_name,partition_description as val from information_schema.partitions
where table_name = 't_partition_test' and table_schema = 'csl_test';
#创建增加删除分区的存储过程
-- 定义mysql提交查询语句 结束标识 为 $$
DELIMITER $$
DROP PROCEDURE IF EXISTS p_partition_test # 创建过程 p_partition_test
$$
CREATE PROCEDURE p_partition_test()
BEGIN
DECLARE v_sysdate DATE; # 声明 当前时间
DECLARE v_mindate DATE; # 声明 目前分区的最小值
DECLARE v_maxdate DATE; # 声明 目前分区值中的最大值
DECLARE v_pt VARCHAR(20); # 声明 分区名称 数字部分
DECLARE v_maxval VARCHAR(20); # 声明 最大值
DECLARE i INT; # 声明 ??
-- 增加新分区
-- select into A from B 用法;A表作为临时表,不存在。
-- 不同于insert into A select from B,A必须存在。
SELECT MAX(CAST(REPLACE(partition_description, '''', '') AS DATE)) AS val
INTO v_maxdate
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 't_partition_test' AND TABLE_SCHEMA = 'csl_test';
SET v_sysdate = SYSDATE(); # 赋值v_sysdate为当前时间
-- INTERVAL 时间计算的关键字
WHILE v_maxdate <= (v_sysdate + INTERVAL 3 DAY) DO
SET v_pt = DATE_FORMAT(v_maxdate ,'%Y%m%d');
SET v_maxval = DATE_FORMAT(v_maxdate + INTERVAL 1 DAY, '%Y-%m-%d');
SET @sql = CONCAT('alter table t_partition_test add partition (partition p', v_pt, ' values less than(''', v_maxval, '''))');
-- SQL语句预处理,在对于反复调用相同或极度相似的语句,进行预处理会优化处理速度,我感觉这里的用法应该没有效果
PREPARE stmt FROM @sql;
EXECUTE stmt;
-- 删除预处理
DEALLOCATE PREPARE stmt;
SET v_maxdate = v_maxdate + INTERVAL 1 DAY; # 最大值 加一操作
END WHILE;
-- 删除旧分区
SELECT MIN(CAST(REPLACE(partition_description, '''', '') AS DATE)) AS val
INTO v_mindate
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 't_partition_test' AND TABLE_SCHEMA = 'csl_test';
-- 删除一年前的旧分区
WHILE v_mindate <= (v_sysdate - INTERVAL 1 YEAR) DO
SET v_pt = DATE_FORMAT(v_mindate - INTERVAL 1 DAY,'%Y%m%d');
SET @sql = CONCAT('alter table t_partition_test drop partition p', v_pt);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_mindate = v_mindate + INTERVAL 1 DAY;
END WHILE;
END$$
-- 重新定义 MySQL提交查询语句的 结束标识 为 ;
DELIMITER ;
#手动调用存储过程
call p_partition_test; # call p_partition_test();
#开启事件
mysql默认是关闭定时任务
查看定时任务是否开启,OFF是没有开启:
show variables like '%event_scheduler%';
-- 或者
select @@event_scheduler;
临时开启定时任务(重启之后,配置会回复)
set global event_scheduler = 1;
永久开启,修改配置文件 my.cnf,
event_scheduler=ON;
创建event事件
delimiter $$
drop event if exists auto_pt $$
create event auto_pt
on schedule
-- every 1 minute
every 1 day
starts '2021-02-01 13:19:02'
do
BEGIN
call p_partition_test();
END$$
delimiter ;
————————————————
版权声明:本文为CSDN博主「凉月啊八」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_15028305/article/details/114062707
以上是关于MySQL创建分区表,并按天自动分区的主要内容,如果未能解决你的问题,请参考以下文章