问题
双 blob 字段 purge/rollback 导致表空间 fseg not full list 损坏。
触发场景
带两列 blob 数据的表进行 DML 操作可能导致表空间 not full list 损坏,进而导致在该表空间的 DML 操作 crash,主备数据可能同时损坏导致双机 crash。
涉及问题的内核版本
MySQL 8.0 20220831、MySQL 8.0 20220401、MySQL 8.0 20220331、MySQL 8.0 20220330、MySQL 8.0 20211202、MySQL 8.0 20210830、MySQL 8.0 20210330、MySQL 8.0 20201230。
修复的内核版本
MySQL 8.0 20221002。
检查方法
可参考如下命令进行筛查。
查询表详细列信息
SELECTt1.TABLE_SCHEMA,t1.TABLE_NAME,t1.COLUMN_NAME,t1.DATA_TYPEFROMINFORMATION_SCHEMA.COLUMNS t1INNER JOIN (-- 子查询:先找出符合条件(特定类型列数 >= 2)的表SELECTTABLE_SCHEMA,TABLE_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHEREDATA_TYPE IN ('blob', 'mediumblob', 'longblob', 'json', 'text', 'MEDIUMTEXT', 'LONGTEXT', 'geometry')AND TABLE_SCHEMA IN ('xxx', 'xxxx') -- 请替换为实际库名GROUP BYTABLE_SCHEMA,TABLE_NAMEHAVINGCOUNT(*) >= 2) t2 ON t1.TABLE_SCHEMA = t2.TABLE_SCHEMA AND t1.TABLE_NAME = t2.TABLE_NAMEWHERE-- 外层再次过滤类型,确保只列出造成风险的列t1.DATA_TYPE IN ('blob', 'mediumblob', 'longblob', 'json', 'text', 'MEDIUMTEXT', 'LONGTEXT', 'geometry');
查询风险表信息
SELECTTABLE_SCHEMA,TABLE_NAME,COUNT(*) as risky_column_count,GROUP_CONCAT(COLUMN_NAME) as risky_columns -- 可选:将列名合并显示在一行FROMINFORMATION_SCHEMA.COLUMNSWHEREDATA_TYPE IN ('blob', 'mediumblob', 'longblob', 'json', 'text', 'MEDIUMTEXT', 'LONGTEXT', 'geometry')AND TABLE_SCHEMA IN ('xxx', 'xxxx')GROUP BYTABLE_SCHEMA,TABLE_NAMEHAVINGCOUNT(*) >= 2;
修复方法
1. 将内核版本升级至 MySQL 8.0 20221002,操作方法请参考 升级内核小版本。
2. 升级内核版本后,对已损坏的表进行重建修复,可以通过
alter table xx engine = innodb; 的方法进行修复。为了避免锁表导致的业务影响,建议通过 pt-osc 等工具在业务低峰期进行修复。