How to Repair a Corrupted MySQL Table

Updated on September 16, 2022
How to Repair a Corrupted MySQL Table header image

Introduction

MySQL is a Relational Database Management System (RDBMS). An RDBMS is a database management system (DBMS) that stores related data in tables. These tables form rows called records and columns called attributes, with a unique key identifying each row.

RDMSes such as MySQL include functionality to preserve data integrity, consistency, and accuracy. CRUD (Create, Read, Update, Delete) transactions execute on RDBMS using SQL, following the ACID (Atomicity, Consistency, Isolation, Durability) mechanism.

  • Atomicity - A CRUD transaction takes place in its entirety or it doesn't happen at all.
  • Consistency - Data is in a consistent state when a CRUD transaction starts and ends.
  • Isolation - Ensures concurrent transactions without leading to inconsistency. The intermediate transaction state is invisible to other transactions until it's committed.
  • Durability - After a CRUD transaction completes successfully, the changes persist even in a system failure.

This helps the system achieve consistency and stability.

This guide covers how to fix a corrupted MySQL table.

Prerequisites

  • Working knowledge of SQL.
  • Properly installed MySQL.
  • System running Linux like Ubuntu.

Causes of Corruption

Table corruption leads to data held within them being unreadable, with attempts to read data leading to the MySQL server crashing. Common causes of MySQL table corruption include:

  • Server hardware failure.
  • Unexpected machine shutdown.
  • The MySQL server stopped in the middle of a write.
  • Using 3rd party software to access the database.
  • Software bugs within the MySQL code.
  • Wrong data schema.

Fixing Table Corruption

Before attempting to fix or troubleshoot problems, create a backup of your data directory to reduce the risk of data loss.

1. First, stop the MySQL service:

$ sudo systemctl stop mysql

On Ubuntu, the default data directory is /var/lib/mysql.

2. Create a backup:

$ cp -r /var/lib/mysql /var/lib/mysql_backup

Determining MySQL Engine Type

As of MySQL version >= 5.5, InnoDB is the default storage engine and has a couple of features, including automated corruption checking and repair operations. Prior MySQL versions use MyISAM as the default storage engine, which is more susceptible to table corruption.

To check the MySQL engine type, enter the following query in the MySQL console:

mysql> SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = 'database_name';

Note: Replace 'database_name' with the name of your database.

This will display an output like this:

+--------------------+-------------+-----------+---
| Table_Name     |  Engine   |  Version |    ...
+--------------------+-------------+-----------+---
| customers      |  MyISAM   |    10    |    ...
+--------------------+-------------+-----------+---
| staff          |  InnoDB   |    10    |    ...
+--------------------+-------------+-----------+---

Repairing MyISAM Tables

Check for corruption on tables running the MyISAM storage engine, such as the customers table above, using the following MySQL prompt:

mysql> CHECK TABLE  customers;

Corruption errors on MyISAM tables are usually repaired with the REPAIR TABLE table_name prompt. E.g

mysql> REPAIR TABLE customers;

This will return an output telling the repair was successful. This method repairs most table errors on MyISAM storage engines.

Note: REPAIR TABLE requires SELECT and INSERT privileges.

If the repair does not result in an OK value, use the myisamchk utility command within the database directory:

$ myisamchk --safe-recover

This will most likely fix all corruption errors if the previous prompt fails to.

For more options with the myisamchk utility, check the documentation.

Repairing InnoDB Tables

InnoDB performs checksums on each page it reads. When it finds a checksum inconsistency - it automatically stops the MySQL server. The InnoDB storage engine is quite stable; thus, repairs are rarely needed. It features a crash recovery mechanism that can resolve most issues by restarting the server.

If a server restart doesn't fix the issue, use an alternative method called a DUMP and RELOAD to rebuild the table. This method involves creating a logical backup of the table, which preserves the table structure and data within, and finally reloading the table back into the database.

1. Start the InnoDB recovery process:

Enable InnoDB's force_recovery option by editing the configuration file:

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

2. Find the [mysqld] section within the file, add the following line and save:

…
[mysqld]
…
innodb_force_recovery = 1

The default value of innodb_force_recovery is 0. Change this to a value between one and six to start the InnoDB engine and dump the MySQL table.

Note: A innodb_force_recovery value greater than four increases the risk of further data corruption. If need be, increase incrementally from 1.

3. Restart the MySQL service:

$ sudo systemctl restart mysql.service

4. Dump the database:

If the MySQL service restarts successfully and you can access the corrupted table, the next step is to dump the table data to a new file using the mysqldump utility.

$ mysqldump database_name table_name > output.sql

This dumps the table data into a new file named output.sql.

5. Drop the table from the database:

The next step is to drop the table from the database:

$ mysql -u user -p --execute="DROP TABLE database_name.table_name"

The above command will drop the given table name from the database.

6. Restore the table:

The final step in the DUMP and RELOAD method is to restore the table to the database:

$ mysql -u user -p < output.sql

Conclusion

This guide covered repairing a corrupted MySQL table running the MyISAM or InnoDB storage engines. For more information, visit the MySQL reference documentation.