Xtrabackup介绍

Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。它可以备份来自MySQL5.1,5.5,5.6和5.7服务器上的InnoDB,XtraDB和MyISAM表的数据,以及带有XtraDB的Percona服务器。

XtraBackup 有两个工具:xtrabackup 和 innobackupex
Xtrabackup 本身只能备份InnoDB和XtraDB,不能备份MyISAM;
innobackupex 它是封装了xtrabackup的perl脚本,覆盖了xtrabackup的功能。
它不但可以备份nnodb和xtradb两种引擎的表,还可以备份myisam引擎的表(在备份myisam表时需要加一个读锁)

Xtrabackup特点

备份过程快速、可靠;
备份过程不会打断正在执行的事务;
能够基于压缩等功能节约磁盘空间和流量;
自动实现备份检验;
还原速度快;

安装xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 

innobackupex 工具的使用

--innobackupex 常用的参数有以下几个
--user        指定用户名
--password    指定密码
--host  指定数据库服务器的地址
--port  指定连接数据库的端口
--databases     指定数据库
--no-timestamp   使用innobackupex 备份时,使用--no-timestamp 来阻止命令自动创建一个以时间为命名的目录
--default-files 可通过此选项指定其他配置文件,但是使用时必须放在所有选项的最前面
--incremental  指定创建增量备份
--incremntal-basedir 指定基于那个备份做增量备份
--apply-log  应用xtrabackup_logfile文件,重做已提交的事务,回滚未提交的事务
--redo-only  不回滚未提交事务
--copy-back  恢复备份至数据库服务器的数据目录
--compact    压缩备份
--incremental        创建增量备份
--incremental-basedir  指定包含完全备份的目录
--incremental-dir      指定包含增量备份的目录

全量备份

--全库备份与恢复步骤
innobackupex全量备份,并指定备份目录路径
在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求
恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径
--进行全量备份
[root@linux /]# innobackupex  --defaults-file=/etc/my.cnf --user=root --password=123456  /data/backup

--innobackupex 备份会创建一个时间的目录
[root@linux /]# ll /data/backup/
总用量 0
drwxr-x--- 6 root root 182 11月 30 15:14 2020-11-30_15-13-52

--去掉时间戳进行备份
[root@linux /]# innobackupex  --defaults-file=/etc/my.cnf --no-timestamp --user=root --password=123456  /data/backup/database
--查看全备内容
[root@linux /]# ll /data/backup/database/
总用量 12316
-rw-r----- 1 root root      418 11月 30 15:42 backup-my.cnf
drwxr-x--- 2 root root       48 11月 30 15:42 db
-rw-r----- 1 root root 12582912 11月 30 15:42 ibdata1
drwxr-x--- 2 root root     4096 11月 30 15:42 mysql
drwxr-x--- 2 root root     4096 11月 30 15:42 performance_schema
drwxr-x--- 2 root root       20 11月 30 15:42 test
-rw-r----- 1 root root       21 11月 30 15:42 xtrabackup_binlog_info
-rw-r----- 1 root root      113 11月 30 15:42 xtrabackup_checkpoints
-rw-r----- 1 root root      520 11月 30 15:42 xtrabackup_info    
-rw-r----- 1 root root     2560 11月 30 15:42 xtrabackup_logfile

--备份的文件具体信息
backup-my.cnf    备份命令要到的配置选项信息
xtrabackup_binlog_info  服务器当前正在使用的二进制日志文件和至备份此刻为止二进制日志事件的位置
xtrabackup_checkpoints  记录了备份的类型,备份的起始点,结束点等状态信息
xtrabackup_info     有关此备份的各种详细信息
xtrabackup_logfile  事务日志记录文件,用于在准备阶段进行重做和日志回滚

全备恢复数据

--恢复数据之前需要保证数据目录是空的状态
--在备份完成后,数据不能直接用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已提交尚未同步至数据文件中的事务,而且备份过程中可能还有数据的更改动作,此时xtrabackup_logfile就派上用场了,对事务已经提交但数据没有写入的备部分,进行重做,将已经写到数据文件,但未提交的事务通过undo进行回滚,最终使得数据文件处于一致性状态,使用选项--apply-log来实现
[root@linux /]# innobackupex --apply-log /data/backup/database/

--使用innobackupex --copy-back 来还原数据库
[root@linux /]# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/database/
--修改属主属组
[root@linux /]# chown -R mysql:mysql /data/mysql
--重启数据库
[root@linux /]# systemctl restart mysqld

增量备份

基于上一次备份进行'增量'备份
'增量备份'无法单独恢复,必须'基于全备'进行恢复
所有增量'必须要按顺序'合并到全备当中
--no-timestamp   省略时间戳
--incremental    开启增量备份功能
--incremental-basedir  '上一次备份'的路径

全量备份

[root@linux /]# innobackupex  --defaults-file=/etc/my.cnf --no-timestamp --user=root --password=123456  /data/backup/v1

写入数据

MySQL [db]> insert into db values(1,'END',123456);
MySQL [db]> select * from db;
+----+------+--------+
| id | name | passwd |
+----+------+--------+
|  1 | END  | 123456 |
+----+------+--------+
1 rows in set (0.00 sec)

第一次增量备份

[root@linux /]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/data/backup/v1 /data/backup/v2

--参数解释
--no-timestamp   省略时间戳
--incremental    开启增量备份功能
--incremental-basedir  增量备份时'上一次备份'的路径

--写入数据
MySQL [db]> insert into db values(2,'TOM',123456);
MySQL [db]> select * from db;
+----+------+--------+
| id | name | passwd |
+----+------+--------+
|  1 | END  | 123456 |
|  2 | TOM  | 123456 |
+----+------+--------+
2 rows in set (0.00 sec)

第二次增量备份

[root@linux /]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/data/backup/v2 /data/backup/v3

--写入数据
MySQL [db]> insert into db values(3,'Jack',123456);
MySQL [db]> select * from db;
+----+------+--------+
| id | name | passwd |
+----+------+--------+
|  1 | END  | 123456 |
|  2 | TOM  | 123456 |
|  3 | Jack | 123456 |
+----+------+--------+
3 rows in set (0.00 sec)

第三次增量备份

[root@linux /]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/data/backup/v3 /data/backup/v4

恢复增量备份数据

--首先将数据进行删除
MySQL [db]> select * from db;
+----+------+--------+
| id | name | passwd |
+----+------+--------+
|  1 | END  | 123456 |
|  2 | TOM  | 123456 |
|  3 | Jack | 123456 |
+----+------+--------+
3 rows in set (0.00 sec)

MySQL [db]> delete from db;      #删除单表全部数据 
Query OK, 3 rows affected (0.00 sec)

MySQL [db]> select * from db;
Empty set (0.00 sec)

合并数据

--incremental-dir=目录名    #增量恢复数据时,指定使用恢复文件所在的目录
--合并全备数据目录,确保数据的一致性
[root@linux /]# innobackupex --apply-log --redo-only /data/backup/v1

--将第一次增量备份数据合并到全备数据目录当中
[root@linux /]# innobackupex --apply-log --redo-only --incremental-dir=/data/backup/v2 /data/backup/v1

--将第二次增量备份数据合并到全备数据目录当中
[root@linux /]# innobackupex --apply-log --redo-only --incremental-dir=/data/backup/v3 /data/backup/v1

--将第三次增量备份数据合并到全备数据目录当中
[root@linux /]# innobackupex --apply-log --redo-only --incremental-dir=/data/backup/v4 /data/backup/v1
[root@linux /]# cat /data/backup/v1/xtrabackup_checkpoints 
backup_type = log-applied     #查看到数据备份类型是增加
from_lsn = 0       #lsn从0开始
to_lsn = 1640512   #lsn结束号为最新的lsn
last_lsn = 1640512
compact = 0
recover_binlog_info = 0

恢复数据

--恢复数据,数据库目录必须为空,还需要修改属主属组
[root@linux /]# mv /data/mysql/ ./
[root@linux /]# innobackupex --copy-back /data/backup/v1
[root@linux /]# chown mysql:mysql /data/mysql/ -R
[root@linux /]# systemctl start mysqld


--查看数据是否恢复
[root@linux /]# mysql -uroot -p123456
MySQL [(none)]> use db;
Database changed
MySQL [db]> select * from db;
+----+------+--------+
| id | name | passwd |
+----+------+--------+
|  1 | END  | 123456 |
|  2 | TOM  | 123456 |
|  3 | Jack | 123456 |
+----+------+--------+
3 rows in set (0.00 sec)

其他命令

单数据库备份

[root@linux /]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --database=db /v1

多个数据库备份

[root@linux /]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --database="db|db1" /v2

多个数据库表备份

[root@linux /]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --include='db.db|db1.db' /v3
最后修改:2022 年 02 月 24 日
如果觉得我的文章对你有用,请随意赞赏