半夜两点,手机屏幕亮起来,是运维同事发来的消息:“主库磁盘报警,IO延迟飙到300ms,业务已经卡了十分钟了。”我揉着眼睛爬起来,打开电脑,第一反应不是去查磁盘,而是先确认备份还在不在。做数据库这行久了,你就会明白一个道理:真正让你睡不踏实的,不是数据库坏了,而是你不知道备份到底能不能用。很多人把“备份”理解成“拷一份数据”,可真正的备份是“能在灾难发生时,把数据恢复到可用状态的能力”。这两者之间的差距,往往就是一次故障现场的血泪教训。

备份这事儿,最怕的就是“你以为你备份了”。我见过不止一个团队,定时任务每天跑,备份文件每天生成,日志显示“备份成功”,大家都很满意。直到某天要恢复数据,才发现备份文件是坏的,或者恢复出来的数据缺了半个月。为什么?因为备份脚本根本没人检查,磁盘满了没人发现,备份文件被覆盖了没人察觉。所以我要说的第一个实战原则是:备份不是配置完就完事,它是一条需要持续验证的生命线。每周至少做一次恢复演练,把备份文件恢复到测试库,跑几条关键SQL看看数据对不对,这比任何监控告警都管用。
说到备份策略,很多人一上来就问“用全备还是增备”,其实这个问题问反了。你应该先问自己:业务能接受丢失多少数据?能接受停机多久?这两个答案直接决定了你的备份方案。举个例子,一个电商平台,每分钟可能产生几千条订单,如果备份只能恢复到昨天零点,那今天白天的订单全部丢失,这生意还怎么做?所以核心交易库必须做实时或准实时的备份,比如MySQL的binlog持续归档,或者Oracle的归档日志模式。而那些不那么核心的数据,比如用户行为分析表,每天全备一次就够,丢了半天数据也无伤大雅。备份的粒度,永远取决于业务对数据丢失的容忍度。
再来说迁移,很多人把迁移想得太简单,以为就是“把数据倒过去”。实际上,数据库迁移最难的从来不是数据搬运,而是兼容性问题。我接手过一个项目,从Oracle迁移到PostgreSQL,表面上SQL语法都兼容,结果跑起来发现日期函数行为不一样、空值排序规则不一样、甚至字符集转换都出了乱子。那段时间我们天天在改代码,业务方天天催,硬是拖了一个多月才上线。所以迁移之前,一定要做充分的兼容性评估,小到字段类型,大到存储过程、触发器、视图,全部列个清单逐项核对。千万别信“兼容性99%”这种话,那1%的坑可能就够你喝一壶的。
迁移的节奏也很讲究。我见过最稳的团队,他们的做法是“三步走”:第一步,全量数据迁移,把结构、数据都搬过去;第二步,增量数据同步,让新旧库并行跑一段时间,新库持续追平旧库的数据变化;第三步,切换流量,把读写请求逐步切到新库上,同时保留回退方案。这个过程里有个细节容易被忽略:切换前一定要做一次完整的校验,不只是看行数对不对,还要随机抽几条记录对比字段值,甚至跑一遍核心业务流程。数据对不上就切流量,那等于把炸弹埋进生产环境。
还有个常被忽视的坑:迁移过程中的性能问题。数据量一大,全量导出导入就慢得让人怀疑人生。我遇到过一张十亿行的表,用传统方式导出,跑了十几个小时还没完。后来换了并行导出的工具,把表按主键范围拆成多个分片,同时开八个进程导,时间直接缩短到两小时。所以迁移之前,一定要评估数据量级,选对工具和策略。小数据量无所谓,几十GB以上,你就得考虑用专业迁移工具,或者利用数据库原生的复制功能,别傻乎乎地一条条select再insert。
备份和迁移还有个共同的敌人:时间窗口。很多人把备份安排在凌晨两点,觉得这时候业务流量低,没问题。但你考虑过没有,凌晨两点也是很多批处理任务跑的时候,如果备份和批处理抢磁盘IO,两边都慢,备份时间拉长,批处理超时,第二天早上业务一开就出问题。迁移也一样,你以为周末流量低适合迁移,结果发现周六有大促活动,流量比工作日还高。所以做任何备份或迁移操作之前,先看看业务日历,避开高峰期,再算好预计耗时,预留出缓冲区。
还有一点,我每次都要啰嗦:备份文件别跟数据库放在同一台服务器上。这道理很简单,服务器宕机、机房断电、硬盘损坏,任何单点故障都可能同时干掉数据库和备份。我见过一个初创公司,数据库和备份都在同一台云主机上,结果账号被盗,黑客把整个盘格式化,数据库和备份一起没了,只能从三周前的异地备份里恢复,损失惨重。所以备份一定要异地存储,至少也得放到不同的可用区。条件允许的话,搞个冷备,把备份文件定期拷贝到对象存储或者磁带库,虽然慢,但胜在安全。
回到文章开头那个场景。那天晚上我检查完备份,确认是完好的,心里才踏实下来。然后花了一个小时定位问题,发现是某个业务表膨胀得太厉害,磁盘空间被撑爆了。清理掉冗余数据,重启实例,业务恢复。整个过程,备份是我最大的底气。所以你看,数据无忧不是靠运气,迁移有方也不是靠经验,靠的是把每个环节都当成生产事故来对待的认真劲儿。备份和迁移这事儿,平时看起来枯燥无味,但每一次精心准备,都是在给未来的自己买保险。愿你永远不需要用上那份备份,但愿你永远知道那份备份是好的。


