1.创建分区表
sql
/*在MySQL中,UNIX_TIMESTAMP函数是一个非常常用的函数,它用于将日期时间转换为时间戳。
时间戳是表示日期和时间的一种整数形式,它表示自1970年1月1日以来的秒数。
使用UNIX_TIMESTAMP函数可以方便地将日期转换为时间戳,在处理日期时间相关的数据时非常方便。
模拟创建一个表game,分区字段为send_time,由于send_time存储的为时间戳,所以本次分区采用unix_timestamp函数来将日期转换为时间戳,来与send_time做比较。*/
CREATE TABLE `game` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`send_time` int unsigned NOT NULL COMMENT '发送时间戳(发送时间和1970年1月1号0时0分0秒所差的秒数)',
PRIMARY KEY (`id`,`send_time`) -- send_time分区字段必须为与原自增id配置为复合主键
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE (send_time) -- 创建一个以send_time为范围分区的表
(PARTITION p20240704 VALUES LESS THAN (unix_timestamp('2024-07-05')), -- 分区名字命名为p日期,数据存放条件为小于后一天的timestamp时间
PARTITION p20240705 VALUES LESS THAN (unix_timestamp('2024-07-06'))
);
-- 如需删除测试表
drop table game;
2.调用存储过程
sql
/* 在t数据库下,创建存储过程,名字为time_partition_procedure
存储过程说明,通过查询information_schema.PARTITIONS获取当前分区最后一个时间点,然后赋值给in_date变量,将in_date向后推1天作为@date,向后推2天作为@max_date
通过命令ALTER TABLE 表名 add PARTITION自动创建分区,分区名称为p@date,范围小于@max_date */
DELIMITER $$
USE `t`$$
DROP PROCEDURE IF EXISTS `time_partition_procedure`$$
CREATE DEFINER=`root`@`%` PROCEDURE `time_partition_procedure`()
BEGIN
SELECT REPLACE(b.partition_name,'p','') INTO @in_date FROM information_schema.PARTITIONS b WHERE b.table_name ='game' ORDER BY b.partition_ordinal_position DESC LIMIT 1;
SET @max_date= DATE_ADD(@in_date,INTERVAL 1 DAY)+1 ;
SET @date= DATE_ADD(@in_date,INTERVAL 1 DAY)+0 ;
SET @sql=CONCAT('ALTER TABLE game add PARTITION (PARTITION p',@date,' VALUES LESS THAN (unix_timestamp(''',@max_date,''')));');
SELECT @sql;
SELECT @max_date;
PREPARE strsql FROM @sql; #预执行sql
EXECUTE strsql; #执行sql
DEALLOCATE PREPARE strsql; #释放sql
COMMIT;
END$$
--如需删除存储过程
DROP PROCEDURE t.time_partition_procedure;
--查看存储过程的建表语句
SHOW CREATE PROCEDURE t.time_partition_procedure;
3.创建event事件
sql
--创建event事件,通过event定时调度任务来调用以上存储过程time_partition_procedure创建分区,注意使用该方案,需要启用event事件才行。
DELIMITER $$
CREATE EVENT `t`.`time_partition_event`
ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(CURRENT_DATE+1,INTERVAL 3 HOUR)
ON COMPLETION PRESERVE
ENABLE DO
BEGIN
CALL time_partition_procedure();
END$$
--如需删除事件
drop event `t`.`time_partition_event`;
--查看t数据库下的event
show events from t;
--采用如下2个命令确认事件event是否启用。
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
--查看event的执行情况,最后一次执行的时间
select EVENT_NAME,LAST_EXECUTED,STATUS from information_schema.events;
4.存储过程手工调用和验证
sql
-- 手工调用存储过程
CALL t.time_partition_procedure();
--调用完成之后,查看是否生成了新的分区
show create table game;
或者
select TABLE_NAME,PARTITION_NAME,PARTITION_ORDINAL_POSITION FROM information_schema.PARTITIONS b WHERE b.table_name ='game' ORDER BY b.partition_ordinal_position DESC LIMIT 10\G;