凌晨两点,手机屏幕在床头柜上疯狂震动。监控系统告警,数据库服务器的磁盘利用率已经飙到97%。我揉着眼睛爬起来,第一反应是查日志,第二反应是骂自己当初为什么没早点做迁移规划。这不是我第一次处理数据库迁移,但每一次都像走钢丝——数据不能丢,业务不能停,切换必须无感。Linux服务器上的数据库迁移,从来不是敲几条命令那么简单,它是一场对耐心、细节和预案的全方位考验。

先说个最常见的误区:很多人把数据库迁移等同于备份恢复。用mysqldump导个SQL文件,传到新服务器上导入,完事。听起来简单,但你在生产环境试试?一张几千万行的订单表,导出要两小时,导入要四小时,这期间业务还在写入,等你导入完,数据早就对不上了。真正的迁移要考虑增量同步、字符集兼容、存储引擎差异、甚至操作系统版本对数据库配置的影响。我见过最惨的案例,是有人用xtrabackup全量备份后直接恢复到新机器,结果因为二进制日志格式不一致,主从复制直接断裂,数据差了两天。
所以第一步,先搞清楚你的数据库类型和业务容忍度。MySQL、PostgreSQL、MongoDB,每种的迁移工具和方法论都不一样。如果是MySQL,Percona XtraBackup加上binlog解析,是主流方案;PostgreSQL有pg_basebackup和逻辑复制;MongoDB则靠mongodump加oplog同步。但工具只是手段,核心是你要定义一个明确的RTO(恢复时间目标)和RPO(恢复点目标)。金融业务可能要求RPO为零,也就是一秒都不能丢;而内部系统,能接受五分钟的数据回退。这个决定了你用什么策略——是停机迁移,还是在线热迁移。
停机迁移最粗暴,但有时候反而最靠谱。选个业务低谷期,凌晨两点,挂维护页面,停应用,停数据库,打包数据,传到新机器,导入,校验,启动。听起来稳妥,但坑在于你永远不知道导出要多久。我做过一次Oracle迁移,数据文件加起来1.2TB,用expdp导出花了七个小时,比预估多了三倍。因为磁盘I/O被其他业务抢了。所以停机迁移前,一定要做一次全流程演练,把每个步骤的时间都测出来,再乘以1.5的缓冲系数。
在线热迁移就麻烦多了。你得先搭建主从复制,让新服务器作为备库实时同步主库的数据。等追平了,再切换应用连接。但切换的瞬间,总有那么几秒的写操作会失败。解决办法是用VIP(虚拟IP)漂移,或者用代理层做连接切换。我习惯用Keepalived加MySQL的GTID复制,切换时先锁表,确认主备数据一致,再漂移VIP,整个过程控制在五秒内。但五秒内如果有用户正在提交订单,他的请求就会报错。所以线上操作前,得跟业务方确认,能不能接受偶尔的五秒闪断。
数据校验是另一道鬼门关。你以为复制过去了就完了?字符集不一致,中文变乱码;存储引擎不对,InnoDB转MyISAM,外键约束全失效;甚至同样的MySQL版本,小版本不同,某些索引行为都有差异。我每次迁移完,都会写一套校验脚本,对比主库和备库的表行数、checksum值、关键字段的散列值。别嫌麻烦,我吃过亏——有一次迁移PostgreSQL,忘了迁移序列(sequence),结果新库插入数据时主键冲突,业务直接瘫痪。那次之后,我列了个清单:表结构、索引、触发器、函数、序列、权限、事件调度器,一个都不能漏。
切换后的回滚方案,是很多人忽略的。你以为切完就万事大吉?万一新库性能不行,或者有隐藏的兼容问题,你得能快速切回旧库。所以旧服务器别急着销毁,保留至少一周。我通常的做法是,切换后让旧库继续跑只读模式,每天对比新旧两边的数据增长,确认完全一致后再停掉。同时把切换脚本和回滚脚本都写成可执行的shell脚本,别靠手动敲命令。手忙脚乱的时候,你根本记不住那些复杂的参数。
说说心态。数据库迁移不是一次性的技术操作,它是一次业务风险管控。你要跟DBA、运维、开发、甚至业务方反复沟通,确认迁移窗口、数据一致性要求、回滚条件。我见过太多技术高手栽在沟通上——自己闷头把迁移做了,结果业务方不知道有闪断,大客户投诉;或者迁移完没通知开发,连接池里的旧连接还指向旧库,造成数据错乱。所以每次迁移前,我会发一封邮件,写明时间窗口、影响范围、联系人,并在迁移当天提前两小时确认。
回到开头那个凌晨的告警。那次我最终没有迁移,因为磁盘清理和日志压缩解决了燃眉之急。但两周后,我还是做了完整规划,用了四天时间完成了一套MySQL从物理机到云服务器的热迁移。切换那天,我在键盘上敲下一条命令,VIP漂移成功,监控图上只有一个小小的波动。数据无损,业务无感。那种感觉,比睡一整晚踏实多了。
Linux数据库迁移,说难也难,说简单也简单。难在细节,简单在有章可循。备份、同步、校验、切换、回滚,每一步都有成熟的方法论。但比方法论更重要的,是你对数据的敬畏心——每一行记录背后,可能是一笔交易、一条用户消息、一个业务决策。多花点时间做预案,多写几行校验脚本,多跟业务方确认几次,这些看似琐碎的准备,才是数据无损的真正保障。别再等到磁盘报警了才想起迁移,也别再。技术是死的,人是活的,把活人该做的工作做扎实了,切换自然就不难了。


