• Post author:
  • Post category:mysql
  • Post comments:0评论
Like
Like Love Haha Wow Sad Angry
1

一、工具介绍

  XtraBackup是percona公司的一个产品,它是用于MySQL的开源热备份工具,在备份过程中不会锁表(针对InnoDB而言);它兼容多个MySQL版本,例如5.1、5.5、5.6和5.7,如果要用于MySQL 8 系列版本的话要下载XtraBackup 8系列工具。
  XtraBackup是一种物理备份工具,同物理备份工具还有MySQL商业版中提供的备份工具MEB。物理备份即基于数据块级别的备份,一般是指直接复制包含数据的文件夹和文件。
  官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
  以下内容基于MySQL 5.7.28。

二、安装

1、安装依赖(当前2.4版本并不需要,以前版本需要,后面会介绍到)
[root@db01 ~]# yum install -y perl perl-devel perl-Time-HiRes perl-DBD-MySQL libev libaio libaio-devel

2、安装XtraBackup
[root@db01 ~]# wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.20/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm
[root@db01 ~]# yum install -y percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm 

3、修改配置
[root@db01 ~]# vim /etc/my.cnf      # 添加以下配置
[client]
socket=/tmp/mysql.sock

4、测试
[root@db01 backup]# xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/service/data/data --server-id=1 --log_bin=/service/data/binlog/mysql-bin 
xtrabackup version 2.4.20 based on MySQL server 5.7.26 Linux (x86_64) (revision id: c8b4056)

[root@db01 ~]# innobackupex --version
xtrabackup: recognized server arguments: --datadir=/service/data/data --server-id=1 --log_bin=/service/data/binlog/mysql-bin 
innobackupex version 2.4.20 Linux (x86_64) (revision id: c8b4056)

这里我们要注意下:

Xtrabackup中主要包含两个工具:
  • xtrabackup:热备innodb数据的工具,不能备份其他类型的表和表结构,如MyISAM。
  • innobackupex:是将xtrabackup进行封装的perl脚本,会调用xtrabackup命令来备份InnoDB表,还提供了备份MyISAM表和表结构的能力。

以上是以前版本的描述,而在2.4版本中有以下变化,我们也可以通过man查看命令帮助手册或者阅读官方文档获知:
  innobackupex功能已经全部集成到xtrabackup里面,而innobackupex现在是作为xtrabackup的一个软链接。
  官方建议:不推荐使用innobackupex,请切换到xtrabackup。

xtrabackup常用选项:

选项             含义
–user 指定用户名
–password 指定密码
–host 指定主机
–port 指定端口
–backup 进行备份并将其放置在–target-dir指定目录中
–target-dir 指定备份的目标目录。如果该目录不存在,则会创建它。如果该目录存在并且为空,则命令将执行成功。xtrabackup不会覆盖现有文件,会报错文件已经存在。
–copy-back 将先前制作的备份中的所有文件从备份目录复制到其原始位置。
–incremental-basedir 创建增量备份时,该目录为前一次全备或者增备的目录,该目录是增量备份的基本数据集。
–incremental-dir 该选项表示还原时增量备份的目录。
–defaults-file 该选项指定从哪个文件读取MySQL配置,必须作为命令行上的第一个选项。
–datadir 备份的源目录。这应该与MySQL的datadir相同,因此会从my.cnf中读取(如果存在);否则,必须在命令行上指定它。

重要参数介绍:

1、–prepare
  对创建的备份执行恢复,以便可以使用。即对备份文件执行了InnoDB CR(崩溃恢复)的过程,让数据达到一致状态。
  一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"–prepare"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态
  如果尝试使用未"–prepare"的数据文件启动InnoDB,它将检测到损坏并自身崩溃,以防止在损坏的数据上运行。"–prepare"步骤可以使备份文件数据在单个瞬间完全一致。

2、–apply-log-only
  不回滚未提交事务。
  增量备份的"–prepare"步骤与普通备份不同。在普通备份中,为了使数据库保持一致而形成的格式:已提交的事务将相对于数据文件从日志文件中重播,未提交的事务将被回滚。
  准备增量备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能在下一次增量备份中提交。应该使用"–apply-log-only"选项来防止回滚。
  如果不使用"–apply-log-only"选项来防止回滚,则将无法对其应用增量备份。事务回滚后,无法应用下一步的增量备份。合并时除最后一个以外的所有增量备份恢复时,都必须使用"–apply-log-only"选项。

三、全备

  注意:前面提到的备份过程不会锁表,针对的是InnoDB而言的,而备份非InnoDB数据(如MyISAM)时,FTWRL(全局锁)会开启。

[root@db01 backup]# xtrabackup --user=root --password=000000 --backup --target-dir=/backup/full

执行以上命令进行全备,同时我们可以看到备份的具体过程,我们可以观察到:
在备份InnoDB数据时,没有锁表。
但是在备份非InnoDB数据时,开启了全局锁:
201109 06:05:40 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
201109 06:05:40 Executing FLUSH TABLES WITH READ LOCK...
201109 06:05:40 Starting to backup non-InnoDB tables and files

看下备份数据文件结构:
[root@db01 backup]# ll /backup/full/
total 12340
-rw-r-----. 1 root root      487 Nov  9 06:05 backup-my.cnf
-rw-r-----. 1 root root      384 Nov  9 06:05 ib_buffer_pool
-rw-r-----. 1 root root 12582912 Nov  9 06:05 ibdata1
drwxr-x---. 2 root root     4096 Nov  9 06:05 mysql
drwxr-x---. 2 root root     8192 Nov  9 06:05 performance_schema
drwxr-x---. 2 root root     8192 Nov  9 06:05 sys
drwxr-x---. 2 root root       88 Nov  9 06:05 userdata
-rw-r-----. 1 root root       21 Nov  9 06:05 xtrabackup_binlog_info
-rw-r-----. 1 root root      135 Nov  9 06:05 xtrabackup_checkpoints
-rw-r-----. 1 root root      490 Nov  9 06:05 xtrabackup_info
-rw-r-----. 1 root root     2560 Nov  9 06:05 xtrabackup_logfile

结构基本和数据目录一致,只是多了以下几个文件:
xtrabackup_binlog_info : 当前正在使用的binlog日志文件及至备份这一刻为止binlog日志事件的位置。
xtrabackup_checkpoints : 主要看检查点lsn,即to_lsn(备份结束时数据库的LSN),主要用于增量备份。
xtrabackup_info        : 总体信息
xtrabackup_logfile     : 备份生成的日志文件

  恢复数据。注意还原备份之前,datadir必须为空。同样要注意的是,在执行还原之前需要关闭MySQL服务器,您不能还原到正在运行的mysqld实例的数据目录(导入部分备份时除外)。

1、模拟数据损坏
[root@db01 backup]# pkill mysqld
[root@db01 backup]# rm -rf /service/data/data/*

2、准备备份
[root@db01 backup]# xtrabackup --prepare --target-dir=/backup/full/

3、恢复数据
[root@db01 backup]# xtrabackup --copy-back --target-dir=/backup/full/

4、更改权限
[root@db01 backup]# chown -R mysql.mysql /service/data/data/

5、测试
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| userdata           |
+--------------------+

四、增量备份

1、介绍

  增量备份备份的是自上次备份以来已更改的数据。
  您可以在每个完整备份之间执行许多增量备份,因此您可以设置备份方案,例如每周一次完整备份和每天增量备份,或者每天完整备份和每小时增量备份。
  增量备份实际上并不会将数据文件与先前备份的数据文件进行比较。因此,在部分备份之后运行增量备份可能会导致数据不一致。
  增量备份之所以有效,是因为每个InnoDB数据页都包含一个日志序列号LSN,该LSN记录当前页最后一次修改的LSN。
  增量备份只需读取数据页面并将其LSN与上一个备份的LSN进行比较即可。但是,仍然需要完整备份来恢复增量更改。没有完整的备份作为基础,增量备份将毫无用处。

2、模拟环境

(1)模拟原始数据
mysql> create database pxb charset utf8mb4;
mysql> use pxb
mysql> create table t1 (id int);
mysql> insert into t1 values(1),(2);

(2)模拟周日23:00 全备 
[root@db01 ~]# xtrabackup --user=root --password=000000 --backup --target-dir=/backup/full

(3)模拟周一白天的数据变化 
mysql> use pxb;
mysql> insert into t1 values(3),(4);

(4)模拟周一晚上23:00增量备份 
[root@db01 ~]# xtrabackup --user=root --password=000000 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full/

(5)模拟周二白天的数据变化 
mysql> use pxb;
mysql> insert into t1 values(5),(6);

(6)模拟周二增量
[root@db01 ~]# xtrabackup --user=root --password=000000 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

(7)模拟周三上午的数据变化 
mysql> use pxb;
mysql> insert into t1 values(7),(8);

(8)模拟周三下午数据损坏
[root@db01 ~]# pkill mysqld 
[root@db01 ~]# rm -rf /servcie/data/data/*

  检查对比各备份的LSN。to_lsn:这是备份结束时数据库的LSN;from_lsn:是备份的开始LSN。对于增量备份,from_lsn必须与上一个备份的to_lsnn(如果是最后一个检查点)相同。以下我们可以发现增量备份的from_lsn 都是上一个备份的to_lsn。

[root@db01 backup]# cat full/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 2735759
last_lsn = 2735768
compact = 0
recover_binlog_info = 0
flushed_lsn = 2735768
[root@db01 backup]# cat inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2735759
to_lsn = 2737692
last_lsn = 2737701
compact = 0
recover_binlog_info = 0
flushed_lsn = 2737701
[root@db01 backup]# cat inc2/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2737692
to_lsn = 2739619
last_lsn = 2739628
compact = 0
recover_binlog_info = 0
flushed_lsn = 2739628

3、恢复数据

(1)准备全备
[root@db01 backup]# xtrabackup --prepare --target-dir=/backup/full/

注意即使已跳过回滚阶段,此备份实际上现在也可以按原样恢复。如果还原它并启动MySQL,InnoDB将检测到未执行回滚阶段,并且将在后台执行该操作,就像启动时进行崩溃恢复一样。它会通知您数据库未正常关闭。

(2)inc1 合并至full中并prepare
[root@db01 backup]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1

此时LSN应该与您先前对第一个增量备份的检查中看到的相符。

(3)inc2 合并至full中并prepare
[root@db01 backup]# xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc2

(4)恢复全备
[root@db01 backup]# xtrabackup --copy-back --target-dir=/backup/full/
[root@db01 backup]# chown -R mysql.mysql /data/*

(5)截取并恢复binlog
[root@db01 backup]# cat inc2/xtrabackup_binlog_info 
mysql-bin.000008    1409
[root@db01 backup]# mysqlbinlog --start-position=1409 /service/data/binlog/mysql-bin.000008 > /tmp/binlog.sql

mysql> set sql_log_bin=0;
mysql> source /tmp/binlog.sql;
mysql> set sql_log_bin=1;
mysql> select * from pxb.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
+------+
Like
Like Love Haha Wow Sad Angry
1

发表评论