You are here

InnoDB full-text index corruption

In a recent customer engagement we experienced a lot of corrupted (normal) indexes and also corrupted full-text indexes on InnoDB tables in a Galera Cluster (v10.4.13).

In the error log we did not see which table it was but we have only a few log entries every here and there indicating a full-table index is corrupt:

2020-07-08 22:09:03 0 [ERROR] InnoDB: (Duplicate key) writing word node to FTS auxiliary index table.
2020-07-08 22:09:06 0 [ERROR] InnoDB: (Duplicate key) writing word node to FTS auxiliary index table.
2020-07-08 22:09:09 0 [ERROR] InnoDB: (Duplicate key) writing word node to FTS auxiliary index table.

So we tried to figure out which database files were touch in the indicated time:

shell> ls -ltr */FTS_*.ibd | tail -n8
-rw-rw---- 1 mysql mysql    98304 Jul  8 22:09 test/FTS_00000000000005ee_00000000000011d3_INDEX_4.ibd
-rw-rw---- 1 mysql mysql    98304 Jul  8 22:09 test/FTS_00000000000005ee_00000000000011d3_INDEX_5.ibd
-rw-rw---- 1 mysql mysql    98304 Jul  8 22:09 test/FTS_00000000000005ee_00000000000011d3_INDEX_6.ibd
-rw-rw---- 1 mysql mysql   163840 Jul  8 22:09 test/FTS_00000000000005ee_00000000000011cc_INDEX_3.ibd
-rw-rw---- 1 mysql mysql   163840 Jul  8 22:09 test/FTS_00000000000005ee_00000000000011cc_INDEX_5.ibd
-rw-rw---- 1 mysql mysql   196608 Jul  8 22:09 test/FTS_00000000000005ee_00000000000011cc_INDEX_4.ibd
-rw-rw---- 1 mysql mysql    98304 Jul  8 22:10 test/FTS_00000000000005ee_CONFIG.ibd
-rw-rw---- 1 mysql mysql 19922944 Jul  8 22:11 test/FTS_00000000000005ee_00000000000011cc_INDEX_2.ibd

With these results we were capable to find which tables were involved:

SQL> SELECT ist.name AS fts_file
     , CONV(SUBSTR(ist.name, INSTR(ist.name, '/')+5,16), 16, 10) AS parent_table_id
     , CONV(SUBSTR(ist.name, INSTR(ist.name, '/')+5+16+1,16), 16, 10) AS fts_index_id
     , isi.name, isi.n_fields
     , ist2.name AS table_name
  FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES AS ist
  LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_INDEXES AS isi ON CONV(SUBSTR(ist.name, INSTR(ist.name, '/')+5+16+1,16), 16, 10) = isi.index_id
  LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES AS ist2 ON ist2.table_id = CONV(SUBSTR(ist.name, INSTR(ist.name, '/')+5,16), 16, 10)
 WHERE ist.name LIKE 'test/FTS_%INDEX%'
;
+----------------------------------------------------+-----------------+--------------+------+----------+------------+
| fts_file                                           | parent_table_id | fts_index_id | name | n_fields | table_name |
+----------------------------------------------------+-----------------+--------------+------+----------+------------+
| test/FTS_00000000000005ee_00000000000011cc_INDEX_1 | 1518            | 4556         | data |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011cc_INDEX_2 | 1518            | 4556         | data |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011cc_INDEX_3 | 1518            | 4556         | data |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011cc_INDEX_4 | 1518            | 4556         | data |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011cc_INDEX_5 | 1518            | 4556         | data |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011cc_INDEX_6 | 1518            | 4556         | data |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011d3_INDEX_1 | 1518            | 4563         | d    |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011d3_INDEX_2 | 1518            | 4563         | d    |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011d3_INDEX_3 | 1518            | 4563         | d    |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011d3_INDEX_4 | 1518            | 4563         | d    |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011d3_INDEX_5 | 1518            | 4563         | d    |        1 | test/test  |
| test/FTS_00000000000005ee_00000000000011d3_INDEX_6 | 1518            | 4563         | d    |        1 | test/test  |
+----------------------------------------------------+-----------------+--------------+------+----------+------------+

After repairing those full-text indexes the messages disappeared (for a while?)...

Example full-text index table

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(128) DEFAULT NULL,
  `ts` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `d` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `data` (`data`),
  FULLTEXT KEY `d` (`d`)
) ENGINE=InnoDB AUTO_INCREMENT=3443073 DEFAULT CHARSET=latin1

See also bugs: MDEV-12676 and MDEV-15237, MDEV-18868