一、触发场景
带两列 blob 数据的表进行 DML 操作可能导致表空间 not full list 损坏,进而导致在该表空间的 DML 操作 crash,主备数据可能同时损坏导致双机 crash。
二、涉及问题的内核版本
TXSQL 8.0 3.0.1至3.1.7版本。
三、修复的内核版本
TXSQL 8.0 3.1.8。
四、检查方法
可参考如下命令进行筛查。
·查询表详细列信息
SELECT t1.TABLE_SCHEMA, t1.TABLE_NAME, t1.COLUMN_NAME, t1.DATA_TYPEFROM INFORMATION_SCHEMA.COLUMNS t1INNER JOIN ( — 子查询:先找出符合条件(特定类型列数 >= 2)的表 SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE IN ('blob', 'mediumblob', 'longblob', 'json', 'text', 'MEDIUMTEXT', 'LONGTEXT', 'geometry') AND TABLE_SCHEMA IN ('xxx', 'xxxx') — 请替换为实际库名 GROUP BY TABLE_SCHEMA, TABLE_NAME HAVING COUNT(*) >= 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');
·查询风险表信息
SELECT TABLE_SCHEMA, TABLE_NAME, COUNT(*) as risky_column_count, GROUP_CONCAT(COLUMN_NAME) as risky_columns — 可选:将列名合并显示在一行FROM INFORMATION_SCHEMA.COLUMNSWHERE DATA_TYPE IN ('blob', 'mediumblob', 'longblob', 'json', 'text', 'MEDIUMTEXT', 'LONGTEXT', 'geometry') AND TABLE_SCHEMA IN ('xxx', 'xxxx')GROUP BY TABLE_SCHEMA, TABLE_NAMEHAVING COUNT(*) >= 2;
五、修复方法
1. 将内核版本升级至 TXSQL 8.0 3.1.8,操作方法请参考 升级内核小版本。
2. 升级内核版本后,对已损坏的表进行重建修复,可以通过 alter table xx engine = innodb; 的方法进行修复。为了避免锁表导致的业务影响,建议通过 pt-osc 等工具在业务低峰期进行修复。