Ubuntu 22.04 下利用 Percona XtraBackup 与 Cron 实现 MySQL 8 无人值守备份方案

张开发
2026/4/9 1:41:23 15 分钟阅读

分享文章

Ubuntu 22.04 下利用 Percona XtraBackup 与 Cron 实现 MySQL 8 无人值守备份方案
1. 为什么选择Percona XtraBackup做MySQL备份第一次接触数据库备份时我试过直接用mysqldump导出数据。直到某次生产环境恢复数据才发现这种逻辑备份方式在TB级数据库面前有多无力——整整8小时的恢复过程业务直接停摆。后来接触到Percona XtraBackup这个物理备份工具同样的数据量恢复时间缩短到40分钟从此成为我的首选方案。物理备份 vs 逻辑备份的核心差异就像搬家时的两种策略逻辑备份相当于把家具拆成零件再运输SQL语句导出而物理备份则是连房子整体搬迁直接复制数据文件。XtraBackup的优势主要体现在三个方面热备份不锁库备份期间数据库仍可读写这对24小时在线的电商系统简直是救命稻草增量备份省空间首次全量备份后后续只备份变化部分我的某个客户数据库每周节省了12TB存储恢复速度快如闪电直接替换数据文件的方式比逐条执行SQL语句快10倍以上实测在Ubuntu 22.04上配合MySQL 8使用时XtraBackup 8.0版本新增的页压缩功能能让备份文件体积再缩小60%。有次帮朋友恢复一个崩溃的数据库从插入U盘到服务重启只用了15分钟他看我的眼神就像看魔术师。2. 环境准备与工具安装2.1 系统环境检查在开始前建议先跑这几个命令确认基础环境# 查看系统版本 lsb_release -a # 检查MySQL版本 mysql --version # 确认磁盘空间备份需要至少2倍数据库大小的空间 df -h /var最近遇到个典型问题某位工程师在只有50GB剩余空间的机器上备份300GB的数据库脚本执行到一半因空间不足崩溃。建议专门挂载一块备份专用磁盘我通常这么做sudo mkfs.ext4 /dev/sdb1 sudo mkdir /backup_disk sudo mount /dev/sdb1 /backup_disk # 将挂载写入fstab实现开机自动挂载 echo /dev/sdb1 /backup_disk ext4 defaults 0 0 | sudo tee -a /etc/fstab2.2 安装Percona XtraBackup官方源的安装过程其实有个隐藏坑——默认安装的是最新版可能与你的MySQL小版本不兼容。我的做法是指定具体版本号sudo apt-get install percona-xtrabackup-808.0.35-31 -y验证安装时别只看版本号建议实际跑个测试备份sudo xtrabackup --backup --target-dir/tmp/test_backup --userroot --password$(cat /etc/mysql/root_password)如果看到类似completed OK!的输出说明工具链完全正常。遇到过最诡异的情况是能显示版本号但实际备份报错最后发现是libgcrypt库版本冲突。3. 备份账户与权限配置3.1 最小权限原则实践创建专用备份账户时很多教程给的权限都太大了。经过多次安全审计后我现在用的这套权限组合既能完成备份又符合安全规范CREATE USER backup_botlocalhost IDENTIFIED BY ComplexPssw0rd!2023; GRANT RELOAD, PROCESS, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO backup_botlocalhost;特别注意不要授予SUPER权限有次客户的备份账户被暴力破解攻击者因为没SUPER权限无法执行危险操作成功避免了数据泄露。密码策略建议包含长度至少16字符混合大小写字母数字特殊符号定期轮换可通过cron每月自动改密3.2 连接安全加固除了账户权限还有几个常被忽视的安全点在my.cnf中添加[mysqld] skip_name_resolveON local_infileOFF配置MySQL只监听内网IPsudo sed -i s/bind-address.*/bind-address 10.0.0.123/ /etc/mysql/mysql.conf.d/mysqld.cnf使用mysql_config_editor避免密码明文存储mysql_config_editor set --login-pathbackup --userbackup_bot --password4. 备份策略设计与实现4.1 全量增量备份方案纯每日全备太浪费空间我的推荐方案是每周日0点全量备份每天0点增量备份备份保留策略最近7天的每日备份最近4周的每周备份最近3月的每月备份对应的备份脚本应该包含这些核心功能#!/bin/bash BACKUP_BASE/backup_disk/mysql FULL_BACKUP_DIR$BACKUP_BASE/full_$(date %Y%m%d) INC_BACKUP_DIR$BACKUP_BASE/inc_$(date %Y%m%d) # 周日的特殊处理 if [ $(date %u) -eq 7 ]; then xtrabackup --backup --target-dir$FULL_BACKUP_DIR --login-pathbackup else LAST_FULL$(ls -td $BACKUP_BASE/full_* | head -1) xtrabackup --backup --target-dir$INC_BACKUP_DIR --incremental-basedir$LAST_FULL --login-pathbackup fi4.2 备份压缩与加密为节省空间我习惯用zstd压缩比gzip快3倍tar -I zstd -T0 -cf $BACKUP_DIR.tar.zst $BACKUP_DIR敏感数据建议加密备份这里演示用openssl加密openssl enc -aes-256-cbc -salt -in $BACKUP_DIR.tar.zst -out $BACKUP_DIR.tar.zst.enc -pass pass:YourStrongEncryptionKey5. 自动化与监控体系5.1 Cron高级用法别直接用crontab -e编辑我推荐的做法创建/etc/cron.d/mysql_backup文件写入如下内容# 每周日全备 0 0 * * 0 root /usr/local/bin/mysql_backup.sh full /var/log/mysql_backup.log 21 # 每日增备 0 0 * * 1-6 root /usr/local/bin/mysql_backup.sh incremental /var/log/mysql_backup.log 21 # 每月1号清理旧备份 0 2 1 * * root find /backup_disk/mysql -type f -mtime 90 -exec rm {} \;5.2 监控与告警备份失败却没人知道是最可怕的。我的监控方案包含日志分析脚本#!/bin/bash LOG_FILE/var/log/mysql_backup.log ERROR_MSG$(grep -i error\|failed\|exception $LOG_FILE | tail -n 1) if [ -n $ERROR_MSG ]; then echo Subject: MySQL Backup Alert | sendmail adminexample.com fiPrometheus监控指标导出from prometheus_client import Gauge backup_status Gauge(mysql_backup_status, Last backup status) backup_duration Gauge(mysql_backup_duration, Last backup duration in seconds)备份文件完整性检查xtrabackup --prepare --target-dir$BACKUP_DIR 21 | grep -q completed OK6. 恢复实战技巧6.1 全量恢复步骤去年处理过的最快恢复记录是18分钟还原800GB数据库关键步骤# 解压备份 tar -I zstd -xf full_backup_20230801.tar.zst # 预处理 xtrabackup --prepare --target-dir./full_backup_20230801 # 停止MySQL sudo systemctl stop mysql # 清空数据目录 sudo rm -rf /var/lib/mysql/* # 执行恢复 xtrabackup --copy-back --target-dir./full_backup_20230801 # 修正权限 sudo chown -R mysql:mysql /var/lib/mysql # 启动服务 sudo systemctl start mysql6.2 增量恢复要点增量恢复最容易踩的坑是准备顺序正确流程应该是准备基础全备xtrabackup --prepare --apply-log-only --target-dir./full_backup依次应用每个增量备份xtrabackup --prepare --apply-log-only --target-dir./full_backup --incremental-dir./inc_backup1最后执行常规preparextrabackup --prepare --target-dir./full_backup记得去年帮客户恢复数据时他们漏了--apply-log-only参数结果数据库启动后出现索引损坏。现在我的检查清单里一定会重点标注这个参数。7. 性能优化经验7.1 备份速度提升通过这几个参数我的备份时间缩短了65%xtrabackup --backup --parallel4 --compress-threads4 --use-memory2G --target-dir...各参数含义--parallel并行拷贝的线程数建议CPU核心数的50%--compress-threads压缩线程数--use-memory用于页合并的内存不超过空闲内存的70%7.2 网络备份优化当备份存储在网络位置时可以使用流式备份直接到远程xtrabackup --backup --streamxbstream | ssh backup01 xbstream -x -C /remote/backup或者结合nc实现高速传输# 接收端 nc -l 9999 | xbstream -x -C /remote/backup # 发送端 xtrabackup --backup --streamxbstream | nc backup01 99998. 灾备方案进阶生产环境我总会配置异地备份经典的三地策略本地磁盘保留7天备份快速恢复用同城机房保留1个月备份机房级故障恢复异地OSS保留1年备份区域级灾难恢复用rclone实现自动上传到云存储rclone copy /backup_disk/mysql remote:mysql_backup --bwlimit50M --transfers4最后提醒大家备份方案上线后一定要定期做恢复演练。我每个季度都会随机抽一个备份文件进行恢复测试这是确保数据安全的最后防线。

更多文章