MySQL使用存储过程分表
涉及技术有Sql语句、存储过程、MySQL事件
需求:按月对每个表进行分表备份操作
实现:编写一个存储过程1、重命名现有的表名后缀添加上一个月,然后创建相同结构的新表。2、定时执行该任务
备份的表名:mmall_order
存储过程名称:p_month_backups
定时任务名称:month_call_order_backups
一、创建存储过程
create procedure p_month_backups() BEGIN # 创建表名后缀,上个月 SET @dateStr = DATE_FORMAT(date_add(now(),interval-1 month), '%Y_%m'); #这里直接重命名原来的表 SET @renameTableName = CONCAT("rename table mmall_order to mmall_order_",@dateStr); PREPARE stmt FROM @renameTableName; EXECUTE stmt; #创建新表 SET @createStr = CONCAT("create table mmall_order as select * from mmall_order_",@dateStr," where 1=2"); PREPARE stmt FROM @createStr; EXECUTE stmt; END ;
步骤依次是:重命名原来的表,创建新表
二、调用存储过程测试是否能达到理想的结果
如上图所示,存储过程达到理想的效果,然后编写定时任务(事件)执行该存储过程。
三、编写事件
首先确认打开定时器
#查看定时器是否开始 ON/OFF show variables like 'event_scheduler'; #若结果为OFF 则执行下面语句开启 SET GLOBAL event_scheduler = 1;
首先创建一分钟执行一次的定时任务,测试使用
CREATE EVENT `month_call_order_backups` ON SCHEDULE EVERY '1' DAY_MINUTE STARTS '2018-12-19 00:00:00' DO call p_month_backups();
然后还原之前调用的数据等待一分钟看效果
drop table mmall_order rename table mmall_order_2019_08 to mmall_order
我这里为了测试,时间调整为10秒,效果如下图:
然后把存储过程调用的时间改为每月一号凌晨调用即可
扩展资料:
#查看定时器是否开始 ON/OFF show variables like 'event_scheduler'; #若结果为OFF 则执行下面语句开启 SET GLOBAL event_scheduler = 1; show processlist; show events;
也可以添加一个日志表,每次定时任务执行都插入开始和结束日志:
CREATE TABLE `sys_log` ( `log_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'log的id唯一标识', `log_type` int(11) DEFAULT NULL COMMENT 'log的类型,{info:1,error:0 } error,info或者其它', `log_trigger` varchar(225) DEFAULT NULL COMMENT 'log的触发器,例如存储过程等', `log_content` varchar(225) DEFAULT NULL COMMENT 'log记录的内容', `log_creatime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'log的创建时间', `log_remarks` varchar(225) DEFAULT NULL COMMENT 'log的备注', PRIMARY KEY (`log_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后把存储过程写成活的,例如表名作为参数传进去,更改后如下:
create procedure p_month_backups(in tabName VARCHAR (255)) BEGIN insert into sys_log (log_type, log_trigger, log_content, log_creatime, log_remarks) VALUES (1,"procedure-p_month_backups","begin",now(),CONCAT("操作表名称:",tabName)); # SET @dateStr = DATE_FORMAT(NOW(), '%Y_%m'); SET @dateStr = DATE_FORMAT(date_add(now(),interval-1 month), '%Y_%m'); #这里直接重命名原来的表 SET @renameTableName = CONCAT("rename table ",tabName," to ",tabName,"_",@dateStr); PREPARE stmt FROM @renameTableName; EXECUTE stmt; #创建新表 SET @createStr = CONCAT("create table ",tabName," as select * from ",tabName,"_",@dateStr," where 1=2"); PREPARE stmt FROM @createStr; EXECUTE stmt; insert into sys_log (log_type, log_trigger, log_content, log_creatime, log_remarks) VALUES (1,"procedure-p_month_backups","end",now(),CONCAT("操作表名称:",tabName)); END ;
AT:只执行一次
EVERY:间隔性执行。时间与开始时间对应
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类