要求:

    • 每月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
    HOUR)
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
    select now();
END
;;
DELIMITER ;
返回日期
CURDATE()

返回前一天的数字
)

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

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

日期加法函数:得到下月1号的凌晨1点的时间
DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL    HOUR)

实现细节

 

创建表实现
CREATE TABLE `version_replace` (
  `table_name` ) NOT NULL,
  `table_version` ) unsigned ',
  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次之前的备份

 month),'%y%m'),'');
PREPARE modify FROM @command;
EXECUTE modify;
获取格式化后的年月份
select date_format(now(),'%y%m');

获取当前日期的前6个月
 month);

取得当前日期的前6个月,并格式化显示,为拼接表名称做准备
 month),'%y%m');

实现细节


最终实现

DELIMITER ;;
CREATE EVENT BACKUP
    HOUR)
ON COMPLETION PRESERVE ENABLE
DO
BEGIN
    /*创建一个待替换的空表*/
    CREATE TABLE `version_replace` (
    `table_name` ) NOT NULL,
    `table_version` ) unsigned ',
    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个月前的那次备份*/
     month),'%y%m'),'');
    PREPARE modify FROM @command;
    EXECUTE modify;
END
;;
DELIMITER ;

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

MYSQL数据库表按月备份,滚动,保留6次备份的更多相关文章

  1. 将Hive统计分析结果导入到MySQL数据库表中(一)——Sqoop导入方式

    https://blog.csdn.net/niityzu/article/details/45190787 交通流的数据分析,需求是对于海量的城市交通数据,需要使用MapReduce清洗后导入到HB ...

  2. centos/windows服务器,Mysql数据库表结构损坏-已解决

    [问题原因]服务器突然断电 [故障报告]数据库表结构损坏 [解决思路]进入强制恢复模式,备份库表及数据重建 故障发现 周末公司断电,周一启动数据库就直接报错了 查看日志 上面标记的log,明确表示是非 ...

  3. mysql数据库表的自增主键号不规律,重新排列

    mysql数据库表的自增主键ID乱了,需要重新排序. 原理:删除原有的自增ID,重新建立新的自增ID. 1.删除原有主键: ALTER TABLE `table_name` DROP `id`; 2. ...

  4. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  5. 用户中心mysql数据库表结构的脚本

    /* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...

  6. mysql数据库表结构导出

    mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...

  7. Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题

    Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...

  8. 查看MySQL数据库表的命令介绍

    如果需要查看MySQL数据库中都有哪些MySQL数据库表,应该如何实现呢?下面就为您介绍查看MySQL数据库表的命令,供您参考. 进入MySQL Command line client下查看当前使用的 ...

  9. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

随机推荐

  1. 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】

    [053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...

  2. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router

    路由koa-router--MVC 中重要的环节:Url 处理器

  3. 关于Android中so解析那些事

    1.Android系统目前支持的CPU架构:ARMv5.ARMv7.x86.MIPS.ARMv8.MIPS64.x86_64,每一种都关联着一个ABI(Application Binary Inter ...

  4. CSS小全

    CSS 的使用 内联(inline style attribute) 完全不应该这样做 <head> 标签内的 <style> 标签 偶尔可以用 <link> 标签 ...

  5. NanUI 0.4.4发布

    NanUI是一个基于ChromiumFX开源项目的.Net Winform界面库,ChromiumFX是Chromium Embedded Framework的.Net实现.众所周知,Chromium ...

  6. 《奇思妙想:15位计算机天才及其重大发现》【PDF】下载

    <奇思妙想:15位计算机天才及其重大发现>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196328 内容简介 本书介绍了15位当代 ...

  7. Android Spinner值不显示,选择列表正常

    你在给adapter设置数据时,如果你是静态数据,也就是死数据,那么spinner显示没有问题,但是你如果异步进行网络请求,或者使用Volley请求的时候就要注意,你的adapter设置要在onRes ...

  8. C# 委托与事件详解(二)

    什么是事件?EVENT?点击事件?加载事件?一连串的模糊的概念冲击着我们弱小的脑袋 那我们首先来看一下比较正统的感念吧: 事件是类在发生其关注的事情时用来提供通知的一种方式. 事件的发生一般都牵扯2个 ...

  9. 【java】读取资源文件key->value,java.util.ResourceBundle

    package 国际化; import java.util.ResourceBundle; public class TestResource { public static void main(St ...

  10. C++模板显式实例化,隐式实例化,特化(具体化,偏特化)辨析

    最近再次看C++ PRIMER PLUS的时候看到这个部分感觉讲得很烂,前后口径不一致,所以写个辨析让自己明白的同时也希望对此不太清楚的朋友能搞懂. 总结一下,C++只有模板显式实例化(explici ...