使用Xtrabackup工具进行MySQL数据备份入门

343 阅读5分钟

Xtrabackup使用文档

使用环境

  • 系统版本:基于腾讯云的Ubuntu18.04
  • MySQL版本:基于docker的mysql8.0.29
  • Docker中MySQL目录与主机映射:
    • 宿主机 ---> Docker的MySQL目录
    • /opt/containerd/mysql/etc/conf/ -> /etc/mysql/conf.d
    • /opt/containerd/mysql//var/lib/mysql -> /var/lib/mysql
    • /opt/containerd/mysql//var/lib/mysql-files -> /var/lib/mysql-files
  • MySQL的my.cnf配置文件信息
    [mysqld]
    datadir=/var/lib/mysql/data
    basedir=/var/lib/mysql
    

Xtrabackup安装

参考链接:www.jianshu.com/p/e2d1231bd…

  • 下载安装包:
    由于我操作系统是Ubuntu18.04,故执行命令:wget https://repo.percona.com/apt/percona-release_latest.bionic_all.deb
  • 安装:dpkg -i percona-release_latest.bionic_all.deb
  • 执行更新:apt-get update
  • 查看软件包名称:apt-cache search xtrabackup
  • 安装对应MySQL8的包:apt-get install percona-xtrabackup-80

Xtrabackup备份与还原

  • 前置准备工作:准备一个以.cnf后缀的文件内容如下(此处我命名为my1.cnf,在/opt/dev目录下):
[mysqld]
datadir=/opt/containerd/mysql/var/lib/mysql/data
log-bin=/opt/containerd/mysql/var/lib/mysql/data/binlog
log-bin-index=/opt/containerd/mysql/var/lib/mysql/data/binlog.index

image.png

  • 新建备份目录,此处我建立的目录为:/opt/data/mysql_data_bak/full_bak,此目录用于存储备份文件。

全量备份与全量恢复

全量备份

  1. 首先在MySQL下新建数据库test1,并在库中新建表T1,然后添加数据如下: image.png
  2. 开始全量备份,命令为:
xtrabackup --defaults-file=/opt/dev/my1.cnf \
--backup \
--datadir=/opt/containerd/mysql/var/lib/mysql/data \
--host=127.0.0.1 \
--user=root \
--password=123456 \
--port=3306 \
--target-dir=/opt/data/mysql_data_bak/full_bak/
###############################################################
其中:
--defaults-file为我们前期准备工作中准备的cnf文件
--target-dir为存储备份文件目录

执行成功后如下图: image.png 此时,可以看到备份文件目录下的文件如下图: image.png

全量恢复

  1. 清空MySQL的数据目录: image.png
  2. 执行prepare命令 xtrabackup --prepare --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/,执行成功后如下图: image.png
  3. 执行copy-back命令:xtrabackup --copy-back --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/,执行成功后如下图: image.png
  4. 重启MySQL服务,由于我是基于Docker安装的,所以只需要重启Mysql对应Docker容器即可,此时可以看到数据已经恢复: image.png

增量备份与增量恢复

  • 在前面全量备份的基础上,此时进行增量备份,此时我在前面全量备份目录full_bak平级新建了incr_bak1incr_bak2incr_bak3三个目录,如下图: image.png

开始增量备份

  1. 在全量备份数据的基础上新增一条数据,如下图: image.png
  2. 基于当前数据做一次全量备份:xtrabackup --defaults-file=/opt/dev/my1.cnf --backup --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/
  3. 再增加一条数据,然后做第一次增量备份:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --backup --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/incre_bak1/ --incremental-basedir=/opt/data/mysql_data_bak/full_bak/,如下两图所示: image.png image.png
  4. 再增加一条数据,然后基于上一次数据做增量备份:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --backup --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/incre_bak2/ --incremental-basedir=/opt/data/mysql_data_bak/incre_bak1/,结果如下图: image.png

增量恢复

这里我们做3个实验,分别是:只恢复全量备份的文件、恢复全量备份+第一次增量备份、恢复全量备份+第一次增量+第二次增量

只恢复全量备份
  1. 清空mysql存放data的目录:rm -rf /opt/containerd/mysql/var/lib/mysql/data/*
  2. 执行prepare:xtrabackup --prepare --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/
  3. 执行copy-back:xtrabackup --copy-back --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/
  4. 重启mysql,最后结果如下图 image.png
恢复全量备份+第一次增量备份
  1. 清空mysql存放data的目录:rm -rf /opt/containerd/mysql/var/lib/mysql/data/*
  2. 合并全量备份:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --apply-log-only --target-dir=/opt/data/mysql_data_bak/full_bak/
  3. 合并第一次增量备份到全量备份里:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --target-dir=/opt/data/mysql_data_bak/full_bak/ --incremental-dir=/opt/data/mysql_data_bak/incre_bak1/
  4. 提交合并:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --copy-back --target-dir=/opt/data/mysql_data_bak/full_bak/
  5. 重启MySQL,最后结果如下图: image.png
恢复全量备份+第一次增量+第二次增量
  1. 清空mysql存放data的目录:rm -rf /opt/containerd/mysql/var/lib/mysql/data/*
  2. 合并全量备份:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --apply-log-only --target-dir=/opt/data/mysql_data_bak/full_bak/
  3. 合并第一次增量备份到全量备份里:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --apply-log-only --target-dir=/opt/data/mysql_data_bak/full_bak/ --incremental-dir=/opt/data/mysql_data_bak/incre_bak1/
  4. 合并第二次增量备份到全量备份里:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --target-dir=/opt/data/mysql_data_bak/full_bak/ --incremental-dir=/opt/data/mysql_data_bak/incre_bak2/
  5. 提交合并:xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --copy-back --target-dir=/opt/data/mysql_data_bak/full_bak/
  6. 重启MySQL,最后结果如下图: image.png

流式备份与恢复

  1. 流式备份:执行命令xtrabackup --defaults-file=/opt/dev/my1.cnf --backup --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=96468223 --port=3306 --stream=xbstream --target-dir /opt/data/mysql_data_bak/full_bak/ >/opt/data/mysql_data_bak/full_bak/all_1.xbstream即可,此时会看到目录下有all_1.xbstream文件,如下图所示: image.png
  2. 流式恢复:
    • 首先进行解压:切换到存放压缩文件的目录(本教程是切换到/opt/data/mysql_data_bak/full_bak),执行命令xbstream -x < all_1.xbstream,此时可以看到该目录下有已经解压出来的文件了,如下图: image.png
    • 恢复:
      1. 清空mysql存放data的目录:rm -rf /opt/containerd/mysql/var/lib/mysql/data/*
      2. 执行prepare:xtrabackup --prepare --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/
      3. 执行copy-back:xtrabackup --copy-back --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/
      4. 重启MySQL。