写这篇文章之前,我正好和一个做运维的朋友吃饭。他吐槽说,前两天公司一个开发手一滑,把测试库的表给 drop 了,好在他们每天凌晨有定时备份,折腾了半小时才恢复回来。他说这话时,夹了一筷子回锅肉,语气轻描淡写,但我听得后背发凉。搞过数据库的人都知道,备份恢复这件事平时没人当回事,真出了事,那可是天塌下来的级别。MySQL 作为最常用的开源关系型数据库,天天跟业务数据打交道,你要是没有一套完整的备份恢复方案,就等于把公司的命脉光溜溜地晾在悬崖边上。

说到 MySQL 备份,第一个蹦出来的肯定是 mysqldump。这玩意儿是 MySQL 自带的逻辑备份工具,用起来特别简单,一行命令就能把整个库或某几张表导成 SQL 文件。比如 ,几秒钟就搞定了。但别以为简单就等于万能。mysqldump 最大的坑在于,它默认是锁表备份的;如果你用的是 MyISAM 引擎,备份期间整个表只能读不能写,线上业务稍有流量,就等着用户骂娘吧。所以生产环境里,我建议加上 参数,这样用 InnoDB 引擎的库就能在事务隔离级别下做一致性快照,备份期间不影响读写。还有个容易被忽略的点,大库用 mysqldump 导出的 SQL 文件体积巨大,动不动几十个 G,恢复时灌进去,速度慢得让人想砸键盘。
既然 mysqldump 对大库不太友好,物理备份工具就得上场了。Percona XtraBackup 是目前业内用得最多的 MySQL 物理备份方案,它直接拷贝数据文件,速度比逻辑备份快好几个量级。我记得有个电商客户,数据库接近 500 GB,用 mysqldump 导出要三个多小时,换成 XtraBackup 的增量备份,每天差异备份只花十几分钟。XtraBackup 的原理挺有意思:它不会锁表,而是先拷贝所有数据文件,同时记录 redo log 的变化,拷贝完后再应用这些日志,保证备份数据的一致性。恢复时只需把备份出来的数据文件放回 MySQL 的数据目录,启动服务就完事。不过 XtraBackup 也有门槛,你得懂点 Linux 文件系统和存储原理,不然遇到数据目录权限不对、日志文件丢失等问题,麻烦就大了。
聊完工具,咱们得说说备份策略。很多人以为每天做一次全量备份就万事大吉,这想法太天真。全量备份确实安全,但消耗的资源也大,磁盘空间、网络带宽、备份时间都是成本。更合理的做法是全量加增量的组合拳。比如每周日凌晨做一次全量备份,其他日子每天凌晨做一次增量备份,只记录自上一次全量或增量之后变化的数据。这样既能保证恢复的粒度,又不会把磁盘塞爆。但增量备份有个陷阱:恢复时必须按顺序应用所有增量文件,少一个或顺序错了,数据就乱套了。所以做好备份文件的管理和记录特别重要。我习惯给每个备份文件打上时间戳,再写脚本维护一个备份清单,恢复时照着清单一步步来,基本不容易翻车。
备份做好了,最核心的一环来了:恢复。很多人觉得备份难,恢复简单,大错特错。恢复才是真正考验功力的地方。我见过不止一个运维,备份文件整得漂漂亮亮,真到恢复时手忙脚乱。比如用 mysqldump 恢复,你得先创建一个空库,然后用 mysql 命令导入 SQL 文件,但导入过程中如果表已经存在,会报错。还有字符集问题,导出时没指定字符集,导入时数据库默认字符集不一样,中文全变乱码。物理备份的恢复更麻烦,XtraBackup 恢复前要先准备数据文件,执行 把日志应用进去,然后才能拷贝到数据目录。如果你用的是主从架构,恢复完主库还得重建从库,同步位置点对不上,主从直接断连。每一步都有坑,稍不留神就是一场灾难。
说到这儿,不得不提一个老生常谈但总有人踩的坑:备份文件的验证。备份做好后,文件躺在磁盘上,你以为万事大吉?错了。我一个前同事公司每天凌晨跑 mysqldump,日志里显示备份成功,文件大小也正常。结果有一次数据库挂了,他信心满满地拿备份文件恢复,导入到一半报错,说备份文件损坏。后来查原因,是磁盘有坏道,备份文件已经写坏了,但系统没报错。从那以后,我养成了一个习惯:每次备份完,随机抽一个表或几条记录,用差异比对的方式验证备份数据的完整性。更保险的做法是,在另一台测试服务器上定期做一次完整的恢复演练,把备份文件还原成可用的数据库,然后跑几条查询看看数据是否正确。别嫌麻烦,真到恢复时,你才会明白这一步有多值钱。
聊点关于备份恢复的认知。很多公司把这件事当成运维的杂活,随便写个脚本挂到 crontab 就完事。这种心态迟早会出事。备份恢复应该是整个研发团队都需要关注的基础设施,它跟代码质量、系统架构同样重要。我见过最离谱的案例,某公司核心业务的 MySQL 数据库只有一份全量备份,而且放在同一台机器的另一个分区上,机器硬盘坏了,备份和源数据一起完蛋。更狠的,备份文件没加密,被人拖库后直接裸奔在公网上。所以,备份文件一定要异地存放,最好做多份副本并加密存储。恢复流程也要文档化,团队里每个人都得知道怎么操作,别等出事了才翻出备份工具的使用手册现学。数据是公司的命,备份恢复就是那个救命的保险丝,你永远不知道它什么时候会派上用场,但一旦需要,它必须是可靠的。写到这里,我想起那个朋友的吐槽,他后来加了一句:“备份这东西,就跟买保险一样,平时觉得是浪费钱,真出事的时候才知道自己多需要它。”这话虽土,理却不土。


