MySQL5.7增量备份恢复全实战
一. 简介
1. 增量备份
增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量
备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。
这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。
必须具有上一次全备份和所有增量备份(一旦丢失或损坏其中的一个增量,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份
的时间顺序逐个恢复,因此这就极大地延长了恢复时间。
假如我们有一个数据库,有20G的数据,每天会增加10M的数据,数据库每天都要全量备份一次,这样的话服务器的压力比较大,因此我们只
需要备份增加的这部分数据,这样减少服务器的负担。
2. binlog简介
binlog日志由配置文件的log-bin参数来启用,MySQL服务器将在指定目录下创建两个文件XXX-bin.001和xxx-bin.index,若配置选项
没有给出文件名,Mysql将使用主机名称命名这两个文件,其中.index文件包含一份全体日志文件的清单。
Mysql会把用户对所有数据库的内容和结构的修改情况记入XXX-bin.n文件,而不会记录 SELECT和没有实际更新的UPDATE语句。
当MySQL数据库停止或重启时,服务器会把日志文件记入下一个日志文件,Mysql会在重启时生成一个新的binlog日志文件,文件序号递
增,此外,如果日志文件超过max_binlog_size系统变量配置的上限时,也会生成新的日志文件。
二 binlog操作总结
2.1 开启binlog日志
修改 MySQL 的配置文件my.cnf 如下:
[mysqld]
log-bin=/MySQL/my3306/log/binlog/binlog
binlog_format = row
#其中 log_bin若不显示指定存储目录,则默认存储在mysql的datadir参数指定的目录下
#binlog_format的几种格式:(STATEMENT,ROW和MIXED):
STATEMENT:基于SQL语句的复制(statement-based replication, SBR)
ROW:基于行的复制(row-based replication, RBR)
MIXED:混合模式复制(mixed-based replication, MBR)
#启动后会产生mysql-bin.*这样的文件,每启动一次,就会增加一个或者多个.
[root@localhost binlog]# cd /MySQL/my3306/log/binlog
[root@localhost binlog]# ll
total 28
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql 981 Jun 6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql 177 Jun 6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql 177 Jun 7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 154 Jun 7 02:47 binlog.000006
-rw-r-----. 1 mysql mysql 234 Jun 7 02:47 binlog.index
2.2查看binlog相关参数
mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_basename | /MySQL/my3306/log/binlog/binlog |
| log_bin_index | /MySQL/my3306/log/binlog/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+---------------------------------------+
可以看到MySQL5.7中,log_bin参数如果指定了目录和名称,则被拆分为三个参数:log_bin,log_bin_basename,log_bin_index
分别对应 binlog是否开启,binlog名.index名
2.3 查看binlog日志内容
[root@localhost binlog]# mysqlbinlog /MySQL/my3306/log/binlog/binlog.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180606 0:03:38 server id 101 end_log_pos 123 CRC32 0xe534323e Start: binlog v 4, server v 5.7.22-log created 180606 0:03:38 at startup
ROLLBACK/*!*/;
BINLOG '
Gl0XWw9lAAAAdwAAAHsAAAAAAAQANS43LjIyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAaXRdbEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AT4yNOU=
'/*!*/;
# at 123
#180606 0:03:38 server id 101 end_log_pos 154 CRC32 0x9c28789d Previous-GTIDs
# [empty]
# at 154
#180606 0:03:39 server id 101 end_log_pos 177 CRC32 0xac9e5d49 Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
2.4 一些常用操作
mysql> show master logs; #查看数据库所有日志文件。
mysql> show binlog events \g; #查看当前使用的binlog文件信息。
mysql> show binlog events in 'binlog.000001'; #查看指定的binlog文件信息。
mysql> flush logs; #将内存中log日志写磁盘,保存在当前binlog文件中,并产生一个新的binlog日志文件。
mysql> flush logs; reset master; #删除所有二进制日志,并重新(binlog.000001)开始记录。
三 MySQL备份实例(全备 + 基于 binlog的增备)
本环境基于CentOS7.2+MySQL5.7
3.1 查看当前数据库binlog文件
mysql> show master logs;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000001 | 177 |
| binlog.000002 | 177 |
| binlog.000003 | 981 |
| binlog.000004 | 177 |
| binlog.000005 | 177 |
| binlog.000006 | 154 |
+---------------+-----------+
[root@localhost binlog]# cd /MySQL/my3306/log/binlog/
[root@localhost binlog]# ll -h
total 28K
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql 981 Jun 6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql 177 Jun 6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql 177 Jun 7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 154 Jun 7 02:47 binlog.000006
-rw-r-----. 1 mysql mysql 234 Jun 7 02:47 binlog.index
3.2模拟数据
mysql> create database test_backup;
mysql> use test_backup
mysql> create table t_test (c1 int(10), c2 varchar(20)) engine=innodb;
mysql> insert into t_test values (1, 'test1'),(2, 'test2'),(3, 'test3'),(4, 'test4'),
(5, 'test5'),(6, 'test6'),(7, 'test7'),(8, 'test8'),(9, 'test9'),(10, 'test10');
3.3 将全量数据进行备份
[root@localhost binlog]# mysqldump -uroot -proot --socket=/MySQL/my3306/run/mysql.sock --port=3306 --single-transaction --master-data=2 test_backup >/tmp/test_backup20180611.sql
#记录备份的日志位置,将来作为增量还原的起点
[root@localhost binlog]# cat /tmp/test_backup20180611.sql|grep "CHANGE MASTER"
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000006', MASTER_LOG_POS=996;
3.4 准备第一份增量数据
mysql> use test_backup;
mysql> create table increment (c1 int(10), c2 varchar(20)) engine=innodb;
mysql> insert into increment values (11, 'increment1'),(12, 'increment2'),(13, 'increment3'),(14, 'increment4'),(15, 'increment5');
3.5 将第一份增量数据进行备份
#将日志刷到当前的binlog文件中,也就是binlog.000006,数据库再有新的数据更新会记录在新的binlog(binlog.000007)里面.
mysql> flush logs;
[root@localhost binlog]# ll
total 32
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql 981 Jun 6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql 177 Jun 6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql 177 Jun 7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 1658 Jun 10 21:22 binlog.000006
-rw-r-----. 1 mysql mysql 154 Jun 10 21:22 binlog.000007
-rw-r-----. 1 mysql mysql 273 Jun 10 21:22 binlog.index
#拷贝binlog文件
[root@localhost binlog]# cp binlog.000006 /tmp/
3.6 准备第二份增量数据
mysql> use test_backup;
mysql> insert into increment values (16, 'increment16'),(17, 'increment17'),(18, 'increment18'),(19, 'increment19'),(20, 'increment20');
3.7 将第二份增量数据进行备份
#将日志刷到当前的binlog文件中,也就是binlog.000007,数据库再有新的数据更新会记录在新的binlog(binlog.000008)里面.
mysql> flush logs;
[root@localhost binlog]# ll
total 36
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000001
-rw-r-----. 1 mysql mysql 177 Jun 6 00:03 binlog.000002
-rw-r-----. 1 mysql mysql 981 Jun 6 00:07 binlog.000003
-rw-r-----. 1 mysql mysql 177 Jun 6 00:07 binlog.000004
-rw-r-----. 1 mysql mysql 177 Jun 7 01:39 binlog.000005
-rw-r-----. 1 mysql mysql 1658 Jun 10 21:22 binlog.000006
-rw-r-----. 1 mysql mysql 603 Jun 10 22:04 binlog.000007
-rw-r-----. 1 mysql mysql 154 Jun 10 22:04 binlog.000008
-rw-r-----. 1 mysql mysql 312 Jun 10 22:04 binlog.index
#拷贝binlog文件
[root@localhost binlog]# cp binlog.000007 /tmp/
四. mysql还原实例分析(全备还原+基于binlog的增备还原)
#模拟数据库故障,即删除全备数据及增备数据库。
mysql> drop database test_backup;
Query OK, 2 rows affected (0.06 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4.1 还原全备数据
mysql>create database test_backup;
[root@localhost binlog]# mysql -uroot -proot test_backup </tmp/test_backup20180611.sql
mysql> use test_backup;
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_test_backup |
+-----------------------+
| t_test |
+-----------------------+
mysql> select * from t_test;
+------+--------+
| c1 | c2 |
+------+--------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 4 | test4 |
| 5 | test5 |
| 6 | test6 |
| 7 | test7 |
| 8 | test8 |
| 9 | test9 |
| 10 | test10 |
+------+--------+
4.2 还原第一个增备文件
从全备文件里的position值:LOG_FILE='binlog.000006', MASTER_LOG_POS=996 开始还原
[root@localhost tmp]# mysqlbinlog --start-position=996 binlog.000006 | mysql -uroot -proot
#查看数据:
mysql> select * from test_backup.increment;
+------+------------+
| c1 | c2 |
+------+------------+
| 11 | increment1 |
| 12 | increment2 |
| 13 | increment3 |
| 14 | increment4 |
| 15 | increment5 |
+------+------------+
第一份增量数据还原成功!
4.3 还原第二个增备文件(方法同上)
[root]mysqlbinlog mysqlbinlog binlog.000007 | mysql -uroot -proot
查看数据:
mysql> select * from test_backup.increment;
+------+-------------+
| c1 | c2 |
+------+-------------+
| 11 | increment1 |
| 12 | increment2 |
| 13 | increment3 |
| 14 | increment4 |
| 15 | increment5 |
| 16 | increment16 |
| 17 | increment17 |
| 18 | increment18 |
| 19 | increment19 |
| 20 | increment20 |
+------+-------------+
全部数据还原成功!
转自:https://www.cnblogs.com/chinesern/p/9182962.html
MySQL5.7增量备份恢复全实战的更多相关文章
- MySQL备份恢复全实战
一. 简介 1. 增量备份 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味着,第一次增量 备份的对象是进行全备后所产生的增加和修改的文件; ...
- 【Oracle】增量备份和全库备份怎么恢复数据库
1差异增量实验示例 1.1差异增量备份 为了演示增量备份的效果,我们在执行一次0级别的备份后,对数据库进行一些改变. 再执行一次1级别的差异增量备份: 执行完1级别的备份后再次对数据库进行更改: 再执 ...
- 如何通过rman的增量备份恢复dataguard中standby端的数据
很多正在使用dataguard的客户,都会遇到一个棘手的问题: 在备份端与主库同步的过程中由于网络原因或磁盘问题导致一个或多个归档日志丢失,进而dataguard同步无法继续.很多客户都选择了重新全库 ...
- ORACLE异机增量备份恢复
PROD异机增量备份恢复验证实施文档 准备工作:source 源库:PROD数据库备份策略:周日0级RMAN备份,周一至周六1级差异增量备份0 4 * * 0 /data/rmanlev0.sh &g ...
- xtrabakcup基本用法 安装、全量备份恢复、增量备份恢复
xtrabackup备份原理以及工作流程 备份流程日志分析:1.##读取mysql配置文件2.## 扫描innodb日志lsn并复制inndodb系统表空间3.## 缓冲写出到数据文件并锁表4.## ...
- 【转】mysql增量备份恢复实战企业案例
来源地址:http://seanlook.com/2014/12/05/mysql_incremental_backup_example/ 小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但 ...
- oracle 增量备份恢复策略(基础知识)
EXP和IMP是Oracle提供的一种逻辑备份工具.逻辑备份创建数据库对 象的逻辑拷贝并存入一个二进制转储文件.这种逻辑备份需要在数据库启动的情况下使用, 其导出实质就是读取一个数据库记录集(甚至可以 ...
- 利用增量备份恢复因归档丢失造成的DG gap
故障现象:data guard归档出现gap,悲剧的是丢失的归档在主库上被rman备份时删除了,丢失的归档大约有20几个,数据库大小约2T,如果重建DG将非常耗时间,因此决定利用增量备份的方式恢复DG ...
- Percona-XtraBackup系列三:增量备份恢复
1:创建测试表和测试库如果需要快速建立测试表和库的话,参考之前写的这篇博客:http://www.cnblogs.com/xiaoit/p/3376685.html create database b ...
随机推荐
- Python对csv文件的读写操作
python内置了csv模块,用它可以方便的操作csv文件. 1.写文件 (1)写文件的方法一 import csv # open 打开文件有多种模式,下面是常见的4种 # r:读数据,默认模式 # ...
- docker卷管理(四)
什么是数据卷 overlay2存储卷 docker镜像是由多个只读层叠加而成,启动容器时,docker会加载只读镜像层,并在镜像栈顶部添加一个可写层 如果运行中的容器修改了现有的一个已存在文件,那该文 ...
- [Linux] 编写Dockerfile文件自动构建镜像
Dockerfile是一个文本文件,按顺序包含构建给定镜像所需的所有命令Docker通过读取Dockerfile中的指令自动构建图像 . Dockerfile遵循特定的格式和指令集,您可以在Docke ...
- Matplotlib基础 可视化绘图 学习笔记
简单的绘图 1.确定画布并画线 import matplotlib.pyplot as plt #静态绘图 fig = plt.figure() ax = fig.add_subplot(345) # ...
- CodeForces - 1244D (思维+暴力)
题意 https://vjudge.net/problem/CodeForces-1244D 有一棵树,有3种颜色,第i个节点染成第j种颜色的代价是c(i,j),现在要你求出一种染色方案,使得总代价最 ...
- 远程控制服务(SSH)之Windows远程登陆Linux主机
本篇blog同样介绍两种方式进行. 首先进行准备工作: 1.所用到的工具如下: (1) 装有Linux系统的VMware虚拟机*1 (2) 终端连接工具Xshell 6 2.将Wind ...
- C++ string push_back()
函数功能: 在后面添加一项 vector头文件的push_back函数,在vector类中作用为在vector尾部加入一个数据.string中的push_back函数,作用是字符串之后插入一个字符. ...
- 2019 SDN上机第六次作业
1.实验拓扑 (1)实验拓扑 (2)使用python脚本完成拓扑搭建 from mininet.topo import Topo class Mytopo(Topo): def __init__(se ...
- Note | MATLAB
目录 1. 读写文件 简单读写 将rgb保存为yuv文件 从yuv文件中读取Y通道 将TIFF图片拼接为yuv文件 2. 字符串操作 3. 画图 4. 词频统计 1. 读写文件 简单读写 fp = f ...
- MMM的又一周计划[2019 7.1→2019.7.7]
发现今天是7.1然后又是星期一 来一发吧 本周目标: 1.二分图最佳匹配 2.网络流 3.HH的项链 4.洛谷rk前1000(目前1.1k) (upd:469) 5.AC260(35题,上周A了34, ...