业务场景:预测文章发布数据量非常大,为了性能上的考虑,决定按月分表存储文章数据,需要用到定时器+存储过程
1、先编写存储过程, 使用delimiter重新定义语句分隔符,标明以下是一条整体语句
delimiter //
DROP PROCEDURE IF EXISTS create_table_like_info; -- 删除存储过程
CREATE PROCEDURE create_table_like_info()
BEGIN
DECLARE tbname VARCHAR(50);
SET tbName = CONCAT('xny_sem_info_', date_format(now(), "%Y%m")); -- 定义表名
SET @stmt := CONCAT("CREATE TABLE IF NOT EXISTS ", tbName, " LIKE
xny_sem_info"); // 以原表作为新表的创建模板,eg:xny_sem_info_202004
PREPARE STMT FROM @stmt; # 预处理语句
EXECUTE STMT;
END;
//
2、创建定时器
DROP EVENT IF EXISTS crontab_create_info_event;
CREATE EVENT IF NOT EXISTS crontab_create_info_event -- 创建一个事件
on schedule every 1 day -- 设置每1天执行一次(这里有待改善)
ON completion preserve
DO CALL create_table_like_info();
3、创建的定时器事件默认是关闭状态,需要执行命令开启事件
ALTER EVENT crontab_create_info_event ON COMPLETION PRESERVE ENABLE;
4、检查mysql是否开启定时器
SHOW VARIABLES LIKE '%sche%'; -- event_scheduler 为1或者ON表示已开启
SET GLOBAL event_scheduler = 1; -- 启动定时器(设置开机自启动,找到etc/my.cnf 打开 在[mysqld]底下添加 event_scheduler = 1)
5、其他命令
ALTER EVENT crontab_create_info_event ON COMPLETION PRESERVE DISABLE; -- 关闭事件
DROP PROCEDURE createTableLikeInfo; -- 删除存储过程
SHOW VARIABLES LIKE '%sche%'; -- 查看是否启用定时器
SET GLOBAL event_scheduler = 1; -- 启动定时器
SET GLOBAL event_scheduler = 0; -- 停止定时器
SHOW EVENTS; -- 查看已创建的定时器
SHOW PROCEDURE STATUS; -- 查看已创建的存储过程