XtraBackup数据备份与恢复(全部、增量、差异)
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
先创建一个文件来存放的xtraBackup
mkdir /xtraBackup
将下好的tar包进行解压到/xtraBackup文件下
tar -xf Percona-XtraBackup-2.4.20-rc8b4056-el7-x86_64-bundle.tar -C /xtraBackup/
安装
cd /xtraBackup
yum 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/data
rm -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 ibtmp1
drwxr-x--- 2 root root 54 8月 8 16:10 kings
drwxr-x--- 2 root root 4096 8月 8 16:10 mysql
drwxr-x--- 2 root root 4096 8月 8 16:10 performance_schema
drwxr-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 ibtmp1
drwxr-x--- 2 mysql mysql 54 8月 8 16:10 kings
drwxr-x--- 2 mysql mysql 4096 8月 8 16:10 mysql
drwxr-x--- 2 mysql mysql 4096 8月 8 16:10 performance_schema
drwxr-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 changed
mysql> 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-31
ls /xtrabackup/full
2023-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]# ll
drwxr-x--- 7 root root 336 8月 9 02:10 2023-08-09_01-12-31
drwxr-x--- 7 root root 256 8月 9 01:27 2023-08-09_01-22-13
drwxr-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/data
rm -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)
其实增量跟差异备份在这实际操作区别很小
增量备份:备份的数据是对上次备份(上次备份可以是全部备份、增量备份)到此时的数据备份
差异备份:备份的数据是对上次完全备份到此时的数据备份
所以差异备份恢复数据是利用上次完全备份文件和最近一次差异备份的数据就可以恢复最近的数据,而增量备份需要一次次的累加恢复数据。