Your favourite monitoring software throws an alert or sends an email after it finds the following in the mysql error log:
InnoDB: page [page id: space=8858, page number=206777] (95 records, index id 29361)
How do you find which index is corrupted from this line?
Example using the above index id listed in the error log message:
select * from information_schema.INNODB_SYS_INDEXES where index_id = 29361; +----------+--------------------------------+----------+------+----------+---------+-------+-----------------+ | INDEX_ID | NAME | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE | MERGE_THRESHOLD | +----------+--------------------------------+----------+------+----------+---------+-------+-----------------+ | 29361 | blah_longwinded_name_for_index | 11238 | 0 | 3 | 4 | 8858 | 50 | +----------+--------------------------------+----------+------+----------+---------+-------+-----------------+ 1 row in set (0.009 sec)
How do you find which table is corrupted?
Example using the above table_id listed in the output from the above SQL statement.
select * from information_schema.INNODB_SYS_TABLES where table_id = 11238; +----------+-----------------------------------------------------+------+--------+-------+------------+---------------+------------+ | TABLE_ID | NAME | FLAG | N_COLS | SPACE | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | +----------+-----------------------------------------------------+------+--------+-------+------------+---------------+------------+ | 11238 | database0001_production/blah_longwinded_name_table | 41 | 8 | 8858 | Compressed | 8192 | Single | +----------+-----------------------------------------------------+------+--------+-------+------------+---------------+------------+
What about just as one statement…
select t.name as table_name,i.name as index_name,t.table_id,i.index_id from information_schema.INNODB_SYS_TABLES t JOIN information_schema.INNODB_SYS_INDEXES i on t.table_id=i.table_id where index_id = 29361; +-----------------------------------------------------+--------------------------------+----------+----------+ | table_name | index_name | table_id | index_id | +-----------------------------------------------------+--------------------------------+----------+----------+ | database0001_production/blah_longwinded_name_table | blah_longwinded_name_for_index | 11238 | 29361 | +-----------------------------------------------------+--------------------------------+----------+----------+
How do I fix this corrupted index?
Use a null alter to rebuild the table.
WARNING:
- Check the size first.
- use a tool like pt-online-schema-change if the table is large or accessed heavily, or you are running on Galera, Percona Cluster or equivalent.
- Did you get permission to run this on production?
eg:
ALTER TABLE <tablename> ENGINE=INNODB ;