实验环境:
CentOS7.9
准备软件:yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
一、什么是Percona XtraBackup:Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持MySQl(Oracle)、Percona Server 和 MariaDB,并且全部开源
二、工作原理
Percona XtraBackup 的工作原理是在启动时记住日志序列号(LSN),然后复制数据文件。
三、使用Percona XtraBackup
1 安装xtrabackup
1.1[root@localhost ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
1.2 [root@localhost ~]# yum list | grep percona-xtarbackup
1.3 [root@localhost ~]# yum -y install percona-xtrabackup-24.x86_64
四、Xtrabackup完全备份+binlog增量备份
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录
五、完全备份
1.[root@localhost ~]# innobackupex --user=root--password=123 /mysqlbackup/ 语法解释说明:
#--user=root 指定备份用户
#--password=123456 指定备份用户密码
#--host 指定主机
#/mysqlbackup 指定备份目录
1.2查看备份数据
backup-my.cnf #备份用到的配置选项信息文件
xtrabackup_binlog_info #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
xtrabackup_checkpoints #备份的类型、状态和LSN状态信息文件
xtrabackup_logfile #备份的日志文件
1.3 恢复数据
[root@localhost]# innobackupex --apply-log /mysqlbackup/2023-02-14_15-07-11/ #合并数据,使数据文件处于一致性的状态
[root@localhost]# rm -rf /usr/local/mysql/data/* #模拟mysql数据丢失
[root@localhost]# innobackupex --copy-back /mysqlbackup/2023-02-14_15-07-11/ #恢复数据
[root@localhost]# ls /usr/local/mysql/data/ #查看已恢复的数据
修改属主属组
[root@localhost]# chown -R mysql.mysql /usr/local/mysql/data/
总结全库备份与恢复三步曲:
a. innobackupex全量备份,并指定备份目录路径;
b. 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;
c. 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。
xtrabackup增量备份与恢复
使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。
要实现第一次增量备份,可以使用下面的命令进行:
2、 增量备份
2.1 [root@localhost]# innobackupex --user=root --password=123 /mysqlbackup/ #完全备份
2.2 创建数据库和表用于增量备份
[root@localhost]# mysql -uroot -p123
mysql> create database abc;
Query OK, 1 row affected (0.00 sec)
mysql> use abc;
Database changed
mysql> create table a(id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into a values(1,'小白');
Query OK, 1 row affected (0.00 sec)
2.3使用innobackupex进行增量备份
[root@localhost ~]# innobackupex --user=root --password=123 --incremental /mysqlbackup/ --incremental-basedir=/mysqlbackup/2023-02-14_15-07-11
2.4 查看备份数据
[root@localhost ~]# ll /mysqlbackup/
总用量 0
drwxr-x--- 6 root root 183 2月 14 15:07 2023-02-14_15-07-11 #完全备份
drwxr-x--- 7 root root 220 2月 14 15:10 2023-02-14_15-10-42 #增量备份
2.5 查看完全备份的xtrabackup_checkpoints
[root@localhost ~]# cat /mysqlbackup/2023-02-14_15-07-11/xtrabackup_checkpoints
backup_type = full-backuped #备份类型为完全备份
from_lsn = 0 #lsn从0开始
to_lsn = 1626067 #lsn到1626067结束
last_lsn = 1626067
compact = 0
recover_binlog_info = 0
2.6 查看增量备份xtrabackup_checkpoints
[root@localhost ~]# cat /mysqlbackup/2023-02-14_15-10-42/xtrabackup_checkpoints
backup_type = incremental #备份类型为增量备份
from_lsn = 1626067 #lsn从1626067 开始
to_lsn = 1630025 #lsn到1630025结束
last_lsn = 1630025
compact = 0
recover_binlog_info = 0
3 增量备份后数据恢复
3.1 模拟mysql故障删除mysql所有数据
[root@localhost ~]# rm -rf /usr/local/mysql/data/*
合并全备数据目录,确保数据的一致性
[root@localhost ~]# innobackupex --apply-log --redo-only /mysqlbackup/2023-02-14_15-07-11/
将增量备份数据合并到全备数据目录当中
[root@localhost ~]# innobackupex --apply-log --redo-only /mysqlbackup/2023-02-14_15-07-11 --incremental-dir=/mysqlbackup/2023-02-14_15-10-42
[root@localhost ~]# cat /mysqlbackup/2023-02-14_15-07-11/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0 #lsn从0开始
to_lsn = 1630025 #lsn结束好为最新的lsn
last_lsn = 1630025
compact = 0
recover_binlog_info = 0
恢复数据
[root@localhost ~]# innobackupex --copy-back /mysqlbackup/2023-02-14_15-07-11/
[root@localhost ~]# chown -R mysql.mysql/usr/local/mysql/data #更改数据的属主属组
[root@localhost ~]# mysql -uroot -p -e "show databases;" #查看数据是否恢复
总结:
(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;
(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;
(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;
(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。
#1. --user=root 指定备份的用户
#2. --password=root指定备份用户的密码
#3. --defaults-file=/etc/my.cnf 指定的备份数据的配置文件
#4. /opt/ 指定备份后的数据保存路径