MySQL - 数据库备份与恢复教程2(使用Xtrabackup)
作者:hangge | 2020-12-18 08:10
日常工作中,我们常常需要对 MySQL 数据库进行备份,常用的备份工具有 mysqldump、mysqlhotcopy、xtrabackup 等。这些工具的备份原理和备份方式都各不相同:
(3)Xtrabackup 优点:
(2)接着执行如下命令安装 Percona yum 存储库:
(3)因为我们需要将 XtraBackup 与 MySQL 结合使用,还需要执行如下命令开启 tools 存储库:
(4)如果我们使用的是 MySQL 8.0,则执行如下命令安装 XtraBackup 8.0 版本:
(5)安装后执行如下命令查看到版本信息则说明安装成功:
(2)可以看到备份后的位置是 /var/local/baks/2020-11-26_18-13-05:
(2)再次往往数据库插入一些数据,然后执行如下命令在之前增量备份 1 的基础上进行增量备份 2:
(2)如果压缩包文件名有冒号(:)这样的特殊符号,会造成解压失败,我们可以使用 tar 命令的 --force-local 选项:
- MySQL 自带的 mysqldump 属于逻辑备份工具(备份出来的是 SQL 格式的转储文件),mysqldump 比较适用于小的数据库,因为是逻辑备份,所以备份和恢复耗时都比较长。也不能实现增量备份。
- mysqlhotcopy 和 xtrabackup 是物理备份(备份出来的是数据文件的二进制副本),备份和恢复速度快,不影响数据库服务情况下进行热拷贝(其中 mysqlhotcopy 只适用于 MyISAM 引擎的表,而 xtrabackup 只能备份 innoDB 和 xtraDB 两种数据引擎的表)。并且 xtrabackup 还支持增量备份。
二、使用 Xtrabackup 备份数据库
1,基本介绍
(1)Xtrabackup 是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQL、Percona server 和 MariaDB,开源免费,是目前较为受欢迎的主流备份工具。由于其支持增量备份,在实际生产环境中是非常实用的。
注意:Xtrabackup 只能备份 innoDB 和 xtraDB 两种数据引擎的表,而不能备份 MyISAM 数据表。
(2)Xtrabackup 版本:
- XtraBackup 8.0 版本:适用于 MySQL 8.0
- XtraBackup 2.4 版本:适用于 MySQL 5.6 和 5.7
提示:XtraBackup 8.0 版本与 2.4 版本的语法稍有些差异,本文以 2.4 版本为例。
- 备份速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
2,安装步骤
(1)这里演示如何在 CentOS 下安装 Xtrabackup 8.0 版本。首先依次执行如下命令搭建网络 yum 源:
cd /etc/yum.repos.d/ rm -rf * wget http://mirrors.163.com/.help/CentOS7-Base-163.repo yum clean all yum makecache
(2)接着执行如下命令安装 Percona yum 存储库:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
(3)因为我们需要将 XtraBackup 与 MySQL 结合使用,还需要执行如下命令开启 tools 存储库:
percona-release enable-only tools release
(4)如果我们使用的是 MySQL 8.0,则执行如下命令安装 XtraBackup 8.0 版本:
yum install percona-xtrabackup-80
- 如果使用的是 MySQL 5.6 和 5.7,则执行如下命令安装 XtraBackup 2.4 版本:
yum install percona-xtrabackup-24
(5)安装后执行如下命令查看到版本信息则说明安装成功:
xtrabackup -version
3,全量备份
(1)本文我们执行如下命令进行一个完整备份:
innobackupex --user=root --password=Hangge_123 /var/local/baks
(2)可以看到备份后的位置是 /var/local/baks/2020-11-26_18-13-05:
4,增量备份
(1)当做完全量备份后,我们往数据库插入一些数据,然后执行如下命令在之前备份的基础上进行增量备份 1:
注意:需要使用 --incremental-basedir 参数指定上次完整备份目录。
innobackupex --user=root --password=Hangge_123 --incremental /var/local/baks --incremental-basedir=/var/local/baks/2020-11-26_18-13-05
(2)再次往往数据库插入一些数据,然后执行如下命令在之前增量备份 1 的基础上进行增量备份 2:
注意:需要使用 --incremental-basedir 参数指定上次增量备份目录。
innobackupex --user=root --password=Hangge_123 --incremental /var/local/baks --incremental-basedir=/var/local/baks/2020-11-26_18-35-48
5,压缩备份
(1)下面命令备份时会直接将备份文件打成一个压缩包,压缩包以“年月日”形式命名:
(2)下面命令将备份文件命名为“年月日时分秒”形式:
(2)接着执行如下命令从一个完全备份中恢复数据库:
(3)如果恢复时报“Original data directory /var/lib/mysql is not empty!”错误,可以执行如下命令将该文件夹清空,然后在此执行上面命令恢复:
(4)恢复后执行如下命令重新赋权:
(5)最后启动 MySQL 服务即可:
(2)接着合并第一个增量备份:
(3)接着合并第二个增量备份(这时 2020-11-26_18-13-05 完整备份已经包含所有增量备份,可以通过查看 checkpoints 来核实):
(5)接着执行如下命令从完全备份中恢复数据库:
(6)如果恢复时报“Original data directory /var/lib/mysql is not empty!”错误,可以执行如下命令将该文件夹清空,然后在此执行上面命令恢复:
(7)恢复后执行如下命令重新赋权:
(8)最后启动 MySQL 服务即可:
innobackupex --user=root --password=Hangge_123 --stream=tar /var/local/baks |gzip >/var/local/baks/$(date +%F).tar.gz
(2)下面命令将备份文件命名为“年月日时分秒”形式:
innobackupex --user=root --password=Hangge_123 --stream=tar /var/local/baks |gzip >/var/local/baks/$(date +%F-%T).tar.gz
附:恢复数据库
1,从全量备份中恢复
(1)首先执行如下命令停止 MySQL 服务:
service mysqld stop
(2)接着执行如下命令从一个完全备份中恢复数据库:
innobackupex --defaults-file=/etc/my.cnf --copy-back /var/local/baks/2020-11-26_18-13-05
(3)如果恢复时报“Original data directory /var/lib/mysql is not empty!”错误,可以执行如下命令将该文件夹清空,然后在此执行上面命令恢复:
rm -rf /var/lib/mysql/*
(4)恢复后执行如下命令重新赋权:
chown -R mysql:mysql /var/lib/mysql
(5)最后启动 MySQL 服务即可:
service mysqld start
2,从增量备份中恢复
恢复原理:将增量备份 1、增量备份 2...合并到最初的完整备份上,然后将合并后的完整备份恢复到数据库中。
(1)首先执行如下命令预备最初的完整备份:
innobackupex --apply-log --redo-only /var/local/baks/2020-11-26_18-13-05
(2)接着合并第一个增量备份:
innobackupex --apply-log --redo-only /var/local/baks/2020-11-26_18-13-05 --incremental-dir=/var/local/baks/2020-11-26_18-35-48
(3)接着合并第二个增量备份(这时 2020-11-26_18-13-05 完整备份已经包含所有增量备份,可以通过查看 checkpoints 来核实):
innobackupex --apply-log --redo-only /var/local/baks/2020-11-26_18-13-05 --incremental-dir=/var/local/baks/2020-11-26_18-39-55
(4)接下来操作同上面“从全量备份中恢复”是一样的,首先执行如下命令停止 MySQL 服务:
service mysqld stop
(5)接着执行如下命令从完全备份中恢复数据库:
innobackupex --defaults-file=/etc/my.cnf --copy-back /var/local/baks/2020-11-26_18-13-05
(6)如果恢复时报“Original data directory /var/lib/mysql is not empty!”错误,可以执行如下命令将该文件夹清空,然后在此执行上面命令恢复:
rm -rf /var/lib/mysql/*
(7)恢复后执行如下命令重新赋权:
chown -R mysql:mysql /var/lib/mysql
(8)最后启动 MySQL 服务即可:
service mysqld start
3,从压缩包中恢复
(1)如果我们备份时自动打成压缩包的话,恢复时需要先对其解压(解压后保存目录必须先手动创建):tar -xizvf 2020-11-27.tar.gz -C /var/local/baks/2020-11-27
(2)如果压缩包文件名有冒号(:)这样的特殊符号,会造成解压失败,我们可以使用 tar 命令的 --force-local 选项:
tar --force-local -xizvf 2020-11-27-07:12:23.tar.gz -C /var/local/baks/2020-11-27-07:12:23
(3)接下来的恢复步骤就跟上面一样了。
全部评论(0)