返回 导航

其他

hangge.com

MySQL - 数据库备份与恢复教程2(使用Xtrabackup)

作者:hangge | 2020-12-18 08:10
    日常工作中,我们常常需要对 MySQL 数据库进行备份,常用的备份工具有 mysqldumpmysqlhotcopyxtrabackup 等。这些工具的备份原理和备份方式都各不相同:
  • MySQL 自带的 mysqldump 属于逻辑备份工具(备份出来的是 SQL 格式的转储文件),mysqldump 比较适用于小的数据库,因为是逻辑备份,所以备份和恢复耗时都比较长。也不能实现增量备份。
  • mysqlhotcopy xtrabackup 是物理备份(备份出来的是数据文件的二进制副本),备份和恢复速度快,不影响数据库服务情况下进行热拷贝(其中 mysqlhotcopy 只适用于 MyISAM 引擎的表,而 xtrabackup 只能备份 innoDB xtraDB 两种数据引擎的表)。并且 xtrabackup 还支持增量备份。
   前文中我介绍了如何使用 mysqldump 进行数据库的备份(点击查看),本文接着介绍如何使用 Xtrabackup 进行数据库的备份和恢复。

二、使用 Xtrabackup 备份数据库

1,基本介绍

(1)Xtrabackup Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQLPercona server MariaDB,开源免费,是目前较为受欢迎的主流备份工具。由于其支持增量备份,在实际生产环境中是非常实用的。
注意Xtrabackup 只能备份 innoDB xtraDB 两种数据引擎的表,而不能备份 MyISAM 数据表。

(2)Xtrabackup 版本:
提示XtraBackup 8.0 版本与 2.4 版本的语法稍有些差异,本文以 2.4 版本为例。

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

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
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)下面命令备份时会直接将备份文件打成一个压缩包,压缩包以“年月日”形式命名:
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)

回到顶部