当前位置: 首页 > 工具软件 > XtraBackup > 使用案例 >

Xtrabackup

颜英博
2023-12-01

Xtrabackup备份与恢复

1. xtrabackup介绍

MySQL冷备、mysqldumpMySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup2个工具,分别是xtrabakupinnobakupe

Percona-xtrabackupPercona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQLPercona serverMariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDBxtraDB两种数据引擎的表,而不能备份MyISAM数据表。

2. xtrabackup优点

(1)备份速度快,物理备份可靠

(2)备份过程不会打断正在执行的事务(无需锁表)

(3)能够基于压缩等功能节约磁盘空间和流量

(4)自动备份校验

(5)还原速度快

(6)可以流传将备份传输到另外一台机器上

(7)在不增加服务器负载的情况备份数据

3. xtrabackup备份原理

(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;

(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)

(3)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log

(4)innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frmMYDMYICSVoptpar等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。

(5)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;

(6)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupexredo.log文件拷贝完成;

(7)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES

(8)最后innbackupexxtrabackup进程各自释放资源,写备份元数据信息等,innobackupexxtrabackup子进程结束后退出

4. xtrabackup的安装

## 我这里已经准备好了rpm包
# 安装依赖包
rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
yum install perl-DBI
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum -y install perl-Digest-MD5 rsync

# 安装
rpm -ivh percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

# 查看版本号
[root@133 ~]#innobackupex -version
innobackupex version 2.4.9 Linux (x86_64) (revision id: a467167cdd4)
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:  
   --host    		指定主机
   --user     		指定用户名
   --password  		指定密码
   --port   	    指定端口
   --databases    	指定数据库
   --incremental 	创建增量备份
   --incremental-basedir 	 指定包含完全备份的目录
   --incremental-dir   	     指定包含增量备份的目录   
   --apply-log        	     对备份进行预处理操作             
   --defaults-file=/etc/my.cnf  指定的备份数据的配置文件
   
     一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录

5. xtrabackup备份与恢复

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAMMERGECSVARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

1)xtrabackup_checkpoints -- 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:

每个InnoDB页(通常为16k大小)
都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

(2)xtrabackup_binlog_info  --  mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。

(3)xtrabackup_binlog_pos_innodb  --  二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

(4)xtrabackup_binary  --  备份中用到的xtrabackup的可执行文件;

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

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份

5.1 全量备份与恢复

备份

# 创建一个备份目录
[root@133 ~]#mkdir /backup

# 先查看数据库里面有那些库和表
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| eab1               |
| eab2               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> show tables from eab1;
+----------------+
| Tables_in_eab1 |
+----------------+
| stu            |
+----------------+
1 row in set (0.00 sec)


# 全备数据库
[root@133 ~]#innobackupex --user=root --password=scl666 --host=127.0.0.1 /backup/
...
# 出现下面内容表示备份成功
200601 13:46:50 completed OK!

# 查看备份的数据
[root@133 ~]# ls /backup/2020-06-02_20-40-16/
backup-my.cnf  eab2     mysql               test                    xtrabackup_info
eab1           ibdata1  performance_schema  xtrabackup_checkpoints  xtrabackup_logfile
# 到这里就已经备份成功了

恢复

# 演示在192.168.100.138上做恢复操作
# 恢复:
清空数据目录才能恢复
停止数据库然后清空datadir里面的数据
恢复完成后都是root身份的改为MySQL身份,然后就可以启动数据库了

# 停止138上的mysql
[root@138 ~]# systemctl stop mariadb

# 拷贝数据备份文件到138
scp -r root@192.168.100.133:/backup/2020-06-02_20-40-16 /backup/

# 合并数据
[root@138 ~]# innobackupex --apply-log /backup/2020-06-02_20-40-16/
...
200602 20:50:48 completed OK!

# 删除原有的数据库,清空数据目录(可以查看/etc/my.cnf里面的datadir指向的目录)
[root@138 ~]# rm -rf /var/lib/mysql/*

# 恢复数据库
[root@138 ~]# innobackupex --copy-back /backup/2020-06-02_20-40-16/
...
200602 19:39:59 completed OK!

# 查看恢复的数据
[root@133 ~]#ls /var/lib/mysql/
eab1  eab2  ibdata1  mysql  performance_schema  test  xtrabackup_info

# 修改属主属组为mysql
[root@138 ~]# chown -R mysql.mysql /var/lib/mysql/

# 重启数据库然后登录进去看数据恢复没有
[root@138 ~]# systemctl restart mariadb
[root@138 ~]# mysql -uroot -pscl666
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| eab1               |
| eab2               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> show tables from eab1;
+----------------+
| Tables_in_eab1 |
+----------------+
| stu            |
+----------------+
1 row in set (0.00 sec)
# 可以看到数据和133上的数据一致说明数据恢复成功

# 在本机做恢复操作
[root@133 ~]# systemctl stop mariadb		# 停止数据库
[root@133 ~]# innobackupex --apply-log /backup/2020-06-02_20-40-16/		# 合并数据
[root@133 ~]# rm -rf /var/lib/mysql/*		# 清空数据目录
[root@133 ~]# innobackupex --copy-back /backup/2020-06-02_20-40-16/		# 恢复数据
[root@133 ~]# chown -R mysql.mysql /var/lib/mysql/		# 修改属主和属组为mysql
[root@133 ~]# systemctl start mariadb		# 重新启动数据库
[root@133 ~]# mysql -uroot -pscl666 		# 登录数据库查看数据是否恢复
MariaDB [(none)]> show tables from eab1;
+----------------+
| Tables_in_eab1 |
+----------------+
| stu            |
+----------------+
1 row in set (0.00 sec)

5.2 增量备份与恢复

使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
①需要在每个备份 (包括完全和各个增量备份)上,将已经提交的事务进行"重放"。“重放"之后,所有的备份数据将合并到完全备份上。
②基于所有的备份将未提交的事务进行"回滚”

增量备份

# 先全备数据库
[root@133 ~]# innobackupex --user=root --password=scl666 --host=127.0.0.1 /backup/	
...
200603 15:18:12 completed OK!

# 在stu表里面插入一点内容
MariaDB [eab1]> select *from stu;
+----+---------------+------+------+
| id | name          | sex  | age  |
+----+---------------+------+------+
|  1 | zhangsan      | nan  |   12 |
|  2 | lisi          | nan  |   13 |
|  3 | wangwu        | nan  |   15 |
|  4 | lisisi        | nv   |   19 |
|  5 | zhangshanshan | nv   |   23 |
+----+---------------+------+------+
5 rows in set (0.00 sec)

# 使用innobackupex进行增量备份
[root@133 ~]# innobackupex --user=root --password=scl666 --host=127.0.0.1 --incremental /backup/ --incremental-basedir=/backup/2020-06-03_15-18-10/
--incremental  打开增备的开关
--incremental /backup/	增量备份文件保存的位置,如果不指定文件名会默认生成一个以时间戳命名的文件
--incremental-basedir=/backup/2020-06-03_15-18-10/  指定是基于谁做增备的

#查看备份的数据
[root@133 ~]# ll /backup
drwxr-x---. 7 root root 196 6月   3 15:18 2020-06-03_15-18-10		# 全备的数据
drwxr-x---. 7 root root 222 6月   3 16:21 2020-06-03_16-21-50		# 增备的数据

# 查看全量备份的xtrabackup_checkpoints
[root@133 ~]# cat /backup/2020-06-03_15-18-10/xtrabackup_checkpoints 
backup_type = full-backuped		# 备份类型为全量备份
from_lsn = 0			# lsn从0开始
to_lsn = 1600116		# lsn到1600116结束
last_lsn = 1600116
compact = 0
recover_binlog_info = 0

# 查看增量备份的xtrabackup_checkpoints
[root@133 ~]# cat /backup/2020-06-03_16-21-50/xtrabackup_checkpoints 
backup_type = incremental		# 备份类型为增量备份
from_lsn = 1600116		# lsn从1600116开始
to_lsn = 1607360		#  lsn到1607360结束
last_lsn = 1607360
compact = 0
recover_binlog_info = 0

增量备份恢复

  • 依赖于上次备份进行增量
  • 他的恢复依赖于全备
  • 增量必须合并到全备中才可以恢复
# 停止数据库
[root@133 ~]# systemctl stop mariadb

# 删除数据目录中的所有内容
[root@133 ~]# rm -rf /var/lib/mysql/*

# 合并全备数据目录,确保数据的一致性
[root@133 ~]# innobackupex --apply-log --redo-only /backup/2020-06-03_15-18-10/

# 将增量备份数据合并到全备数据目录当中
[root@133 ~]# innobackupex --apply-log --redo-only /backup/2020-06-03_15-18-10/ --incremental-dir=/backup/2020-06-03_16-21-50/

# 查看合并数据后全量备份的xtrabackup_checkpoints
[root@133 ~]# cat /backup/2020-06-03_15-18-10/xtrabackup_checkpoints 
backup_type = log-applied		# 查看到数据备份类型是增加
from_lsn = 0			# lsn从0开始
to_lsn = 1607360		# lsn结束号为最新的lsn1607360
last_lsn = 1607360
compact = 0
recover_binlog_info = 0

# 恢复数据
[root@133 ~]# innobackupex --copy-back /backup/2020-06-03_15-18-10/

# 查看恢复后的数据
[root@133 ~]# ll /var/lib/mysql/
总用量 18444
drwxr-x---. 2 root root       35 6月   3 16:43 eab1
drwxr-x---. 2 root root       20 6月   3 16:43 eab2
-rw-r-----. 1 root root 18874368 6月   3 16:43 ibdata1
drwxr-x---. 2 root root     4096 6月   3 16:43 mysql
drwxr-x---. 2 root root     4096 6月   3 16:43 performance_schema
drwxr-x---. 2 root root       20 6月   3 16:43 test
-rw-r-----. 1 root root      513 6月   3 16:43 xtrabackup_info

# 修改属主属组为mysql
[root@133 ~]# chown -R mysql.mysql /var/lib/mysql/

# 启动数据库
[root@133 ~]# systemctl start mariadb

# 查看数据是否已经恢复
[root@133 ~]# mysql -uroot -pscl666
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| eab1               |
| eab2               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> select *from eab1.stu;
+----+---------------+------+------+
| id | name          | sex  | age  |
+----+---------------+------+------+
|  1 | zhangsan      | nan  |   12 |
|  2 | lisi          | nan  |   13 |
|  3 | wangwu        | nan  |   15 |
|  4 | lisisi        | nv   |   19 |
|  5 | zhangshanshan | nv   |   23 |
+----+---------------+------+------+
5 rows in set (0.00 sec)

## 可以看到数据已经恢复成功了

总结:
(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用--incremental-basedir指定是基于谁做增量备份,注意,如果有多个增量备份时要指定的是基于上一次的增量做的增量备份;

(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;

(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

 类似资料:

相关阅读

相关文章

相关问答