客户是深圳南山一家做企业服务软件的互联网公司,一台物理机上跑着 MySQL 5.7,某个周末机房 UPS 故障,服务器直接断电。周一重启后 MySQL 服务无法启动,错误日志里反复出现 InnoDB 数据页校验失败与表空间损坏的提示;勉强启动成功后,两张核心业务表一执行查询就断开连接。客户的开发同学当天做了三次操作:跑修复命令、开强制恢复模式、再试导出,都没能拿到完整数据。
InnoDB 的存储结构是"表空间装页、页装行"的分层结构。页头损坏时,数据库为了保护自身,会拒绝加载整张表;而修复类命令在遇到无法解析的页时,常见的处理方式是丢弃而不是取回。更要紧的是,只要服务还在反复启动、日志还在写入,磁盘上的原始数据就一直在被覆盖。所以这类故障的第一原则是:先停库,再镜像,最后才谈修复。
补天时代工程师远程指导客户先停止 MySQL 服务并保留现场,随后对数据目录做整盘镜像,后续所有解析都在副本上进行。恢复分三段:第一段,解析表空间文件的空间管理与页分配信息,把结构完好的数据页逐页提取出来;第二段,对页头受损的记录做行级重建,按聚簇索引的顺序重新拼出完整行;第三段,重建索引页,让数据能被正常查询,并按客户要求导出成 SQL 文件或直接放回一台备用实例。
两张核心表的数据量合计约 1200 万行,我们优先保证订单流水与用户账户表,再处理日志类大表。从拿到镜像到交付可用数据,前后不到 24 小时,客户的新实例在当晚完成导入并恢复服务。
一是数据库所在机器必须配置在线备份,并且定期做恢复演练,备份文件不可用的情况很常见;二是异常断电后不要急着重启数据库,先把数据目录整体复制一份;三是发现页损坏时不要在原库上跑丢弃式修复,那等于主动删数据。数据库类故障属于逻辑类问题,恢复流程按规范执行、可追溯,但覆盖程度取决于原盘被写入过多少次。
深圳市补天时代科技有限公司专注数据恢复二十余年,覆盖 Oracle、SQL Server、MySQL、DB2、SYBASE 等主流数据库。深圳 MySQL 数据库修复、数据表损坏打不开,来电 0755-83775551 先做免费检测评估,地址:深圳市福田区华强北深南中路2070号电子科技大厦A座35楼。