说到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
文件。
恢复流程
数据准备
- 按照本文前置条件命令启动一个相同的全新MySQL容器,随后立马停止掉;再进入其对应的
mysql8.4.4
volume 实际路径,删除里面所有内容。 - 将准备恢复的
***.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容器,随后连接数据库查看数据是否恢复正常。