CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

一、XtraBackup相关概念介绍:

1、XtraBackup简介:

热备中两种主要的方式就是逻辑备份和物理备份,物理备份要比逻辑备份在速度上更快一些,因为它是在底层复制数据文件的,比起一条条SQL语句插入要快很多。物理备份的代表就是XtraBackup,它是Percona公司的开源项目,据官方介绍它是世界上唯一一款开源的能够对InnoDB和XtraDB表进行热备的工具。XtraBackup支持对InnoDB和XtraDB表进行热备、全量备份、增量备份和差异备份。XtraBackup支持对MyISAM表进行温备,并且不会对MyISAM表进行增量备份,每次备份MyISAM表都是全量备份,即使名义上是增量备份,但实际上仍然是全量备份。如果数据库中既有MyISAM表又有InnoDB表时,想要整体的所有数据都一致,则只能以MyISAM表的一致性时间点作为最终备份的一致性时间点,所以XtraBackup在备份时,会先备份InnoDB表,备份完InnoDB表后,再备份MyISAM表,并且在备份MyISAM表时施加读锁。

2、InnoDB表逻辑存储结构:

InnoDB表逻辑单元从大到小分别为:表空间(Tablespace)、段(Segment)、区(Extent)、页(Page)、行(Row),每个大的逻辑单元中都包含了N个小的逻辑单元。此处只需关心Extent逻辑单元和Page逻辑单元即可,Extent区域中的每个小方块(Page)当作XtraBackup需要备份的数据块,因为数据存放于行中,行存在于Page中,所以备份对应的Page,即可备份出对应的数据。使用XtraBackup连接到MySQL服务端时,XtraBackup会读取InnoDB中的Page进行备份。InnoDB的逻辑存储结构如下图所示:

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

3、XtraBackup备份原理:

备份开始时,XtraBackup会同时运行两个线程,一个线程负责备份InnoDB中的Page,另一个线程负责备份InnoDB的事务日志(redo log),事务日志都会被XtraBackup记录到自己的日志文件中,备份结束后,会得到两份文件,一份是不可用的备份文件,另一份是备份时的事务日志。备份文件之所以不可用,是因为有一部分不确定的数据可能在事务日志中,而且热备过程中数据也可能发生改变,需要通过这两份文件,得到一份可用的备份文件。这个过程在XtraBackup中称为prepare准备,即对于写入事务日志文件中,但还没有同步到datafile中的已提交事务进行replay重放,对于未提交的事务进行rollback回滚,prepare操作保证了备份数据的一致性,没有经过prepare的备份数据是不可用的。如果存在增量备份,XtraBackup会将所有增量都合并到之前的全量上,然后使用最后的全量数据进行恢复。在合并数据的过程中,上一次未提交的事务有可能在下次的增量备份中已经提交,所以如果存在多个增量备份,在进行prepare时,只需要将已经提交的事务同步到数据文件中即可,未提交的事务不用进行回滚,因为在增量备份中,这些事务可能已经提交了,只需要在最后一份增量数据进行prepare时,将对应的未提交事务回滚即可。

4、XtraBackup实现增量备份的判断依据:

每个Page都有自己的LSN(Log Sequence Number,日志序列号),LSN是一个全局递增的号码,每次对Page中的记录进行修改时,都会有对应的LSN,每个Page中的数据被更改时,都会在这个Page中记录下本次的LSN。如果这个Page中记录的LSN越大,就证明这个Page中的数据越新(最近被修改),而XtraBackup就是通过LSN实现对InnoDB表的增量备份。每次备份开始时,XtraBackup会记录下当前备份到的LSN,当下次进行增量备份时,XtraBackup就只会拷贝出LSN大于上次记录的Page,那些LSN小于上次记录的Page则会被略过。如果Page中的LSN小于上次备份时记录的LSN,则证明这个Page在上次备份后并没有被修改过。如果Page中的LSN大于上次备份时记录的LSN,则证明这个Page在上次备份后已经被修改了,只要备份出这些Page,即可实现增量备份的目的。

5、XtraBackup工具:

XtraBackup主要有两个工具:xtrabackup和innobackupex。xtrabackup只能备份InnoDB和XtraDB两种数据表,不能备份MyISAM数据表;innobackupex封装了xtrabackup,不仅能备份InnoDB和XtraDB两种数据表,同时还可以备份MyISAM数据表。在新版本中xtrabackup实现了innobackupex的功能。

备注:

(1)本文安装的是2.4的版本,innobackupex的功能已经完全整合进xtrabackup中,为了兼容之前用户的使用习惯,官方保留了innobackupex,它作为一个软链接,指向xtrabackup

(2)innobackupex在8.0的版本中已被弃用,只保留xtrabackup

(3)Percona XtraBackup 8.0的版本不支持备份恢复MySQL 5.7

6、XtraBackup备份后生成的文件:

(1)backup-my.cnf:备份用到的配置选项信息

(2)xtrabackup_binlog_info:记录当前正在使用的二进制日志文件及备份这一刻为止二进制日志事件的位置

(3)xtrabackup_binlog_pos_innodb:记录当前正在使用的二进制日志文件及备份这一刻为止用于InnoDB和XtraDB表的二进制日志事件的位置

(4)xtrabackup_checkpoints:记录备份类型(如:全量或增量)、备份起始和结束时的LSN等信息

(5)xtrabackup_info:记录备份时使用的工具名称(如:innobackupex)、工具选项、工具版本、MySQL版本、备份开始和结束时间、当前正在使用的二进制日志文件及备份这一刻为止二进制日志事件的位置、备份起始和结束时的LSN等信息

(6)xtrabackup_logfile:记录备份过程中的日志

备注:如果都是InnoDB存储引擎的表,用于时间点恢复的二进制日志事件的位置可以以xtrabackup_binlog_pos_innodb文件中记录的为准;如果是InnoDB和其它存储引擎混合操作的表,建议以xtrabackup_binlog_info为准。

7、相关网址:

(1)官网:https://www.percona.com/software/mysql-database/percona-xtrabackup

(2)用户手册:https://www.percona.com/doc/percona-xtrabackup/2.4/manual.html

 

二、准备工作(两个节点都需要执行如下操作):

1、演示环境:

          IP

    操作系统

 主机名

  角色

            数据库版本

安装方式

192.168.1.145

CentOS   7.6 x86_64

node1

primary

5.7.26-log   MySQL Community Server

rpm

192.168.1.146

CentOS   7.6 x86_64

node2

backup

5.7.26-log   MySQL Community Server

rpm

2、关闭SELinux和firewalld

3、配置epel源

4、配置节点时间同步

5、配置主机名

6、配置/etc/hosts文件:

# vim /etc/hosts

192.168.1.145 node1

192.168.1.146 node2

7、创建备份数据存放目录:# mkdir -pv /data/mysqlbak

8、创建binlog存放目录:# mkdir -pv /data/mysqlbinlog

9、下载MySQL 5.7软件包,https://dev.mysql.com/downloads/mysql/5.7.html#downloads

10、安装Percona XtraBackup 2.4:

# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# yum list | grep percona

# yum -y install percona-xtrabackup-24

# innobackupex -v

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7


三、安装配置MySQL(如未特殊说明,两个节点都需要执行如下操作):

1、卸载CentOS 7.6自带的MariaDB:

# rpm -qa | grep -i mariadb --> mariadb-libs-5.5.60-1.el7_5.x86_64

# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

2、如果之前安装过MySQL,先卸载:# rpm -qa | grep -i mysql

3、如果存在/etc/my.cnf配置文件,先删除:# rm -rf /etc/my.cnf

4、将软件包上传至两个节点的/tmp目录下:

mysql-community-client-5.7.26-1.el7.x86_64.rpm

mysql-community-libs-5.7.26-1.el7.x86_64.rpm

mysql-community-common-5.7.26-1.el7.x86_64.rpm

mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm

mysql-community-devel-5.7.26-1.el7.x86_64.rpm

mysql-community-server-5.7.26-1.el7.x86_64.rpm

5、安装MySQL软件包:# yum -y localinstall *.rpm

6、初始化MySQL:# mysqld --initialize --user=mysql --datadir=/var/lib/mysql

备注:初始化之前确保/var/lib/mysql目录为空

7、修改/etc/my.cnf配置文件:

# mv /etc/my.cnf /etc/my.cnf.bak

# vim /etc/my.cnf

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

pid-file=/var/run/mysqld/mysqld.pid

log-error=/var/log/mysqld.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mysql-slow.log

symbolic-links=0

explicit_defaults_for_timestamp=1

server_id=1

sync_binlog=1

innodb_flush_log_at_trx_commit=1

log_bin=/data/mysqlbinlog/mysql-bin

log_bin_index=/data/mysqlbinlog/mysql-bin.index

binlog_format=mixed

备注:

(1)backup节点的server_id=2

(2)innodb_file_per_table=1:每表使用单独的表空间,备份单个数据库或表时该选项必须要启用

(3)此处数据文件和binlog分开存放

8、修改/data/mysqlbinlog目录的属主和属组:# chown -R mysql.mysql /data/mysqlbinlog

9、启动MySQL服务:

# systemctl start mysqld.service

# systemctl status mysqld.service

# tail -100 /var/log/mysqld.log

# ss -tunlp | grep 3306

# systemctl enable mysqld.service

10、查看root@localhost用户的初始密码:# grep password /var/log/mysqld.log

11、配置MySQL安全向导:# mysql_secure_installation

12、primary节点创建测试数据:

# mysql -uroot -p

mysql> create database db1;

mysql> create table db1.tb1(id int unsigned auto_increment primary key not null,name varchar(20) not null);

mysql> desc db1.tb1;

mysql> insert into db1.tb1(name) values('zhangsan'),('lisi');

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> create database db2;

mysql> create table db2.tb2(name varchar(20) not null,age int not null);

mysql> desc db2.tb2;

mysql> insert into db2.tb2 values('mary',25),('jack',30);

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

13、primary节点创建具有备份权限的用户:

mysql> create user 'bkuser'@'192.168.1.%' identified by '123456';

mysql> revoke all on *.* from 'bkuser'@'192.168.1.%';

mysql> grant reload,lock tables,replication client,process on *.* to 'bkuser'@'192.168.1.%';

mysql> flush privileges;

备注:上述给出的权限为备份的最小权限


四、primary节点innobackupex全量备份+binlog增量备份所有数据库,并在backup节点恢复:

1、primary节点全量备份所有数据库,压缩后发送至backup节点:

# ssh-keygen -t rsa -P ""

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.146

# ssh root@192.168.1.146 'hostname'

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --stream=tar /tmp | ssh root@192.168.1.146 "gzip - > /data/mysqlbak/`date +%F_%T`_full.tar.gz"

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)常用选项说明:

a、--defaults-file:指定备份时使用的配置文件路径,该选项必须紧跟innobackupex,否则会提示“xtrabackup: Error: --defaults-file must be specified first on the command line”错误信息

b、--no-timestamp:禁止innobackupex自动创建一个以时间命名的目录

c、-H:指定MySQL服务器IP

d、-P:指定MySQL服务器端口

e、-u:指定备份时使用的用户

f、-p:指定该用户对应的密码

g、--stream:流式化备份,备份时使用的数据流格式,有两个可用值,tar或xbstream,此处将备份的数据通过STDOUT标准输出传输给tar进行归档后再使用gzip进行压缩,并发送至backup节点,而不是默认的直接保存至primary节点的某个备份目录中,可以将gzip换成其它常用的压缩软件进行压缩,--stream选项后的路径/tmp不可省,但是其路径可以为任意路径,与数据备份后所在的路径没有任何关系

h、查看更多选项,可使用命令:# innobackupex --help

(2)将数据流备份至远程目标主机有一个前提条件,就是远程目标主机需要对当前主机SSH信任,即当前主机通过SSH连接到远程目标主机时不需要输入对应的密码

(3)只有在备份结束后提示“completed OK!”,才说明全量备份成功

2、backup节点解压备份数据,并查看primary节点全量备份时binlog事件位置:

# cd /data/mysqlbak

# mkdir -pv 2019-08-22_17:58:34_full

# tar -ixf 2019-08-22_17\:58\:34_full.tar.gz --force-local -C 2019-08-22_17:58:34_full

# cd 2019-08-22_17\:58\:34_full

# cat xtrabackup_binlog_info

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

3、primary节点在db1.tb1和db2.tb2中插入新数据:

mysql> insert into db1.tb1(name) values('wangwu'),('zhaoliu');

mysql> insert into db2.tb2 values('keyso',35),('marion',40);

mysql> flush logs;

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:此处滚动二进制日志是为了之后演示使用mysqlbinlog通过多个二进制日志进行时间点恢复

4、primary节点使用mysqlbinlog导出全量备份之后所有数据库执行过的SQL语句:

# cd /data/mysqlbinlog

mysqlbinlog -uroot -p -j 3251 mysql-bin.000001 mysql-bin.000002 > /data/mysqlbak/binlog.sql

备注:需要列出所有binlog

5、primary节点将binlog.sql发送至backup节点:

scp /data/mysqlbak/binlog.sql root@192.168.1.146:/data/mysqlbak/

6、backup节点准备全量备份:

innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1GB /data/mysqlbak/2019-08-22_17:58:34_full

备注:

(1)常用选项说明:

a、--apply-log:备份后的数据文件不能直接用于恢复操作,需要通过回滚未提交的事务及同步已提交的事务至数据文件,即应用位于同一目录中的xtrabackup_logfile的事务日志,并创建新的事务日志

b、--use-memory:如果主机有一定的空闲内存,可以让XtraBackup使用指定大小的内存加速完成准备工作,默认情况下会使用100MB的内存用以准备工作

(2)只有在准备工作结束后提示“completed OK!”,才说明准备工作完成

7、backup节点停止MySQL服务:# systemctl stop mysqld.service 或 mysqladmin -uroot -p shutdown

8、backup节点清空数据目录:# mv /var/lib/mysql /tmp/mysql_bak  # mkdir -pv /var/lib/mysql

9、backup节点将备份数据拷贝至数据目录:

innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysqlbak/2019-08-22_17:58:34_full

备注:

(1)/var/lib/mysql数据目录必须为空

(2)在拷贝结束后提示“completed OK!”,才说明拷贝成功

10、backup节点修改数据目录的属主和属组:# chown -R mysql.mysql /var/lib/mysql

11、backup节点启动MySQL服务:

# systemctl start mysqld.service  # systemctl status mysqld.service  # ss -tunlp | grep 3306

12、backup节点查看db1.tb1和db2.tb2中的数据:

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

13、backup节点进行时间点恢复:

mysql> show variables like 'sql_log_bin';

mysql> set sql_log_bin=0;

mysql> show variables like 'sql_log_bin';

mysql> show binary logs;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> show master status;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> source /data/mysqlbak/binlog.sql

备注:或使用命令# mysql -uroot -p < /data/mysqlbak/binlog.sql

mysql> show master status;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> set @@session.sql_log_bin=1;

mysql> show variables like 'sql_log_bin';

14、backup节点查看db1.tb1和db2.tb2中的数据:

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7


五、primary节点innobackupex备份单个数据库db2,并在本地恢复:

1、在db2.tb2中插入新数据:

mysql> insert into db2.tb2 values('tom',45),('mike',50);

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

2、创建备份数据存放目录:# mkdir -pv /data/mysqlbak/db2

3、备份单个数据库db2:

# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 --compress --compress-threads=4 --databases=db2 /data/mysqlbak/db2/`date +%F_%T`_db2

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)常用选项说明:

a、--parallel:指定并行备份的线程数,用以加速备份,默认情况下只开启一个线程进行备份,当备份使用的数据流为tar格式时,没有任何作用

b、--compress:对备份数据进行压缩,除了xtrabackup_checkpoints文件以外,其它所有备份数据都会被压缩,包括事务日志和元数据文件,使用的压缩算法为quicklz,压缩出的文件的后缀名为.qp

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

c、--compress-threads:指定压缩线程的数量,加快压缩速度

d、--databases:指定备份的数据库名称,如果需要备份多个数据库,数据库名称之间以空格隔开,--databases="db1 db2"

(2)只有在备份结束后提示“completed OK!”,才说明备份成功

4、安装qpress压缩软件:# yum -y install qpress

5、解压备份数据:# innobackupex --parallel=4 --decompress /data/mysqlbak/db2/2019-08-22_18:43:46_db2

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:只有在解压结束后提示“completed OK!”,才说明解压成功

6、准备备份:

# innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1GB --export /data/mysqlbak/db2/2019-08-22_18:43:46_db2

备注:

(1)--export:导出单独的表之后再导入其它MySQL中

(2)上述命令执行过程中,innobackupex命令会从InnoDB数据字典中移除缺失的表,同时也会为备份文件中存在的表创建.exp文件的相关信息

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

(3)只有在准备工作结束后提示“completed OK!”,才说明准备工作完成

7、停止MySQL服务:# systemctl stop mysqld.service 或 mysqladmin -uroot -p shutdown

8、模拟db2数据库故障:# mv /var/lib/mysql/db2 /tmp/db2_bak

9、将备份数据拷贝至数据目录:# cp -r /data/mysqlbak/db2/2019-08-22_18\:43\:46_db2/* /var/lib/mysql/

10、修改数据目录的属主和属组:# chown -R mysql.mysql /var/lib/mysql

11、启动MySQL服务:

# systemctl start mysqld.service  # systemctl status mysqld.service  # ss -tunlp | grep 3306

12、查看db2.tb2中的数据:

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7


六、primary节点innobackupex全量备份+innobackupex增量备份+binlog增量备份所有数据库,并在backup节点恢复:

1、primary节点全量备份所有数据库:

# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 /data/mysqlbak/`date +%F_%T`_full

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)只有在备份结束后提示“completed OK!”,才说明全量备份成功

(2)查看此次全量备份目录下的xtrabackup_checkpoints文件,可以看到备份类型为full-backuped全量备份,起始LSN为0,结束LSN为2539919

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

2、primary节点在db1.tb1中插入新数据:

mysql> insert into db1.tb1(name) values('laozhang'),('laoli');

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

3、primary节点第一次增量备份:

# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 --incremental /data/mysqlbak/`date +%F_%T`_incr1 --incremental-basedir=/data/mysqlbak/2019-08-22_23:47:35_full

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)常用选项说明:

a、--incremental:说明本次备份是一个增量备份,备份至2019-08-22_23:55:01_incr1目录下

b、--incremental-basedir:指定该路径为全量备份的目录,说明此次增量备份是在全量备份的基础上实现的

(2)只有在备份结束后提示“completed OK!”,才说明增量备份成功

(3)查看此次增量备份目录下的xtrabackup_checkpoints文件,可以看到备份类型为incremental增量备份,起始LSN为2539919,结束LSN为2543392,此次增量备份的起始LSN是之前全量备份结束时的LSN

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

4、primary节点在db2.tb2中插入新数据:

mysql> insert into db2.tb2 values('keyso',35),('marion',40);

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

5、primary节点第二次增量备份:

# innobackupex --defaults-file=/etc/my.cnf --no-timestamp -H 192.168.1.145 -P 3306 -u bkuser -p 123456 --parallel=4 --incremental /data/mysqlbak/`date +%F_%T`_incr2 --incremental-basedir=/data/mysqlbak/2019-08-22_23:55:01_incr1

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)第二次增量备份是在第一次增量备份的基础上实现的,--incremental-basedir选项指定的是第一次增量备份的目录

(2)如果--incremental-basedir选项指定的是全量备份的目录,说明此次备份是差异备份

(3)只有在备份结束后提示“completed OK!”,才说明增量备份成功

(4)查看此次增量备份目录下的xtrabackup_checkpoints文件,可以看到备份类型为incremental增量备份,起始LSN为2543392,结束LSN为2547556,此次增量备份的起始LSN是上一次增量备份结束时的LSN

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

6、primary节点查看第二次增量备份时binlog事件的位置:

# cat /data/mysqlbak/2019-08-23_00\:03\:29_incr2/xtrabackup_binlog_info

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

7、primary节点在db1.tb1和db2.tb2中删除数据:

mysql> delete from db1.tb1 where name='laozhang';

mysql> delete from db2.tb2 where name='mary';

mysql> flush logs;

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:此处滚动二进制日志是为了之后演示使用mysqlbinlog通过多个二进制日志进行时间点恢复

8、primary节点使用mysqlbinlog导出第二次增量备份之后所有数据库执行过的SQL语句:

# cd /data/mysqlbinlog

# ls

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

# mysqlbinlog -uroot -p -j 3867 mysql-bin.000001 mysql-bin.000002 > /data/mysqlbak/binlog.sql

备注:需要列出所有binlog

9、primary节点将所有备份数据及binlog.sql发送至backup节点:

# cd /data/mysqlbak

# ls

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

# scp -r ./2019-08-22_23\:47\:35_full root@192.168.1.146:/data/mysqlbak/

# scp -r ./2019-08-22_23\:55\:01_incr1 root@192.168.1.146:/data/mysqlbak/

# scp -r ./2019-08-23_00\:03\:29_incr2 root@192.168.1.146:/data/mysqlbak/

# scp binlog.sql root@192.168.1.146:/data/mysqlbak/

备注:使用scp命令时,如果目录名或文件名中带有:冒号的,需要在目录名或文件名之前加上./才能正常发送

10、backup节点准备全量备份:

# ls /data/mysqlbak

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --use-memory=1GB /data/mysqlbak/2019-08-22_23:47:35_full

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)--redo-only:在进行准备(应用日志)工作时,只会重做已提交但未应用的事务,而不会回滚未提交的事务,把准备好的增量备份(但不包括最后一个)合并到对应的全量备份中

(2)只有在准备工作结束后提示“completed OK!”,才说明准备工作完成

(3)查看全量备份目录下的xtrabackup_checkpoints文件,会发现全量备份的备份类型已变为log-applied

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

11、backup节点准备第一次增量备份:

# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --use-memory=1GB /data/mysqlbak/2019-08-22_23:47:35_full --incremental-dir=/data/mysqlbak/2019-08-22_23:55:01_incr1

备注:

(1)--incremental-dir:指定第一次增量备份的路径为/data/mysqlbak/2019-08-22_23:55:01_incr1

(2)只有在准备工作结束后提示“completed OK!”,才说明准备工作完成

(3)查看全量备份目录下的xtrabackup_checkpoints文件,全量备份的备份类型为log-applied,且结束LSN是第一次增量备份结束时的LSN,说明已将第一次增量备份文件合并至全量备份文件中

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

12、backup节点准备第二次增量备份:

# innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1GB /data/mysqlbak/2019-08-22_23:47:35_full --incremental-dir=/data/mysqlbak/2019-08-23_00:03:29_incr2

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:

(1)由于这是最后一份增量备份数据,所以不用添加--redo-only选项,事务日志需要应用,该提交的提交,该回滚的回滚

(2)只有在准备工作结束后提示“completed OK!”,才说明准备工作完成

(3)查看全量备份目录下的xtrabackup_checkpoints文件,会发现全量备份的备份类型已变为full-prepared,且结束LSN是第二次增量备份结束时的LSN,说明所有准备工作都已完成,所有增量备份文件都已合并至全量备份文件中

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

13、backup节点停止MySQL服务:# systemctl stop mysqld.service 或 mysqladmin -uroot -p shutdown

14、backup节点清空数据目录:# mv /var/lib/mysql /tmp/mysql_bak  # mkdir -pv /var/lib/mysql

15、backup节点将备份数据拷贝至数据目录:

# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysqlbak/2019-08-22_23:47:35_full

备注:

(1)/var/lib/mysql数据目录必须为空

(2)在拷贝结束后提示“completed OK!”,才说明拷贝成功

16、backup节点修改数据目录的属主和属组:# chown -R mysql.mysql /var/lib/mysql

17、backup节点启动MySQL服务:

# systemctl start mysqld.service  # systemctl status mysqld.service  # ss -tunlp | grep 3306

18、backup节点查看db1.tb1和db2.tb2中的数据:

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

19、backup节点进行时间点恢复:

mysql> show variables like 'sql_log_bin';

mysql> set sql_log_bin=0;

mysql> show variables like 'sql_log_bin';

mysql> show binary logs;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> show master status;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> source /data/mysqlbak/binlog.sql

备注:或使用命令# mysql -uroot -p < /data/mysqlbak/binlog.sql

mysql> show master status;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> set @@session.sql_log_bin=1;

mysql> show variables like 'sql_log_bin';

20、backup节点查看db1.tb1和db2.tb2中的数据:

mysql> select * from db1.tb1;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

mysql> select * from db2.tb2;

CentOS 7.6使用Percona XtraBackup 2.4备份恢复MySQL 5.7

备注:上述三个备份恢复案例互不相关

特别注意:

Ø  备份时将配置文件/etc/my.cnf一起备份

Ø  二进制日志也应该周期性地进行备份

Ø  将数据和备份分开存放,建议不在同一设备、同一主机、同一机房、同一地域

Ø  每次灾难恢复后都应该立即做一次全量备份

Ø  备份完成后的数据应该周期性地做恢复测试


上一篇:springboot+mybatis+druid多数据源配置


下一篇:DB2 缓冲池与表空间之间的关系