MENU

利用Xtrabackup对MySQL8.4 全量备份

May 23, 2025 • Read: 55 • 技术杂谈

说到MySQL备份大家肯定立马就能想到mysqldump,简单好用,但如果数据比较大,或者备份内容里面包含特殊字符例如emoji符号,导出的结果是SQL文件,这个时候如果恢复回去,可能emoji符号就会变成双问好??

一方面考虑到热备是必要条件,并且尽量保证速度、数据完整性等情况,我尝试使用xtrabackup备份;由于我的需求只需考虑到全量备份,所以本篇文章不考虑增量备份,并且很多常识不会进行过度解释。

前置条件

我希望备份的同时尽量不会破坏服务器环境,所以无论MySQL还是Xtrabackup我都采用Docker方式进行操作。

我的MySQL部署方式:

docker volume create mysql8.4.4
docker run -d --restart=unless-stopped \
  --name mysql8.4.4 \
  -p 127.0.0.1:3306:3306 \
  -v mysql8.4.4:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123234zxc \
mysql:8.4.4 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

备份命令

docker volume create xtrabackup
docker run --name pxb \
  --rm \
  -v xtrabackup:/backup \
  -v mysql8.4.4:/var/lib/mysql \
  -it \
  --user root \
  percona/percona-xtrabackup:8.4 \
  /bin/bash -c "
    TS=\$(date +%s)
    xtrabackup --backup \
        --datadir=/var/lib/mysql/ \
        --target-dir=/backup \
        --user=root \
        --password=123234zxc \
        --host=127.0.0.1 \
        --port=3306 \
        --stream=xbstream | gzip > /backup/bak-\$(date +%Y%m%d_%H%M%S).xb.gz
  "

如果备份完成,最后输出行会提示 [Xtrabackup] completed OK!相关字符,并且会产生bak-***.xb.gz文件。

恢复流程

数据准备

  1. 按照本文前置条件命令启动一个相同的全新MySQL容器,随后立马停止掉;再进入其对应的mysql8.4.4 volume 实际路径,删除里面所有内容。
  2. 将准备恢复的***.xb.gz文件传到xtrabackup volume 实际对应路径。

启动 XtraBackup

docker run --rm -it \
  -v xtrabackup:/backup \
  -v mysql8.4.4:/var/lib/mysql \
  --user root \
  percona/percona-xtrabackup:8.4 \
  /bin/bash

执行之后进入到bash环境,切到/backup应该能看到你的***.xb.gz文件,随后执行

mkdir restore
gzip -dc ***.xb.gz | xbstream -x -C /backup/restore
xtrabackup --prepare --target-dir=/backup/restore

随后在/backup/restore目录便能看到对应的MySQL数据结构。

数据拷贝

xtrabackup --copy-back --target-dir=/backup/restore --datadir=/var/lib/mysql/

# 矫正数据权限
chown -R mysql:mysql /var/lib/mysql 

确保一切执行正常。

重启恢复

退出上一步的bash环境之后,直接尝试重启你的MySQL容器,随后连接数据库查看数据是否恢复正常。

参考

Last Modified: May 27, 2025