一. 简介

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 |
+------+-------------+

全部数据还原成功!

MySQL备份恢复全实战的更多相关文章

  1. MySQL5.7增量备份恢复全实战

    一. 简介 1. 增量备份 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味着,第一次增量 备份的对象是进行全备后所产生的增加和修改的文件; ...

  2. MySQL 备份恢复(导入导出)单个 innodb表

    MySQL 备份恢复单个innodb表呢,对于这种恢复我们我们很多朋友都不怎么了解了,下面一起来看一篇关于MySQL 备份恢复单个innodb表的教程 在实际环境中,时不时需要备份恢复单个或多个表(注 ...

  3. [svc]mysql备份恢复及常用命令

    如何实现mysql读写分离 1.通过程序实现读写分类(性能 效率最佳) php和java都可以通过设置多个连接文件轻松实现对db的读写分离,即当select时,就去连读库的连接文件,当update,i ...

  4. MySQL备份恢复-mysqldump原理

    +++++++++++++++++++++++++++++++++++++++++++标题:mysqldump对MySQL数据库备份恢复原理时间:2019年2月23日内容:mysqldump工具重点: ...

  5. mysql备份恢复详解

    前言 为什么需要备份数据? 数据的备份类型 MySQL备份数据的方式 备份需要考虑的问题 设计合适的备份策略 实战演练 使用cp进行备份 使用mysqldump+复制BINARY LOG备份 使用lv ...

  6. (转)解锁MySQL备份恢复的4种正确姿势

    本文根据DBAplus社群第104期线上分享整理而成. 原文:http://dbaplus.cn/news-11-1267-1.html 讲师介绍   冯帅 点融网高级DBA 获有Oracle OCM ...

  7. Mysql备份恢复方案解析

    1.全量备份和增量备份 1.1全量备份 就是对现有的数据进行全部备份,之前做的备份均可舍弃,以最新的全备为基点. a.全备所有数据库 Innodb引擎: [root@leader mysql]#mys ...

  8. mysql导出csv/sql/newTable/txt的方法,mysql的导入txt/sql方法...mysql备份恢复mysqlhotcopy、二进制日志binlog、直接备份文件、备份策略、灾难恢复.....................................................

    mysql备份表结构和数据 方法一. Create table new_table_nam备份到新表:MYSQL不支持: Select * Into new_table_name from old_t ...

  9. MySQL 备份恢复

    1:备份常用工具: mysqldump, xtrabackup mysqldump: 原生数据导出工具,以sql的形式导出保存 xtrabackup: percona团队提供的备份工具,基于文件系统的 ...

随机推荐

  1. HDU1698 线段树入门之区间修改/查询(lazy标记法)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. uva10944 状态压缩bfs or DP

    又是一道状压搜索,题解有的是状压DP做的目前不会日后补 写好了以后一直蜜汁WA,看别人代码把判断再次回到原点的语句写在了Q.pop()之后而不是for里,对我也是一种启发吧这样写确实有好处比如起点就是 ...

  3. 给 C# Expression Evaluator 增加中文变量名支持

    由于一些特殊的原因,我的Expression里面需要支持中文变量名,但是C# Expression Evaluator会提示错误,在他的HelperMethods.IsAlpha()里面加上这么一段就 ...

  4. 042——VUE中组件之子组件使用$on与$emit事件触发父组件实现购物车功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 201621123010《Java程序设计》第3周学习总结

    1.本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你认 ...

  6. Qt 编译完后指定输出路径

    make install INSTALL_ROOT=/home/hotot/qt4rls

  7. js实现trim()方法

    在面向对象编程里面去除字符串左右空格是很容易的事,可以使用trim().ltrim() 或 rtrim(),在jquery里面使用$.trim()也可以轻松的实现.但是在js中却没有这个方法.下面的实 ...

  8. PHP连接不上MySQL解决方案总结

    1. 获取当前 mysql.default_socket.mysqli.default_socket.pdo_mysql.default_socket 配置信息 建立一个 PHP 文件, 显示 php ...

  9. 浅谈闭包(Closure)

    一.闭包 好长时间对于闭包都知道与函数和其环境变量有关系,但是一直没有一个清晰的认识.今天查看了一下维基百科,顺便写下来. 二.闭包的定义 在编程语言中,闭包(语义闭包或函数闭包)是指哪些可以将语义范 ...

  10. 洛谷 P1039侦探推理

    /* 枚举罪犯和星期几,那么所有人说的话是真是假一目了然. 首先一个人不能既说真话又说假话. 即: I am guilty. I am not guilty. 因为非真即假,所以直接判断impossi ...