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.*这样的文件,每启动一次,就会增加一个或者多个.

[[email protected] binlog]# cd /MySQL/my3306/log/binlog
[[email protected] 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日志内容

[[email protected] binlog]# mysqlbinlog /MySQL/my3306/log/binlog/binlog.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @[email protected]@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 |
+---------------+-----------+

[[email protected] binlog]# cd /MySQL/my3306/log/binlog/
[[email protected] 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 将全量数据进行备份

[[email protected] binlog]# mysqldump -uroot -proot  --socket=/MySQL/my3306/run/mysql.sock --port=3306 --single-transaction --master-data=2 test_backup >/tmp/test_backup20180611.sql 

#记录备份的日志位置,将来作为增量还原的起点
[[email protected] 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;  

[[email protected] 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文件
[[email protected] 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;  

[[email protected] 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文件
[[email protected] 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;

[[email protected] 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 开始还原

[[email protected] 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

原文地址:https://www.cnblogs.com/xkzhangsanx/p/11824465.html

时间: 2024-10-09 09:53:55

MySQL5.7增量备份恢复全实战的相关文章

MongoDB迁移方案-冷备份+增量备份恢复

QQ群:465614686 1.  环境构建步骤 (1)线上环境 都是副本集模式 3个业务访问节点+1个隐藏节点 (隐藏节点做hadoop.spark数据同步使用以及数据报表查询等) (2)主机以及配置说明 10.21.18.21  primary节点    优先级为100 10.21.18.22  secondary节点  优先级为90 10.21.18.23  secondary节点  优先级为80 10.21.18.24  隐藏节点       优先级为0 系统配置:128G内存,64Co

linux自动代码增量备份 结合 全量备份

需求说明 系统环境:linux(centos7)备份内容:增量备份 结合 全量备份 公司中的生产服务器数据非常重要,所以我们需要通过备份服务器将生产服务器的数据进行备份. rsync的增量备份,不单单会同步新增的内容,就连删除的内容也会同步.假如管理代码人员误操作将代码误删除,那么备份服务器检测到备份原的数据产生变化后,也会与其同步,此时生产服务器与备份服务器的代码都会丢失. 增量备份要求的频率较高,但在生产与备份服务器之间的网络资源消耗较少,所以我们可以使用rsync来做增量备份,然后结合在备

【转】mysql增量备份恢复实战企业案例

来源地址:http://seanlook.com/2014/12/05/mysql_incremental_backup_example/ 小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份.增量备份的原理就是使用了mysql的binlog日志. 本次操作的MySQL版本为5.5.40 for Linux (x86_64). 增量备份要确保打开了二进制日志,参考mysql的日志系统: 1 mysql> show

Mysql DBA 高级运维学习笔记-Mysql增量备份及数据恢复实战

大家好本文讲了mysql数据库的增量恢复.老男孩老师讲的很好很细,我自己呢整理了老师讲的部分内容,请大家将就看:文章内容比较多.比较乱,请大家认真总结知识,发现问题请及时批评指点~ 1.1 MySQL数据库的备份与恢复 1.1.1备份单个数据库练习多种参数使用 Mysql数据库自带了一个很好用的备份命令,就是mysqldump, 它的基本使用如下: 语法:mysqldump –u用户名 –p密码 数据库名>备份的文件名 范烈1:备份名字为cuizhong的库 a.查看备份前的数据 [[email

MySQL5.7.的备份恢复方案。

系统:Centos 7.4 版本:MySQL5.7.24 备份工具:percona xtrabackupd 全量备份 备份命令:innobackupex --defaults-file=$db_cnf --user=$db_user --password=$user_passwd --stream=tar /tmp | gzip >$data_file 恢复命令: service mysql stop #停止服务 mv /data/database /data/database_`data +%

xtrabackup增量备份恢复

一.安装percona-xtrabackup 1.下载软件 percona-xtrabackup-2.2.10.tar.gz 下载网址 http://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.10/source/ 2.修改profile export LD_LIBRARY_PATH=/opt/mysql/lib 3.编译安装 tar zxvf percona-xtrabackup-2.2.10.tar.gz cd pe

oracle 增量备份恢复策略(基础知识)

EXP和IMP是Oracle提供的一种逻辑备份工具.逻辑备份创建数据库对 象的逻辑拷贝并存入一个二进制转储文件.这种逻辑备份需要在数据库启动的情况下使用, 其导出实质就是读取一个数据库记录集(甚至可以包括数据字典)并将这个记录集写入一个文件,这些记录的导出与其物理位置无关,导入实质就是读取转储文件并 执行其中的命令.此备份方式是通过Oracle的实用工具export和import来实施的, export是把数据库中的数据导出,import是把export卸出的数据导入数据库中.通过此工具可以衍生

利用增量备份恢复因归档丢失造成的DG gap

故障现象:data guard归档出现gap,悲剧的是丢失的归档在主库上被rman备份时删除了,丢失的归档大约有20几个,数据库大小约2T,如果重建DG将非常耗时间,因此决定利用增量备份的方式恢复DG,主要步骤如下:1.备份备库spfile文件SQL> create pfile='/home/ora/pfileRdg.ora' from spfile; 2.查看当前备库scnSQL> select to_char(current_scn) from v$database; TO_CHAR(CU

如何使用 RMAN 增量备份恢复 data guard log gap(日志断档)

主库查询最小scn 信息: SQL> col current_scn for 999999999999999 SQL>  SELECT CURRENT_SCN FROM V$DATABASE; select min(fhscn) from x$kcvfh; select min(f.fhscn) from x$kcvfh f, v$datafile d where f.hxfil =d.file# and d.enabled != 'READ ONLY'     ; CURRENT_SCN -