InnoDB大表操作触发MySQL崩溃:Lost connection报错求助
解决InnoDB聚簇索引页面损坏导致MySQL崩溃的问题
1. 优先导出可访问数据
既然通过LIMIT能查询到前681000行,先导出这部分数据避免丢失:
- 使用
mysqldump导出可访问范围的数据:mysqldump -u [用户名] -p SHAS_2015_NEW b_media_21_646_0000_11925 --where="1=1 LIMIT 681000" > recoverable_data.sql - 尝试导出更多数据时,可调整偏移量分批导出,直到出现连接断开为止:
mysqldump -u [用户名] -p SHAS_2015_NEW b_media_21_646_0000_11925 --where="1=1 LIMIT 681000, 10000" >> recoverable_data.sql
2. 跳过损坏页面启动MySQL
修改MySQL配置文件(my.cnf/my.ini),添加参数让InnoDB跳过损坏页面:
[mysqld] innodb_force_recovery = 4
- 说明:
innodb_force_recovery级别4会让InnoDB以只读模式运行,跳过索引树损坏部分,此模式下禁止执行写入操作,仅用于数据导出。 - 重启MySQL后,尝试导出完整表数据:
mysqldump -u [用户名] -p SHAS_2015_NEW b_media_21_646_0000_11925 > full_table_recover.sql - 导出完成后,立即将
innodb_force_recovery改回0,重启MySQL。
3. 重建损坏的表
方法一:新建表并导入数据
- 创建与原表结构一致的新表:
CREATE TABLE SHAS_2015_NEW.b_media_new LIKE SHAS_2015_NEW.b_media_21_646_0000_11925; - 导入之前导出的可恢复数据:
mysql -u [用户名] -p SHAS_2015_NEW < recoverable_data.sql - 验证新表正常后,替换原表:
ALTER TABLE SHAS_2015_NEW.b_media_21_646_0000_11925 RENAME TO SHAS_2015_NEW.b_media_21_646_0000_11925_old; ALTER TABLE SHAS_2015_NEW.b_media_new RENAME TO SHAS_2015_NEW.b_media_21_646_0000_11925;
方法二:强制重建索引
若MySQL能在innodb_force_recovery=4模式下访问表,可通过以下方式重建聚簇索引:
- 原表无显式主键时,添加主键(自动重建隐式GEN_CLUST_INDEX):
-- 替换your_column为表中唯一非空列,或新增自增列 ALTER TABLE SHAS_2015_NEW.b_media_21_646_0000_11925 ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY; - 原表已有主键时,强制重建表和索引:
ALTER TABLE SHAS_2015_NEW.b_media_21_646_0000_11925 ENGINE=InnoDB;
4. 排查硬件与文件系统问题
索引页面损坏常与磁盘故障相关,需做以下检查:
- 查看磁盘SMART状态,确认是否存在坏道或硬件故障。
- 使用
fsck(Linux)或chkdsk(Windows)扫描修复文件系统错误。
5. 后续预防措施
- 定期执行全量备份,避免数据丢失。
- 确保服务器硬件稳定,避免磁盘IO瓶颈。
- 保留
innodb_checksum_algorithm默认开启状态,用于页面损坏检测。 - 业务低峰期定期执行
CHECK TABLE,提前发现潜在问题。
内容的提问来源于stack exchange,提问作者ChinChen
相关产品推荐
相关产品推荐

