一、Xtrabackup介绍
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe
Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
二、Xtrabackup优点
(1)备份速度快,物理备份可靠
(2)备份过程不会打断正在执行的事务(无需锁表)
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动备份校验
(5)还原速度快
(6)可以流传将备份传输到另外一台机器上
(7)在不增加服务器负载的情况备份数据
三、Xtrabackup备份原理
四、xtrabackup的安装部署以及备份恢复实现
1、xtrabackup的安装
[root@leanote ~]# yum install -y percona-xtrabackup-80-8.0.26-18.1.el8.x86_64.rpm
上次元数据过期检查:0:09:07 前,执行于 2021年09月16日 星期四 08时16分17秒。
依赖关系解决。
=====================================================================================================================================================================================
软件包 架构 版本 仓库 大小
=====================================================================================================================================================================================
安装:
percona-xtrabackup-80 x86_64 8.0.26-18.1.el8 @commandline 14 M
安装依赖关系:
libev x86_64 4.24-6.el8 appstream 52 k
mariadb-connector-c x86_64 3.1.11-2.el8_3 appstream 200 k
perl-DBD-MySQL x86_64 4.046-3.module_el8.1.0+203+e45423dc appstream 156 k
启用模块流:
perl-DBD-MySQL 4.046
事务概要
=====================================================================================================================================================================================
安装 4 软件包
总计:15 M
总下载:409 k
安装大小:63 M
下载软件包:
(1/3): libev-4.24-6.el8.x86_64.rpm 455 kB/s | 52 kB 00:00
(2/3): perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64.rpm 915 kB/s | 156 kB 00:00
(3/3): mariadb-connector-c-3.1.11-2.el8_3.x86_64.rpm 884 kB/s | 200 kB 00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总计 1.7 MB/s | 409 kB 00:00
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
准备中 : 1/1
安装 : mariadb-connector-c-3.1.11-2.el8_3.x86_64 1/4
安装 : perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64 2/4
安装 : libev-4.24-6.el8.x86_64 3/4
安装 : percona-xtrabackup-80-8.0.26-18.1.el8.x86_64 4/4
运行脚本: percona-xtrabackup-80-8.0.26-18.1.el8.x86_64 4/4
验证 : libev-4.24-6.el8.x86_64 1/4
验证 : mariadb-connector-c-3.1.11-2.el8_3.x86_64 2/4
验证 : perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64 3/4
验证 : percona-xtrabackup-80-8.0.26-18.1.el8.x86_64 4/4
Installed products updated.
已安装:
libev-4.24-6.el8.x86_64 mariadb-connector-c-3.1.11-2.el8_3.x86_64 percona-xtrabackup-80-8.0.26-18.1.el8.x86_64 perl-DBD-MySQL-4.046-3.module_el8.1.0+203+e45423dc.x86_64
2、xtrabackup全量备份与恢复
备份前
mysql> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | lisi | 19 |
| 1 | wanger | 20 |
+----+----------+-----+
3 rows in set (0.00 sec)
备份
xtrabackup --backup -u用户名 -p --target-dir=保存路径
xtrabackup --backup -uroot -p'!QAZ2wsx' --target-dir=/databakup
删除部分数据
mysql> delete from table1 where name=lisi;
ERROR 1054 (42S22): Unknown column 'lisi' in 'where clause'
mysql> delete from table1 where name='lisi';
Query OK, 1 row affected (0.00 sec)
mysql> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | wanger | 20 |
+----+----------+-----+
2 rows in set (0.00 sec)
准备恢复
xtrabackup --prepare --target-dir=备份保存路径
xtrabackup --prepare --target-dir=/databakup
恢复
xtrabackup --copy-back --target-dir=备份保存路径
xtrabackup --copy-back --target-dir=/databakup
chown mysql.mysql -Rf /var/lib/mysql
systemctl restart mysqld
恢复后
mysql> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | lisi | 19 |
| 1 | wanger | 20 |
+----+----------+-----+
3 rows in set (0.01 sec)
3、xtrabackup增量备份与恢复
备份前
Database changed
mysql> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | lisi | 19 |
| 1 | wanger | 20 |
+----+----------+-----+
3 rows in set (0.00 sec)
进行全量备份
xtrabackup --backup -u用户名 -p --target-dir=保存路径
xtrabackup --backup -uroot -p'!QAZ2wsx' --target-dir=/backup/mysql
向表中插入数据
mysql> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | lisi | 19 |
| 1 | wanger | 20 |
| 1 | abc | 19 |
| 1 | 123 | 19 |
+----+----------+-----+
5 rows in set (0.00 sec)
进行第一次增量备份
xtrabackup --backup -u用户 -p --target-dir=增量备份保存路径 --incremental-basedir=全备份所在路径
xtrabackup --backup -uroot -p'!QAZ2wsx' --target-dir=/backup/mysql_1 --incremental-basedir=/backup/mysql
再次向数据库中插入数据
mysql> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | lisi | 19 |
| 1 | wanger | 20 |
| 1 | abc | 19 |
| 1 | 123 | 19 |
| 1 | 456 | 20 |
| 1 | bbc | 20 |
+----+----------+-----+
7 rows in set (0.00 sec)
进行第二次或第N次增量备份
xtrabackup --backup -uroot -p --target-dir=第二次增量备份保存位置 --incremental-basedir=上一次增量备份保存位置
xtrabackup --backup -uroot -p'!QAZ2wsx' --target-dir=/backup/mysql_2 --incremental-basedir=/backup/mysql_1
删除数据库,模拟数据丢失,进行备份恢复
删除数据库目录
rm -rf /var/lib/mysql
准备恢复
准备基本备份,注意--apply-log-only防止回滚选项,如果您不使用 防止回滚阶段的选项,那么您的增量备份将毫无用处。事务回滚后,无法应用进一步的增量备份(完全备份)
xtrabackup --prepare --apply-log-only --target-dir=完全备份路径
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql
将第一个或第N个增量备份合并到完全备份(请按照备份顺序依次合并)
xtrabackup --prepare --apply-log-only --target-dir=准备好的完全备份路径 --incremental-dir=增量备份路径
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql --incremental-dir=/backup/mysql_1
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql --incremental-dir=/backup/mysql_2
恢复数据库
xtrabackup --copy-back --target-dir=合并后的全备路径
xtrabackup --copy-back --target-dir=/backup/mysql
修改数据库目录下文件的所属
chown -Rf mysql.mysql /var/lib/mysql
配置selinux
chcon -R -t mysqld_db_t -u system_u -r object_r /var/lib/mysql
重启mysql数据库
systemctl restart mysqld
登录数据库验证恢复是否成功
[root@leanote ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 Source distribution
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test_db;
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> select * from table1;
+----+----------+-----+
| id | name | age |
+----+----------+-----+
| 1 | zhangsan | 18 |
| 1 | lisi | 19 |
| 1 | wanger | 20 |
| 1 | abc | 19 |
| 1 | 123 | 19 |
| 1 | 456 | 20 |
| 1 | bbc | 20 |
+----+----------+-----+
7 rows in set (0.00 sec)
4、恢复过程出现的问题
Failed to set datadir to '/var/lib/mysql/' (OS errno: 13 - Permission denied)
解决方法
chown mysql.mysql -Rf /var/lib/mysql
SELinux is preventing /usr/libexec/mysqld from 'read, write' accesses on the file binlog.index. For complete SELinux messages run: sealert -l 04713886-12a4-4cff-bcb2-5d5ab623ff0f
解决方法
chcon -R -t mysqld_db_t -u system_u -r object_r /var/lib/mysql