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 相关文章推荐
MySQL pt-slave-restart工具的使用简介
Apr 07 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
浅谈mysql增加索引不生效的几种情况
Jun 23 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
mysql序号rownum行号实现方式
Dec 24 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中用hash实现的数组
2011/07/17 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
express框架下使用session的方法
2019/07/31 Javascript
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
python+django快速实现文件上传
2016/10/24 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
JPA面试常见问题
2016/11/14 面试题
鼓舞士气的口号
2014/06/16 职场文书
会计学毕业生求职信
2014/06/25 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
行为习惯主题班会
2015/08/14 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
员工给公司的建议书
2019/06/24 职场文书
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript