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

要求:

    • 每月1日0点:在不影响业务的情况下,备份整月的数据,保留6次备份。

思路:

    1. 基于MYSQL事件功能,每月按时完成操作
    2. RENAME语句具有原子性,新旧表无缝切换
    3. RENAME语句仅修改表定义,大表瞬间完成
    4. 基于上面三点,实现了表数据按月切割

步骤:

    1. 新建一个待替换的空表
    2. 重命名原表为日期备份表,空表为原表
    3. 删除6次前备份的那张表


参考官方文章

https://dev.mysql.com/doc/refman/5.6/en/rename-table.html



前提要求:打开MYSQL的事件功能

打开事件功能
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 ;

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

原文地址:https://www.cnblogs.com/yangjinheng/p/8283973.html

时间: 2024-10-07 19:16:29

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

Mysql性能优化三(分表、增量备份、还原)

对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据是 最重要的.UNION 例: 订单表根据订单产生时间

mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法

补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题. 背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机,唉,悲剧了,于是重新安装了系统 windows server 2008 enterprise 32bit. 详情: 系统安装完成后,重新配置之前那个网站,appache服务配好之后,再配置数据的时候是这样做的,将原来Mysql 文件夹(C:\Windows.old\ProgramData\MySQ

MySQL之按月拆分主表并按月分表写入数据提高数据查询速度

使用场景: 主表数据量特别大,为了提高查询的速度,可以考虑按月进行分表,要求就是当月的数据到当月表查询,上月的数据到上月表查询,当天的数据到主表来查询.这样在一定程度上也是提高了数据的查询速度 过程演示: 1.创建总表: CREATE TABLE `zong_biao` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `password` varchar

mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表,我是按月分的,每个月一张表,这时候的问题是 数据库有多张同样的分表如何根据条件查询? 在进行分页的时候如何计算总记录数?如何查询出所有分表? 每个月的新表是如何创建?系统如何自动创建? 不确定哪个分表的情况如何查询某一条详细记录? 分表查询分表查询可以用union或者union all进行查询uni

转 移动云基于MySQL Galera的PXC运维实战

https://mp.weixin.qq.com/s/YTwdVRh_Uhtf3bn2MO2H_Q 作者介绍 刘书浩,“移动云”DBA,负责“移动云”业务系统的数据库运维.标准化等工作:擅长MySQL技术领域,熟悉MySQL复制结构.Cluster架构及运维优化:具有自动化运维经验,负责“移动云”数据库管理平台的搭建. 前言 在众多的MySQL开源软件中,Galera是非常有特色的,它的特点及优势是具有良好的并发性和一致性.Galera Cluster的主要用途是为MySQL提供一致性的集群化解

Mysql事件学习

出自:http://blog.chinaunix.net/uid-20639775-id-3323098.html 在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQL语句.对于linux系统熟悉的人都知道linux的cron计划任务,能很方便地实现定期运行指定命令的功能.Mysql在5.1以后推出了事件调度器(Event Scheduler),和linux的cron功能一样,能方便地实现 mysql数据库的计划任务,而且能精确到秒.使用起来非常简单和方便. 由于最近需要用到事件这

MySQL备份和还原系列一:备份类型

一.mysql备份类型 1.按照mysql服务器状态 cold    离线备份,读.写操作均中止 warm    仅可执行读操作 hot     读.写操作不受影响 2.按照数据一致性 consistent inconsistent 3.按照备份数据格式 logical     备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现 physical    文件系统层面直接拷贝数据文件,但真正备份的时候自然不是cp这么简单 4.数据存储方式 full            完全备份

《奥威Power-BI基于MySQL数据源制作报表》腾讯课程开课啦

前阵子奥威公开课讲过基于oracle数据源制作报表,有些宝宝就有小情绪了:简直就是不把我MySQL放在眼里嘛!oracle和MySQL一直以来被大家对比了很多次,同属于 Oracle 旗下产品,本是同根生,相煎何太急?这oracle和MySQL各有千秋,有着不同的侧重点和各自的小成就.为了我们的MySQL铁粉们,奥威软件决定这次就来讲一讲MySQL咯! 讲师介绍:李显斯 多年的甲方.乙方工作经验,熟悉企业的业务流程,主要从事数据库.BI开发,对ETL.数据仓库技术有着丰富的经验. 直播时间:20

Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录

在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份. 下面对这种备份方案详细说明下:1.MySQLdump增量备份配置执行增量备份的前提条件是MySQL打开binlog日志功能,在my.cnf中加入log-bin=/opt/Data/MySQL-bin"log-bin="后的字符串为日志记载目录,一般建议放在不同于MySQL数据目录的磁盘