说实话,这种踩同盘备份雷的事我自己刚入行也干过。那时候在一家做在线教育的小公司,负责课后作业的数据库,同样没存异地没加密,结果机械硬盘阵列直接烧了两块盘,数据恢复公司花了两天两夜只找回来70%的历史作业记录,学员家长投诉到教育局,老板脸黑了整整三天,把我半年的季度奖都扣没了一半。踩过这个坑才知道,备份真的不是“点个自动任务就完事儿”,每一步都得留点心眼。
先给你们个最基础但绝对安全的本地全量备份脚本片段吧,针对中小公司最常用的InnoDB引擎写的,新手可以直接改改参数用。首先建个权限600的隐藏文件存数据库和加密的密码,比如/home/mysql/.backup_secrets,内容就两行,别漏换行:
DB_USER=root
DB_PASS=你的MySQL密码
BACKUP_PASS=你的备份加密密码
然后写备份脚本/home/mysql/mysql_full_backup.sh,记得开头加#!/bin/bash,还要给脚本权限700,别让其他用户能看能改。脚本里要加single-transaction防止锁表影响线上业务,master-data=2记录binlog位置方便以后做增量恢复,quickroutinestriggersevents这些参数千万别丢,很多新手只导表结构和数据,忘了存储过程、触发器、定时事件,恢复的时候业务直接跑不起来。压缩用xz吧,虽然比gzip慢一点,但压缩率能高40%左右,中小公司业务低峰一般在凌晨2-4点,备份时间够的话我个人更推荐。
接下来就是加定时任务了,用crontab -e打开编辑界面,比如每周日凌晨3点做一次全量备份,就加这么一行:
0 3 0 /home/mysql/mysql_full_backup.sh >> /var/log/mysql_backup.log 2>&1
记得把日志也重定向到单独的文件,权限也设成600,方便以后排查备份失败的原因。
敲黑板敲黑板,第一个新手专属避坑提醒来了:绝对绝对不要把备份文件存在和MySQL数据库同一块盘上!同一块!同一块!重要的事情说三遍! 存同一块盘的备份和没备份有什么区别?稍微有点突发情况盘挂了,两个一起玩完。第二个避坑提醒:备份完一定要定期做恢复测试! 至少半个月一次,别嫌麻烦。我之前帮一个朋友看他的备份,脚本写得挺规范的,结果一看备份文件只有几KB,原来是MySQL密码在隐藏文件里写错了,备份一直失败但他从来没看过日志,也没做过恢复测试,真要用的时候哭都来不及。

如果你们公司数据增长不是特别快,也可以不用每周全量,比如每周日凌晨3点全量,周一到周六凌晨3点做增量备份,这样能省不少存储空间和备份时间。做增量备份的前提是得先在my.cnf里开启binlog,配置文件一般在/etc/my.cnf或者/etc/mysql/my.cnf,找到[mysqld]段,加这么几行:
server-id=1
log-bin=/var/lib/mysql/mysql-bin
binlog_format=ROW
expire_logs_days=14
server-id随便设一个正整数就行,别和其他MySQL实例重复;binlog_format设成ROW最安全,记录的是每行数据的变化,不会出现SQL_MODE不同导致的恢复错误;expire_logs_days设成14天,自动清理过期的binlog,别占满磁盘。
本地备份做好了,还得做个异地备份,防止本地机房或者云可用区挂了。用rclone同步到阿里云OSS或者腾讯云COS就行,配置也简单,rclone config按提示一步步来,选对应的云存储,填AccessKey ID和AccessKey Secret就行,别忘给rclone的配置文件权限600,OSS或者COS也最好开个版本控制,防止误删或者加密勒索病毒把备份也加密了删了。
最后再简单提一句恢复吧,毕竟验证备份有效的唯一标准就是能不能成功恢复。全量恢复先解密解压,然后用source命令导入,增量恢复就用mysqlbinlog根据全量备份里记录的binlog位置,从那个位置开始恢复到故障时间点就行。
你们在运维工作中有没有遇到过类似的备份踩坑的事?欢迎在评论区分享你的排查经验或者踩坑故事。

评论列表 (0条):
加载更多评论 Loading...