mysql备份策略的实现(全量备份+增量备份)


Posted in MySQL onJuly 07, 2021
目录
  • 设计场景
  • 技术点
  • 服务器信息
  • 准备工作
  • 编写全量备份脚本(Mysql-FullyBak.sh)
  • 编写增量备份脚本
  • 设置定时任务crontab
  • 恢复操作

最近项目需要对数据库数据进行备份,通过查阅各种资料,设计了一套数据库备份策略,通过调试运行一周后,目前已经处于平稳运行状态。现在将思路分享出来,同时感谢gredn大佬。

 

设计场景

1)增量备份在周一到周六凌晨3点,复制mysql-bin.00000*到指定目录;
2)全量备份则使用mysqldump将整个数据库导出,每周日凌晨3点执行,并会删除上周留下的mysq-bin.00000*,然后对mysql的备份操作会保留在bak.log文件中。

 

技术点

Mysqldump、mysqlbinlog、crontab

 

服务器信息

主机:centos7;数据库:mysql5.7

 

准备工作

开启binlog日志功能
(1)新建目录,执行:

#mkdir /home/mysql
#cd /home/mysql
#mkdir mysql-bin.      #增量日志文件目录

(2)修改所属的用户/组:(不修改,mysql无法重启)

#chown -R mysql.mysql mysql-bin

mysql备份策略的实现(全量备份+增量备份)

(3)修改mysql配置文件,执行:

#vim /etc/my.cnf

mysql备份策略的实现(全量备份+增量备份)

其中,server-id表示单个结点的id,这里由于只有一个结点,所以可以把id随机指定为一个数,这里将id设置成1。若集群中有多个结点,则id不能相同(对于5.7以下版本不需要指定server-id);
log_bin指定binlog日志文件的存储路径,日志文件以mysql-bin开头。

(4)重启mysql,执行:

#systemctl restart mysqld.service

(5)查看日志文件:

#cd /home/mysql/mysql-bin

mysql备份策略的实现(全量备份+增量备份)

(6)进入数据库,查看启动效果:

#show variables like '%log_bin%';

mysql备份策略的实现(全量备份+增量备份)

 

编写全量备份脚本(Mysql-FullyBak.sh)

进入/home/mysql目录
新建目录:mkdir backup
进入backup目录,新建daily目录:mkdir backup
切换到/home/mysql目录,执行:

#vim Mysql-FullyBak.sh

mysql备份策略的实现(全量备份+增量备份)

参数说明:
?lock-tables
锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于MySQL数据库引擎为MyISAM 表,如果是 Innodb 表可以用 ?single-transaction 选项。
?flush-logs
结束当前日志,生成新日志文件。
?delete-master-logs
清除以前的日志,以释放空间。但是如果服务器配置为镜像的复制主服务器,用?delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容。在这种情况下,使用 PURGE MASTER LOGS更为安全。
?quick
该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
?single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 ?lock-tables 选项是互斥的,因为lock-tables会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 ?quick 选项。
?events
导出事件
?master-data=2
其中参数?master-data=[0|1|2]
0: 不记录
1:记录为CHANGE MASTER语句
2:记录为注释的CHANGE MASTER语句
?master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称,
用于日后恢复时参考,例如输出的备份SQL文件中含有:
CHANGE MASTER TO MASTER_LOG_FILE='MySQL-bin.000002′, MASTER_LOG_POS=106;

 

编写增量备份脚本

切换到/home/mysql目录,执行:

#vim Mysql-DailyBak.sh

mysql备份策略的实现(全量备份+增量备份)

 

设置定时任务crontab

(1)安装crontab(centos7默认已经安装):

#yum install crontabs

服务操作说明:

#/bin/systemctl start crond.service //启动服务
#/bin/systemctl stop crond.service //关闭服务
#/bin/systemctl restart crond.service //重启服务
#/bin/systemctl reload crond.service //重新载入

配置:

#/bin/systemctl status crond.service //服务状态

加入开机自动启动:

#chkconfig ?level 35 crond on

(2)在命令行输入:

#crontab -e

添加相应的任务,wq存盘退出

#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /bin/bash -x /home/mysql/Mysql-FullyBak.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /bin/bash -x /home/mysql/Mysql-DailyBak.sh >/dev/null 2>&1

说明:默认情况下,crontab执行一次任务后,会通过email通知用户,为避免每次发信息,加入/dev/null 2>&1

(3)查看定时任务:#crontab -l

mysql备份策略的实现(全量备份+增量备份) 

参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 ;
  crontab -l //列出某个用户cron服务的详细内容;
  crontab -r //删除所有用户的cron服务;
  crontab -e //编辑某个用户的cron服务;
  例如:root查看自己的cron设置:crontab -u root -l
  例如:root删除用户fred的cron设置:crontab -u fred -r
补充:
(1)可直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务(针对整个系统的crontab文件);
(2)crontab执行定时任务的记录会写入到/var/log/cron这个文件中,该记录以帐号为区分。

 

恢复操作

恢复过程亦会写入日志文件,如果数据量很大,建议先关闭binlog日志功能
1、场景:假设早上9点的时候,数据库被攻击,drop了整个数据库!
2、恢复思路:
利用全备的sql文件中记录的CHANGE MASTER语句,binlog文件及其位置点信息,找出binlog文件中增量的那部分。
用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句。
通过全备文件和增量binlog文件导出的sql文件,就可以恢复到完整的数据。
3、恢复步骤:

(1)首先,解压最新的全量备份文件,进入备份文件目录,执行:

#tar -zxvf XXX.sql.tgz

mysql备份策略的实现(全量备份+增量备份) 

(2)查看全备之后新增的binlog文件,执行:

#grep CHANGE XXX.sql

mysql备份策略的实现(全量备份+增量备份)

由图可知,这是全备时刻的binlog文件位置,即mysql-bin.000003的154行,因此在该文件之前的binlog文件中的数据都已经包含在这个全备的sql文件中。

(3)恢复mysql-bin.000003文件的154行之后的信息

进入到mysql-bin.000003目录,执行(sysecokit为数据库名);

#mysqlbinlog --start-position=154 --database=sysecokit mysql-bin.000003 | mysql -uroot -p -v sysecokit

(4)将其他binlog文件(除去mysql-bin.000003)导出sql文件,执行(-d指定数据库):

#mysqlbinlog -d sysecokit mysql-bin.00000X >00Xbin.sql

mysql备份策略的实现(全量备份+增量备份) 

(5) vim编辑最新的00Xbin.sql删除其中的drop语句
(6)恢复全备数据,执行:

#mysql -uroot -p < XXX.sql

如:#mysql -uroot -p < 20180716.sql
(7)恢复增量数据,执行(syseco为数据库名称):

#mysql -uroot -p syseco<00Xbin.sql

如:#mysql -uroot -p syseco<004bin.sql
自此,已经完成所有工作,让我们查看一下运行一周后产生的文件:

mysql备份策略的实现(全量备份+增量备份) 

到此这篇关于mysql备份策略的实现(全量备份+增量备份)的文章就介绍到这了,更多相关mysql备份策略内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
Mysql数据库命令大全
May 26 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
mysql定时自动备份数据库的方法步骤
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 #MySQL
MySQL一些常用高级SQL语句
MySQL系列之十四 MySQL的高可用实现
MySQL系列之十二 备份与恢复
Jul 02 #MySQL
MySQL系列之十一 日志记录
Jul 02 #MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
You might like
php中日期加减法运算实现代码
2011/12/08 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
python实现Zabbix-API监控
2018/09/17 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Python3实现飞机大战游戏
2020/04/24 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
煤矿安全承诺书
2014/05/22 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers