XtraBackup数据备份与恢复(全部、增量、差异)前言1.XtraBackup介绍

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

MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。
xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下:

1.xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;
2.innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。myisam不支持增量备份

2.XtraBackup优点

(1)备份速度快,物理备份可靠
(2)备份过程不会打断正在执行的事务(无需锁表)
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动备份校验
(5)还原速度快
(6)可以流传将备份传输到另外一台机器上
(7)在不增加服务器负载的情况备份数据

安装

官网下载Software Downloads – Percona

XtraBackup2.4支持mysql5.6 、5.7

XtraBackup8.0支持mysql8.0

image-20230808111839824

先创建一个文件来存放的xtraBackupmkdir /xtraBackup将下好的tar包进行解压到/xtraBackup文件下tar -xf Percona-XtraBackup-2.4.20-rc8b4056-el7-x86_64-bundle.tar -C /xtraBackup/安装cd /xtraBackupyum install -y *查看xtrabackup -version

xtrabackup完全备份与恢复

常用参数:

--apply-log    在进行数据库恢复操作之前执行,以确保数据的一致性和完整性--redo-only     不回滚未提交事务--copy-back     恢复备份目录--incremental指定增量备份--incremental-basedir指定基于哪个备份做增量备份,最后是增量备份保存的目录。

1.备份

innobackupex --user=root --password='123456' /xtrabackup/full执行正确最后会显示 completed OK!

2.模拟数据库毁坏 删库

cd /usr/local/mysql/datarm -rf ./*

3.准备
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。”准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。

innobackupex --apply-log --redo-only /xtrabackup/full/2023-08-08_22-27-21/

4.恢复

innobackupex --defaults-file=/etc/my.cnf --copy-back /xtrabackup/full/2023-08-08_22-27-21/

5.修改权限
现在备份的文件属主属组都是root mysql账号是打不开的 没有权限 需要修改权限

[root@localhost data]# ll总用量 122900-rw-r----- 1 root root 12582912 8月   8 16:10 ibdata1-rw-r----- 1 root root 50331648 8月   8 16:10 ib_logfile0-rw-r----- 1 root root 50331648 8月   8 16:10 ib_logfile1-rw-r----- 1 root root 12582912 8月   8 16:10 ibtmp1drwxr-x--- 2 root root       54 8月   8 16:10 kingsdrwxr-x--- 2 root root     4096 8月   8 16:10 mysqldrwxr-x--- 2 root root     4096 8月   8 16:10 performance_schemadrwxr-x--- 2 root root       20 8月   8 16:10 test-rw-r----- 1 root root       24 8月   8 16:10 xtrabackup_binlog_pos_innodb-rw-r----- 1 root root      503 8月   8 16:10 xtrabackup_info-rw-r----- 1 root root        1 8月   8 16:10 xtrabackup_master_key_id
[root@localhost data]# chown -R mysql.mysql /usr/local/mysql/data[root@localhost data]# ll总用量 122900-rw-r----- 1 mysql mysql 12582912 8月   8 16:10 ibdata1-rw-r----- 1 mysql mysql 50331648 8月   8 16:10 ib_logfile0-rw-r----- 1 mysql mysql 50331648 8月   8 16:10 ib_logfile1-rw-r----- 1 mysql mysql 12582912 8月   8 16:10 ibtmp1drwxr-x--- 2 mysql mysql       54 8月   8 16:10 kingsdrwxr-x--- 2 mysql mysql     4096 8月   8 16:10 mysqldrwxr-x--- 2 mysql mysql     4096 8月   8 16:10 performance_schemadrwxr-x--- 2 mysql mysql       20 8月   8 16:10 test-rw-r----- 1 mysql mysql       24 8月   8 16:10 xtrabackup_binlog_pos_innodb-rw-r----- 1 mysql mysql      503 8月   8 16:10 xtrabackup_info-rw-r----- 1 mysql mysql        1 8月   8 16:10 xtrabackup_master_key_id

6.进入mysql 查看数据是否恢复

mysql -uroot -p

xtrabackup增量备份与恢复

增量备份是备份在原先全部备份的基础上,到增量备份时间点中间这段时间内增删改的数据记录的备份

为做此时实验我们先创建一个数据库一个表 添加数据用来测试

mysql> create database test_db;Query OK, 1 row affected (0.00 sec)mysql> use test_db;Database changedmysql> create table t1(id int);Query OK, 0 rows affected (0.00 sec)mysql> insert into t1 values(1);Query OK, 1 row affected (0.00 sec)mysql> select * from t1;+------+| id   |+------+|    1 |+------+1 row in set (0.00 sec)

1.做一次全部备份

innobackupex --user=root --password='123456' /xtrabackup/full

2.模拟周二数据库修改操作 添加一行数据

mysql> insert into t1 values(2);Query OK, 1 row affected (0.00 sec)mysql> select * from t1;+------+| id   |+------+|    1 ||    2 |+------+2 rows in set (0.00 sec)

增量备份(周二增量备份 基于周一,会产生一个备份文件,内容是增量备份点到全部备份这段时间内增删改的数据)
注意:1. 增量数据会通过下面这条指令生成一个增量数据的备份文件
2.如果再想增量备份,则在上一次增量备份的基础上进行增量备份 也就是incremental-basedir要设置上一次增量备份文件

3.增量备份
生成2023-08-09_01-22-13文件

innobackupex --user=root --password='123456' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2023-08-09_01-12-31ls /xtrabackup/full2023-08-08_22-27-21  2023-08-09_01-12-31  2023-08-09_01-22-13

4.模拟周三数据库损坏

cd /my_mysql/3306/data/rm -rf ./*

5.恢复

innobackupex --apply-log --redo-only /xtrabackup/full/2023-08-09_01-12-31/innobackupex --apply-log --redo-only /xtrabackup/full/2023-08-09_01-12-31/ --incremental-dir=/xtrabackup/full/2023-08-09_01-22-13/注意:经上面两条语句 全局备份数据中已经添加了增量备份的数据, 所以我们直接恢复一下已添加增量备份数据的全局备份文件(2023-08-09_01-12-31)innobackupex --copy-back /xtrabackup/full/2023-08-09_01-12-31/

6.修改属主属组

chown -R mysql.mysql /usr/local/mysql/data这时候数据已经直接恢复到事故之前的状态了mysql> select * from t1;+------+| id   |+------+|    1 ||    2 |+------+2 rows in set (0.00 sec)

最后特别注意:
当增量备份没有带–redo-only后,之后的增量备份不能再应用,数据库可能都开启不了了,博主已经替大家踩过坑了!希望大家别遇到!,最好是执行完恢复操作后再次进行全备,并在此基础上进行增量。反之
“xtrabackup: error: The transaction log file is corrupted.
xtrabackup: error: The log was not applied to the intended LSN!”
所以在做准备备份时,提前备份好一份全备,以免不时之需。

xtrabackup差异备份与恢复

我们还是假设从周一开始 删掉第二条数据

mysql> delete from test_db.t1 where id=2;Query OK, 1 row affected (0.00 sec)mysql> select * from test_db.t1;+------+| id   |+------+|    1 |+------+1 row in set (0.00 sec)

1.全被备份
因为之前全部备份用过了增量备份恢复 虽然我们已经使用了参数 –redo-only 但以防万一还是再全部备份一次。

innobackupex --user=root --password='123456' /xtrabackup/full/

2.模拟修改数据

mysql> insert into t1 values(2);Query OK, 1 row affected (0.01 sec)mysql> select * from test_db.t1;+------+| id   |+------+|    1 ||    2 |+------+2 rows in set (0.00 sec)

3.一次差异备份(第一次差异备份跟增量备份没区别)

innobackupex --user=root --password='123456' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2023-08-09_02-35-48/

4.再次修改数据,再做一次差异备份

修改数据

mysql> insert into t1 values(3);Query OK, 1 row affected (0.01 sec)mysql> select * from t1;+------+| id   |+------+|    1 ||    2 ||    3 |+------+3 rows in set (0.00 sec)

做一次差异备份(其实差异备份是以第一次全局备份为基础,全局备份时候到此次差异备份时间点中增删改的数据)

所以我们这次备份还是以第一次为基础备份就行

innobackupex --user=root --password='123456' -S /my_mysql/3306/mysql.sock --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2023-08-09_02-35-48/
[root@localhost full]# lldrwxr-x--- 7 root root 336 8月   9 02:10 2023-08-09_01-12-31drwxr-x--- 7 root root 256 8月   9 01:27 2023-08-09_01-22-13drwxr-x--- 7 root root 298 8月   9 02:51 2023-08-09_02-35-48    //差异备份第一次完全备份  drwxr-x--- 7 root root 256 8月   9 02:37 2023-08-09_02-37-42    //第一次差异备份drwxr-x--- 7 root root 256 8月   9 02:51 2023-08-09_02-43-29   //第二次差异备份

5.模拟数据数据损坏

cd /usr/local/mysql/datarm -rf ./*

6.恢复(差异恢复用准备用的是最后一次的差异备份文件)

innobackupex --apply-log --redo-only /xtrabackup/full/2023-08-09_02-35-48/innobackupex --apply-log --redo-only /xtrabackup/full/2023-08-09_02-35-48/ --incremental-dir=/xtrabackup/full/2023-08-09_02-43-29/注意:经上面两条语句 全局备份数据中已经添加了差异备份的数据, 所以我们直接恢复一下已添加差异备份数据的全局备份文件(2023-08-09_02-35-48)innobackupex --defaults-file=/etc/my.cnf --copy-back /xtrabackup/full/2023-08-09_02-35-48/  

7.修改属主属组

chown -R mysql.mysql /usr/local/mysql/data查看数据mysql> select * from t1;+------+| id   |+------+|    1 ||    2 ||    3 |+------+3 rows in set (0.00 sec)

其实增量跟差异备份在这实际操作区别很小
增量备份:备份的数据是对上次备份(上次备份可以是全部备份、增量备份)到此时的数据备份
差异备份:备份的数据是对上次完全备份到此时的数据备份

所以差异备份恢复数据是利用上次完全备份文件和最近一次差异备份的数据就可以恢复最近的数据,而增量备份需要一次次的累加恢复数据。