注意:percona-xtrabackup-8.0不支持mysql-8.0以下版本
目录
注意:percona-xtrabackup-8.0不支持mysql-8.0以下版本
(2)、准备恢复(恢复前可将备份数据再次进行备份,防止准备时出错)
2、当我们发现误删除时,首先清理表空间,当重复清理时会出现warning。
3、将准备好的备份文件中的表文件拷贝回数据库目录中对应的库目录,并修改所属主、组。
5、当某个库、表被删除时(不是内容),应该先创建库、表,库名、表名、表结构应该和被删除的表相同,然后再进行单张表恢复,本次只展示删除表后进行恢复)
(4)、将准备好的备份文件中的表文件拷贝回数据库目录中对应的库目录,并修改所属主、组。
(2)、解压(加入--remove-original选项,删除解密和解压后的原压缩文件)
一、安装
1、下载安装包
可到https://www.percona.com/downloads/Percona-XtraBackup-LATEST/下载想要的8.0版本
对于服务器无法连接外网可下载tar包到服务器解压进行安装:
对于可以连接外网的服务器可安装percona的yum源。
[root@localhost percona]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
安装后可执行下方语句,可看出percona的yum源已经有了
[root@localhost percona]# yum repolist
2、安装依赖包
[root@localhost percona]# yum -y install libev-4.15-7.el7.x86_64
3、安装percona
如果是下载的tar包,则解压后进入到解压目录。
[root@localhost percona]# ls
percona-xtrabackup-80-8.0.25-17.1.el7.x86_64.rpm percona-xtrabackup-test-80-8.0.25-17.1.el7.x86_64.rpm
percona-xtrabackup-80-debuginfo-8.0.25-17.1.el7.x86_64.rpm
[root@localhost percona]# yum -y install ./percona-xtrabackup-*
如果是yum源则直接安装这3个包
[root@localhost percona]# yum -y install percona-xtrabackup-80-8.0.25-17.1.el7.x86_64.rpm \
percona-xtrabackup-test-80-8.0.25-17.1.el7.x86_64.rpm \
percona-xtrabackup-80-debuginfo-8.0.25-17.1.el7.x86_64.rpm
二、完全备份和恢复
本次数据库中自由2个数据库,分别由2张,1张表
1、备份
[root@localhost allbak]# xtrabackup --backup -u用户名 -p --target-dir=保存路径
Enter password:
[root@localhost allbak]# xtrabackup --backup -uroot -p --target-dir=/allbak/allbak/
xtrabackup: recognized server arguments: --datadir=/data/mysql/mysqldata --tmpdir=/data/mysql/tmp
xtrabackup: recognized client arguments: --port=3306 --socket=/data/mysql/mysqldata/mysql.sock --backup=1 --user=root --password --target-dir=/allbak/allbak/
Enter password:
2、恢复数据库
(1)、准备恢复
[root@localhost allbak]# xtrabackup --prepare --target-dir=备份保存路径
[root@localhost allbak]# xtrabackup --prepare --target-dir=/allbak/allbak/
(2)、停止数据库,清空数据库目录
[root@localhost allbak]# systemctl stop mysqld
[root@localhost allbak]# rm -rf /data/mysql/mysqldata/*
(3)、恢复
[root@localhost allbak]# xtrabackup --copy-back --target-dir=备份保存路径
[root@localhost allbak]# xtrabackup --copy-back --target-dir=/allbak/allbak/
(4)、修改数据库目录的权限
[root@localhost allbak]# chown -R mysql.mysql /data/mysql
(5)、启动数据库查看受否与之前的相同
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test |
| test2 |
+----------------+
2 rows in set (0.00 sec)
三、增量备份
1、进行全量备份
[root@localhost allbak]# xtrabackup --backup -uroot -p --target-dir=/allbak/allbak
Enter password:
2、向表中插入数据(原只有id为1、2、3的数据)
mysql> select * from test.test;
+------+-------+
| id | name |
+------+-------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
+------+-------+
6 rows in set (0.00 sec)
mysql> select * from test.test2;
+------+------+
| id | name |
+------+------+
| 1 | wang |
| 2 | meng |
| 3 | qin |
| 4 | L |
| 5 | S |
| 6 | H |
+------+------+
6 rows in set (0.00 sec)
mysql> select * from test2.test;
+------+------+
| id | name |
+------+------+
| 1 | xu |
| 2 | yao |
| 4 | L |
| 5 | X |
| 6 | Y |
+------+------+
5 rows in set (0.00 sec)
3、进行第一次增量备份
xtrabackup --backup -u用户 -p --target-dir=增量备份保存路径 --incremental-basedir=全备份所在路径
[root@localhost allbak]# xtrabackup --backup -uroot -p --target-dir=/allbak/allbak_1 --incremental-basedir=/allbak/allbak/
Enter password:
4、再次向数据库中插入数据
mysql> select * from test.test;
+------+-------+
| id | name |
+------+-------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
| 7 | D |
| 7 | W |
| 7 | W |
| 7 | T |
+------+-------+
10 rows in set (0.00 sec)
mysql> select * from test.test2;
+------+------+
| id | name |
+------+------+
| 1 | wang |
| 2 | meng |
| 3 | qin |
| 4 | L |
| 5 | S |
| 6 | H |
| 7 | D |
| 8 | W |
| 9 | J |
+------+------+
9 rows in set (0.00 sec)
mysql> select * from test2.test;
+------+------+
| id | name |
+------+------+
| 1 | xu |
| 2 | yao |
| 4 | L |
| 5 | X |
| 6 | Y |
| 7 | T |
| 8 | w |
| 8 | 9 |
+------+------+
8 rows in set (0.00 sec)
5、进行第二次或第N次增量备份
[root@localhost allbak]# xtrabackup --backup -uroot -p --target-dir=第二次增量备份保存位置 --incremental-basedir=上一次增量备份保存位置
[root@localhost allbak]# xtrabackup --backup -uroot -p --target-dir=/allbak/allbak_2 --incremental-basedir=/allbak/allbak_1
Enter password:
6、删除数据库,模拟数据丢失,进行备份恢复
(1)、删除数据库目录
[root@localhost mysql]# rm -rf ./mysqldata/*
[root@localhost mysql]# ls mysqldata/
(2)、准备恢复(恢复前可将备份数据再次进行备份,防止准备时出错)
①、准备基本备份,注意--apply-log-only防止回滚选项,如果您不使用 防止回滚阶段的选项,那么您的增量备份将毫无用处。事务回滚后,无法应用进一步的增量备份(完全备份)
xtrabackup --prepare --apply-log-only --target-dir=完全备份路径
[root@localhost mysql]# xtrabackup --prepare --apply-log-only --target-dir=./allbak/allbak
②、将第一个或第N个增量备份合并到完全备份(请按照备份顺序依次合并)
xtrabackup --prepare --apply-log-only --target-dir=准备好的完全备份路径 --incremental-dir=增量备份路径(除最后一个)
[root@localhost mysql]# xtrabackup --prepare --apply-log-only --target-dir=./allbak/allbak --incremental-dir=./allbak/allbak_1
③、将最后一个增量备份合并到完全备份,本次最后一个为第二个增量备份(注意:当将最后一个增量备份合并时可以不加--apply-log-only防回滚选项,加了也不影响)
xtrabackup --prepare --target-dir=准备好的完全备份路径 --incremental-dir=最后一个增量备份路径
[root@localhost mysql]# xtrabackup --prepare --target-dir=./allbak/allbak --incremental-dir=./allbak/allbak_2
(3)、恢复数据库
[root@localhost mysql]# xtrabackup --copy-back --target-dir=合并后的全备路径
[root@localhost mysql]# xtrabackup --copy-back --target-dir=./allbak/allbak
(4)、修改数据库目录下文件的所属
[root@localhost mysql]# chown -R mysql.mysql /data/mysql/mysqldata/*
(5)、重启mysql数据库
[root@localhost mysql]# systemctl restart mysqld
(6)、登录数据库验证恢复是否成功
[root@localhost mysql]# mysql -uroot -p
Enter password:
mysql> select * from test.test;
+------+-------+
| id | name |
+------+-------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
| 7 | D |
| 7 | W |
| 7 | W |
| 7 | T |
+------+-------+
10 rows in set (0.04 sec)
mysql> select * from test.test2;
+------+------+
| id | name |
+------+------+
| 1 | wang |
| 2 | meng |
| 3 | qin |
| 4 | L |
| 5 | S |
| 6 | H |
| 7 | D |
| 8 | W |
| 9 | J |
+------+------+
9 rows in set (0.00 sec)
mysql> select * from test2.test;
+------+------+
| id | name |
+------+------+
| 1 | xu |
| 2 | yao |
| 4 | L |
| 5 | X |
| 6 | Y |
| 7 | T |
| 8 | w |
| 8 | 9 |
+------+------+
8 rows in set (0.00 sec)
四、恢复单张表或单个库
(本次使用上面合并好的增量全备份文件进行恢复)
1、删除某个表中的内容,模拟误删除。
mysql> delete from test.test;
Query OK, 10 rows affected (0.00 sec)
mysql> select * from test.test;
Empty set (0.00 sec)
2、当我们发现误删除时,首先清理表空间,当重复清理时会出现warning。
mysql> alter table 库.表 discard tablespace;
mysql> alter table test.test discard tablespace;
Query OK, 0 rows affected (0.01 sec)
mysql> alter table test.test discard tablespace;
Query OK, 0 rows affected, 1 warning (0.00 sec)
3、将准备好的备份文件中的表文件拷贝回数据库目录中对应的库目录,并修改所属主、组。
[root@localhost allbak]# cp ./allbak/test/test.ibd /data/mysql/mysqldata/test/
[root@localhost allbak]# chown -R mysql.mysql /data/mysql/mysqldata/*
注意:此处在准备恢复时可加选项--export,使用后准备恢复数据的对用库目录中会出现 “表.cfg” 类型的文件,拷贝文件时可将其一同拷贝到数据库目录下,虽然我现在还不知道有啥用,在我没有使用时恢复数据也成功了,官方有解释为“MySQL使用.cfg
包含特殊格式的InnoDB字典转储的文件。此格式是从不同的.exp`
,其在所使用的一个XtraDB用于相同的目的。严格来说,.cfg`
将表空间导入MySQL 8.0 或Percona Server for MySQL 8.0不需要文件。即使来自另一台服务器的表空间也将成功导入,但如果相应的文件存在于同一目录中,InnoDB将进行模式验证 .cfg
。” 待恢复后将其cfg文件删除即可。
直接使用完全备份恢复单张表时在准备时直接--export,使用增量备份时应该先准备完成,准备完成后再加--exprot选项进行一次准备。
[root@localhost allbak]# xtrabackup --prepare --export --target-dir=./allbak
[root@localhost allbak]# ls allbak/test
test2.cfg test2.ibd test.cfg test.ibd
又进行了一下测试,好像不适用--export会出现警告如下
不使用--export,出现warning字样:
mysql> alter table test.test2 import tablespace;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> alter table test.test import tablespace;
Query OK, 0 rows affected, 1 warning (0.01 sec)
使用 --export:
mysql> alter table test.test2 import tablespace;
Query OK, 0 rows affected (0.02 sec)
mysql> alter table test.test import tablespace;
Query OK, 0 rows affected (0.01 sec)
mysql> alter table test2.test import tablespace;
Query OK, 0 rows affected (0.02 sec)
虽然数据都照样恢复了,但由于是搭建的虚拟机进行测试,不知道其他地方会不会出错,进行单张表或者单个库恢复的时候还是加上--export选项为好。
4、导入表空间,并查看
mysql> alter table 库.表 import tablespace;
mysql> alter table test.test import tablespace;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> select * from test.test;
+------+-------+
| id | name |
+------+-------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
| 7 | D |
| 7 | W |
| 7 | W |
| 7 | T |
+------+-------+
10 rows in set (0.00 sec)
5、当某个库、表被删除时(不是内容),应该先创建库、表,库名、表名、表结构应该和被删除的表相同,然后再进行单张表恢复,本次只展示删除表后进行恢复)
(1)、模拟删除表
mysql> drop table test.test;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table test.test2;
Query OK, 0 rows affected (0.00 sec)
(2)、创建表,表名和结构与原来相同
mysql> create table test.test(id int(10),name varchar(15));
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> alter table test.test2 discard tablespace;
Query OK, 0 rows affected (0.00 sec)
(3)、清理表空间
mysql> alter table test.test2 discard tablespace;
Query OK, 0 rows affected (0.00 sec)
mysql> alter table test.test discard tablespace;
Query OK, 0 rows affected (0.00 sec)
(4)、将准备好的备份文件中的表文件拷贝回数据库目录中对应的库目录,并修改所属主、组。
[root@localhost allbak]# cp ./allbak/test/* /data/mysql/mysqldata/test/
[root@localhost allbak]# chown -R mysql.mysql /data/mysql/mysqldata/*
(5)、导入表空间,并查看
mysql> alter table test.test2 import tablespace;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> alter table test.test import tablespace;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> select * from test2;
+------+------+
| id | name |
+------+------+
| 1 | wang |
| 2 | meng |
| 3 | qin |
| 4 | L |
| 5 | S |
| 6 | H |
| 7 | D |
| 8 | W |
| 9 | J |
+------+------+
9 rows in set (0.00 sec)
mysql> select * from test;
+------+-------+
| id | name |
+------+-------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
| 7 | D |
| 7 | W |
| 7 | W |
| 7 | T |
+------+-------+
10 rows in set (0.00 sec)
五、备份单个,多个指定的库
1、备份
xtrabackup --backup -uroot -p --databases='库 库.表 ...' --target-dir=备份保存路径
例:
[root@localhost allbak]# xtrabackup --backup -uroot -p --databases=test --target-dir=/allbak/test
[root@localhost allbak]# ls /allbak/test/
backup-my.cnf ibdata1 undo_002 xtrabackup_logfile
binlog.000037 mysql.ibd xtrabackup_binlog_info xtrabackup_tablespaces
binlog.index test xtrabackup_checkpoints
ib_buffer_pool undo_001 xtrabackup_info
[root@localhost allbak]# xtrabackup --backup -uroot -p --databases='test test2.test' --target-dir=/allbak/bufen
[root@localhost allbak]# ls bufen
backup-my.cnf ibdata1 undo_001 xtrabackup_info
binlog.000039 mysql.ibd undo_002 xtrabackup_logfile
binlog.index test xtrabackup_binlog_info xtrabackup_tablespaces
ib_buffer_pool test2 xtrabackup_checkpoints
[root@localhost allbak]# ls bufen/test
test2.ibd test.ibd
[root@localhost allbak]# ls bufen/test2
test.ibd
2、恢复
恢复时按照第四项---恢复单张表或单个库进行数据恢复
六、关于压缩备份和恢复
1、压缩备份
压缩备份与上面的备份相差无几,只需要添加选项--compress即可
向数据库插入数据并压缩备份
首先进行全备:
[root@localhost allbak_ys]# xtrabackup --backup --compress -uroot -p --target-dir=/allbak/allbak_ys/allbak
插入数据:
mysql> insert into test.test value(12,'盼望你没有为我又再度暗中淌泪');
mysql> insert into test.test value(13,'我不想留底');
mysql> insert into test.test value(14,'你的心空虚');
第一次增量备份:
[root@localhost allbak_ys]# xtrabackup --backup --compress -uroot -p --target-dir=/allbak/allbak_ys/allbak_1 --incremental-basedir=/allbak/allbak_ys/allbak
再次插入数据:
mysql> insert into test.test value(15,'多少春秋风雨改');
mysql> insert into test.test value(16,'多少崎岖不变爱');
mysql> insert into test.test value(16,'多少唏嘘的你在人海');
第二次增量备份:
[root@localhost allbak_ys]# xtrabackup --backup --compress -uroot -p --target-dir=/allbak/allbak_ys/allbak_2 --incremental-basedir=/allbak/allbak_ys/allbak_1
如果需要加快压缩速度,可添加选项 --parallel
=值(默认为1),--compress-threads
=值(默认为1)
例:
创建 4 个 I/O 线程,这些线程将读取数据并将其通过管道传输到 2 个压缩线程。
[root@localhost allbak_ys]# xtrabackup --backup --parallel=4 --compress --compress-threads=2 -uroot -p --target-dir=/allbak/allbak_ys/allbak
2、恢复
(1)、解压压缩备份
在准备备份之前,您需要解压缩所有文件。解压文件需要使用到解压工具qpress,若没有安装可使用yum进行安装
[root@localhost allbak_ys]# yum -y install qpress
解压压缩备份(--parallel=4是为了加快解压速度,不写默认为1,可加入--remove-original选项,
删除解密和解压后的原压缩文件,后续的单个表的恢复会用到):
[root@localhost allbak_ys]# xtrabackup --decompress --parallel=4 --target-dir='./allbak'
[root@localhost allbak_ys]# xtrabackup --decompress --parallel=4 --target-dir='./allbak_1'
[root@localhost allbak_ys]# xtrabackup --decompress --parallel=4 --target-dir='./allbak_2'
(2)、准备还原
解压后还的步骤与其他的备份还原相同,例如增量备份还原:
[root@localhost allbak_ys]# xtrabackup --prepare --apply-log-only --target-dir=./allbak
[root@localhost allbak_ys]# xtrabackup --prepare --apply-log-only --target-dir=./allbak --incremental-dir=./allbak_1
[root@localhost allbak_ys]# xtrabackup --prepare --apply-log-only --target-dir=./allbak --incremental-dir=./allbak_2
(3)、删除数据库目录,进行还原,并查看是否恢复成功。
[root@localhost allbak_ys]# systemctl stop mysqld
[root@localhost allbak_ys]# rm -rf /data/mysql/mysqldata/*
[root@localhost allbak_ys]# xtrabackup --copy-back --target-dir=./allbak
[root@localhost allbak_ys]# chown -R mysql.mysql /data/mysql/mysqldata/*
[root@localhost allbak_ys]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> select * from test.test;
+------+--------------------------------------+
| id | name |
+------+--------------------------------------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
| 7 | D |
| 7 | W |
| 7 | W |
| 7 | T |
| 10 | Q |
| 11 | R |
| 12 | 盼望你没有为我又再度暗中淌泪 |
| 13 | 我不想留底 |
| 14 | 你的心空虚 |
| 15 | 多少春秋风雨改 |
| 16 | 多少崎岖不变爱 |
| 17 | 多少唏嘘的你在人海 |
+------+--------------------------------------+
18 rows in set (0.01 sec)
3、对单个表的压缩备份和恢复
(1)、向表中插入数据并压缩备份
首先进行对单个表的全压缩备份:
[root@localhost mysql]# xtrabackup --backup --compress -uroot -p --databases=test --target-dir=./test_all_0
插入数据:
mysql> insert into test.test value(18,'狼烟起,江山北望');
Query OK, 1 row affected (0.01 sec)
第一次增量备份:
[root@localhost mysql]# xtrabackup --backup --compress -uroot -p --databases=test --target-dir=./test_all_1 --increment-basedir=./test_all_0
再次插入数据:
mysql> insert into test.test value(19,'龙起卷,马长嘶,剑气如霜');
Query OK, 1 row affected (0.00 sec)
第二次增量备份:
[root@localhost mysql]# xtrabackup --backup --compress -uroot -p --databases=test --target-dir=./test_all_2 --increment-basedir=./test_all_1
(2)、解压(加入--remove-original选项,
删除解密和解压后的原压缩文件)
未解压时test文件中的内容:
[root@localhost mysql]# ls test_all_0/test/
test2.ibd.qp test.ibd.qp
解压,解压后备份文件库中以.qp结尾的压缩文件将自动删除:
[root@localhost mysql]# xtrabackup --decompress --remove-original --target-dir=./test_all_0
[root@localhost mysql]# xtrabackup --decompress --remove-original --target-dir=./test_all_1
[root@localhost mysql]# xtrabackup --decompress --remove-original --target-dir=./test_all_2
解压后test中的内容:
[root@localhost mysql]# ls test_all_1/test/
test2.ibd test.ibd
(3)、准备恢复
[root@localhost mysql]# xtrabackup --prepare --apply-log-only --target-dir=./test_all_0
[root@localhost mysql]# xtrabackup --prepare --apply-log-only --target-dir=./test_all_0 --incremental-dir=./test_all_1
[root@localhost mysql]# xtrabackup --prepare --apply-log-only --target-dir=./test_all_0 --incremental-dir=./test_all_2
(4)、恢复
清理要恢复的表空间:
mysql> alter table test.tset discard tablespace;
拷贝主备号的表文件到数据库对应的库目录,并修改所属主、组:
[root@localhost mysql]# cp -r ./test_all_0/test/test.ibd /data/mysql/mysqldata/test/
[root@localhost mysql]# chown -R mysql.mysql /data/mysql
导入恢复的表空间,由于准备时没有使用--export选项,导致出现warning字样:
mysql> alter table test.test import tablespace;
Query OK, 0 rows affected, 1 warning (0.02 sec)
查看是否恢复:
mysql> select * from test.test;
+------+--------------------------------------+
| id | name |
+------+--------------------------------------+
| 1 | dai |
| 2 | wen |
| 3 | jiang |
| 2 | yao |
| 4 | xy |
| 5 | dwj |
| 7 | D |
| 7 | W |
| 7 | W |
| 7 | T |
| 10 | Q |
| 11 | R |
| 12 | 盼望你没有为我又再度暗中淌泪 |
| 13 | 我不想留底 |
| 14 | 你的心空虚 |
| 15 | 多少春秋风雨改 |
| 16 | 多少崎岖不变爱 |
| 17 | 多少唏嘘的你在人海 |
| 18 | 狼烟起,江山北望 |
| 19 | 龙起卷,马长嘶,剑气如霜 |
+------+--------------------------------------+
七、参考文献
percona官方文档:
percona-xtrabackup-8.0文档:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
增量备份:https://www.percona.com/doc/percona-xtrabackup/LATEST/backup_scenarios/incremental_backup.html
压缩备份:https://www.percona.com/doc/percona-xtrabackup/LATEST/backup_scenarios/compressed_backup.html