当前位置:Gxlcms > 数据库问题 > 基于MYSQL事件的按月备份表,滚动,保留6次备份

基于MYSQL事件的按月备份表,滚动,保留6次备份

时间:2021-07-01 10:21:17 帮助过:9人阅读

set global event_scheduler = on; 查看事件功能是否打开 show variables like event_scheduler;

 


 

MYSQL事件实现

DELIMITER ;;
CREATE EVENT BACKUP
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE 
DO 
BEGIN
    select now();
END
;;
DELIMITER ;
技术分享图片
返回日期
CURDATE()

返回前一天的数字
DAY(CURDATE()-1)

日期减法函数:计算当天减去月初到昨天的天数,等于这个月的1号
DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY)

日期加法函数:得到下月1号的日期
DATE_ADD
DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY)

日期加法函数:得到下月1号的凌晨1点的时间
DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
实现细节  
创建表实现
CREATE TABLE `version_replace` (
  `table_name` varchar(32) NOT NULL,
  `table_version` int(10) unsigned NOT NULL DEFAULT 0,
  UNIQUE KEY `table_name_idx` (`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 


动态SQL语句实现改表名称为日期变量

SET @command=concat(RENAME TABLE `version` TO `version_backup_,date_format(now(),%y%m),` , `version_replace` TO `version`);
PREPARE modify FROM @command;
EXECUTE modify;

 


 

动态SQL语句实现删除6次之前的备份

SET @command=concat(DROP TABLE version_backup_,date_format(date_sub(now(), interval 6 month),%y%m),‘‘);
PREPARE modify FROM @command;
EXECUTE modify;
技术分享图片
获取格式化后的年月份
select date_format(now(),%y%m);

获取当前日期的前6个月
select date_sub(now(), interval 6 month);

取得当前日期的前6个月,并格式化显示,为拼接表名称做准备
select date_format(date_sub(now(), interval 6 month),%y%m);
实现细节

 


 

最终实现

DELIMITER ;;
CREATE EVENT BACKUP
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 0 HOUR)
ON COMPLETION PRESERVE ENABLE 
DO 
BEGIN
    /*创建一个待替换的空表*/
    CREATE TABLE `version_replace` (
    `table_name` varchar(32) NOT NULL,
    `table_version` int(10) unsigned NOT NULL DEFAULT 0,
    UNIQUE KEY `table_name_idx` (`table_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    /*RENAME语句具有原子性,把原表重命名为日期备份表,并且将创建的新表重命名为原表*/
    SET @command=concat(RENAME TABLE `version` TO `version_backup_,date_format(now(),%y%m),` , `version_replace` TO `version`);
    PREPARE modify FROM @command;
    EXECUTE modify;

    /*删除6个月前的那次备份*/
    SET @command=concat(DROP TABLE version_backup_,date_format(date_sub(now(), interval 6 month),%y%m),‘‘);
    PREPARE modify FROM @command;
    EXECUTE modify;
END
;;
DELIMITER ;

 

文章写的不错?请扫下面作者的讨饭专用码,赞助一下。

 

技术分享图片

 

基于MYSQL事件的按月备份表,滚动,保留6次备份

标签:col   int   表名   文章   功能   html   date   数据   table   

人气教程排行