Mysql repair table error

How to Repair MySQL Database

Home » Backup and Recovery » How to Repair MySQL Database

MySQL offers several different ways to analyze and repair databases. Errors and anomalies appear for numerous reasons, some of which include:

  • A MySQL update or downgrade.
  • Rapid changes in indexes or data.
  • Table inconsistencies.

When checking for corrupted data and repairing tables, the steps taken to fix the errors depend on how you connect to the database, the database server state, the type of error, and the database engine used.

This article shows you multiple ways to troubleshoot and repair a MySQL database.

  • Terminal or command line with root privileges.
  • MySQL version 8.0 installed and configured.
  • A corrupt database or database table.

How to Check MySQL Table for Errors

Running diagnostics is the first step to troubleshooting for issues. There are two ways to check a MySQL table for errors:

  • Through a MySQL CHECK TABLE query.
  • Using the terminal program mysqlcheck .

Check a Table with CHECK TABLE

The CHECK TABLE query works in MySQL while the service is running. The general use is:

The simplest use is one table without any options:

The output of the CHECK TABLE query shows an informative table about the check results:

The available options when checking tables are:

  • FOR UPGRADE — discovers version inconsistencies. For example, MySQL 8.0 does not support two-digit years, so a table containing such values is marked for upgrade.
  • QUICK — does not check rows for incorrect linking. This is helpful in avoiding timeouts.
  • FAST — performs a check on tables that are not closed properly.
  • CHANGED — only checks tables with changes since the last check or that have not closed properly.
  • MEDIUM — checks table rows to verify the validity of deleted links and performs a checksum for the rows.
  • EXTENDED — does a check for complete consistency.

Without any options, CHECK TABLE performs a MEDIUM check on MyISAM tables and views. The FOR UPGRADE and QUICK perform checks on InnoDB engine tables and views while other options are ignored.

You can also combine the options for a more detailed check. For example, to do a quick check to find out whether a table closed adequately, run:

Any options that do not apply to the tables are ignored.

Check a Table With mysqlcheck

The mysqlcheck command is the command-line version of CHECK TABLE . The program runs in the terminal while the MySQL service is operating. To perform the check:

1. As the root user, navigate to the directory where the databases are stored:

2. Check the whole database with:

Alternatively, check a specific table within the database by providing the table name as well:

How to Repair MySQL Database

There are several methods how to repair a database in MySQL. However, keep in mind that these methods are not a quick fix and can result in data loss. If the database tables are corrupt often, identify the reason for the occurrence.

Before making any changes and starting repairs, create a copy of the directory:

Alternatively, make a backup version of the database before trying any of the repair solutions. Follow our guide: How to Back Up & Restore a MySQL Database.

Below you will find three options how to repair a MySQL database.

Repairing MySQL Database with REPAIR TABLE Query

After scanning and locating the database and the tables with problems, the quickest way to fix the issue is with the REPAIR TABLE query:

If the server shuts down during the repair, rerun the REPAIR TABLE operation when the server starts again. Make sure to do this before performing any other operations on the same table. In normal conditions, a MyISAM table will not result in data loss from using this method.

Repairing MySQL Database with mysqlcheck

The mysqlcheck command is an alternative to repairing database tables in the terminal.

1. First, navigate to the MySQL database folder as the root user:

Читайте также:  Leeco le 3 x622 прошивка

2. Add the -r option to the mysqlcheck command to repair the database table:

The mysqlcheck -r command is the terminal version of the REPAIR TABLE query.

Repairing MySQL Database with ALTER TABLE

Use the ALTER TABLE query to rebuild the table using the same storage engine. For example, if you have an InnoDB table, run:

To rebuild a MyISAM table, use:

If you are unsure which storage engine the table uses, run the following query to find out:

Running Engine-Specific Diagnostics and Repairs to MySQL Database

Depending on the database engine used, MySQL provides engine-specific approaches for analyzing and repairing a database table.

MyISAM tables are prone to corruptions. However, most of the time the errors are easy to fix.

When working with InnoDB databases, corruptions appear when the checksum values don’t match. Errors typically happen due to a power outage or some other hardware issue.

Checking and Repairing MyISAM Tables with myisamchk

MySQL provides a specific checker for MyISAM tables.

1. Shut down the MySQL server. Open the terminal and run:

2. As the root user, navigate to the location of the database:

3. To check a specific table, run:

4. Repair a table by running:

5. Restart the MySQL server:

6. Lastly, check the table in MySQL after recovery:

Running the InnoDB Recovery Process

MySQL documentation suggests running the InnoDB recovery process for InnoDB databases.

1. Locate and open the global configuration file using your favorite text editor. For Ubuntu and Debian systems, the location is:

Note: For CentOS and Fedora, the location is:

2. Add the following option to the my.cnf file:

By default, the forced recovery option is set to 0 (off) and goes up to 6. Every new level includes the recovery features of the lower numbers.

3. Save and close the file.

4. Restart the MySQL server to ensure the new configuration file applies:

5. In the home folder, export all the databases to a backup file with the mysqldump command:

6. Start MySQL client and drop all the affected database tables. To drop a database table, try:

If the table does not drop, try removing the database table manually. Log in as the root user and navigate to the directory where the databases are:

Remove the database table:

7. Stop the MySQL server:

8. In the my.cnf file, comment out the innodb_force_recovery option added in step 2 to disable the recovery mode. Then, save the file and close.

9. Start the MySQL server up again:

10. Restore the database from the backup .sql file in the MySQL shell. Log into the MySQL client:

11. Run the following query to import the databases:

12. Lastly, test the database to confirm everything works correctly. If not, restore the database from backup and try an alternate method.

This tutorial outlines several different methods to repair a MySQL database. Since database corruptions are bound to happen, MySQL provides multiple ways to discover and fix errors in a database, some of which are outlined in this article.

However, since recovery sometimes results in data loss, the best way to protect your information is to create regular backups and follow the best database security practices.


How To Fix Corrupted Tables in MySQL


Occasionally, MySQL tables can become corrupted, meaning that an error has occurred and the data held within them is unreadable. Attempts to read from a corrupted table will usually lead to the server crashing.

Some common causes of corrupted tables are:

  • The MySQL server stops in middle of a write.
  • An external program modifies a table that’s simultaneously being modified by the server.
  • The machine is shut down unexpectedly.
  • The computer hardware fails.
  • There’s a software bug somewhere in the MySQL code.

If you suspect that one of your tables has been corrupted, you should make a backup of your data directory before troubleshooting or attempting to fix the table. This will help to minimize the risk of data loss.

First, stop the MySQL service:

Note: On some platforms such as Rocky Linux, the MySQL service may be called mysqld instead.

Then copy all of your data into a new backup directory. On Ubuntu systems, the default data directory is /var/lib/mysql/ :

After making the backup, you’re ready to begin investigating whether the table is in fact corrupted. If the table uses the MyISAM storage engine, you can check whether it’s corrupted by restarting MySQL and running a CHECK TABLE statement from the MySQL prompt:

Читайте также:  Syntaxerror json parse error unexpected eof

A message will appear in this statement’s output letting you know whether or not it’s corrupted. If the MyISAM table is indeed corrupted, it can usually be repaired by issuing a REPAIR TABLE statement:

Assuming the repair was successful, you will see a message like this in your output:

If the table is still corrupted, though, the MySQL documentation suggests a few alternative methods for repairing corrupted tables.

On the other hand, if the corrupted table uses the InnoDB storage engine, then the process for repairing it will be different. InnoDB is the default storage engine in MySQL as of version 8.0, and it features automated corruption checking and repair operations. InnoDB checks for corrupted pages by performing checksums on every page it reads, and if it finds a checksum discrepancy it will automatically stop the MySQL server.

There is rarely a need to repair InnoDB tables, as InnoDB features a crash recovery mechanism that can resolve most issues when the server is restarted. However, if you do encounter a situation where you need to rebuild a corrupted InnoDB table, the MySQL documentation recommends using the “Dump and Reload” method. This involves regaining access to the corrupted table, using the mysqldump utility to create a logical backup of the table, which will retain the table structure and the data within it, and then reloading the table back into the database.

With that in mind, try restarting the MySQL service to see if doing so will allow you access to the server:

If the server remains crashed or otherwise inaccessible, then it may be helpful to enable InnoDB’s force_recovery option. You can do this by editing the mysqld.cnf file. On Ubuntu and Debian systems, this file is usually in etc/mysql . On Red Hat and Rocky systems, this file is usually in /etc/my.cnf.d .

In the [mysqld] section, add the following line:

Save and close the file, and then try restarting the MySQL service again. If you can successfully access the corrupted table, use the mysqldump utility to dump your table data to a new file. You can name this file whatever you like, but here we’ll name it out.sql :

Then drop the table from the database. To avoid having to reopen the MySQL prompt, you can use the following syntax:

Following this, restore the table with the dump file you just created:

Note that the InnoDB storage engine is generally more fault-tolerant than the older MyISAM engine. Tables using InnoDB can still be corrupted, but because of its auto-recovery features the risk of table corruption and crashes is markedly lower.

If you’ve enjoyed this tutorial and our broader community, consider checking out our DigitalOcean products which can also help you achieve your development goals.

Tutorial Series: How To Troubleshoot Issues in MySQL

This guide is intended to serve as a troubleshooting resource and starting point as you diagnose your MySQL setup. We’ll go over some of the issues that many MySQL users encounter and provide guidance for troubleshooting specific problems. We will also include links to DigitalOcean tutorials and the official MySQL documentation that may be useful in certain cases.


Mysql repair table error

В данном разделе рассматривается только использование myisamchk на таблицах MyISAM (расширения `.MYI' и `.MYD'). Если же в системе применяются таблицы ISAM (расширения `.'IS M и `.'IS D ), то следует пользоваться isamchk .

Начиная с версии MySQL 3.23.14 можно ремонтировать таблицы MyISAM при помощи команды REPAIR TABLE (see section 4.4.5 Синтаксис REPAIR TABLE ).

К симптомам повреждения таблицы относятся неожиданные прерывания выполнения запросов и появление следующих ошибок:

  • `tbl_name.frm' is locked against change (Файл заблокирован для изменений)
  • Can’t find file `tbl_name.MYI' (Errcode: ###) (Не могу найти файл `tbl_name.MYI' (Ошибка: ###))
  • Unexpected end of file (Неожиданно наступил конец)
  • Record file is crashed (Файл записей испорчен)
  • Got error ### from table handler (Получена ошибка ### от дескриптора таблицы). Для получения более подробной информации об ошибке можно выполнить perror ###. Чаще всего о проблемах с таблицей свидетельствуют следующие ошибки: Заметим, что ошибка 135 — ‘no more room in record file’ (‘не осталось места в файле записей’), не может быть исправлена просто выполнением ремонта. В этом случае необходимо использовать следующую команду:

В других случаях следует выполнять ремонт таблиц. myisamchk обычно может обнаружить и исправить большинство неполадок.

Читайте также:  Hyundai solaris 2014 магнитола прошивка

Процесс ремонтирования включает до четырех описанных здесь стадий. Перед тем как приступить к ремонту, необходимо выполнить `cd' в каталог базы данных и проверить права доступа к табличным файлам. Файлы должны быть доступны для чтения Unix-пользователю, от имени которого выполняется mysqld , (а также выполняющему ремонт, поскольку ему приходится обращаться к проверяемым файлам). Если появится необходимость изменять файлы, то проверяющий также должен иметь доступ для записи.

Если используется версия MySQL 3.23.16 и выше, то для проверки и ремонта таблиц MyISAM можно (и нужно) использовать команды CHECK и REPAIR (section 4.4.4 Синтаксис CHECK TABLE и see section 4.4.5 Синтаксис REPAIR TABLE ).

Раздел руководства, посвященный сопровождению таблиц, содержит опции к isamchk / myisamchk (see section 4.4.6 Использование myisamchk для профилактики таблиц и послеаварийного).

Случаи, когда упомянутые команды не дают результата или желательно использовать расширенные возможности, представленные в isamchk / myisamchk , рассматриваются в следующем разделе.

Если ремонт таблицы планируется выполнять из командной строки то сначала требуется остановить сервер. Следует отметить, что при выполнении mysqladmin shutdown с удаленного сервера mysqld все еще будет некоторое время работать после завершения mysqladmin , пока не будут остановлены все запросы и сброшены на диск все ключи.

Стадия 1: проверка таблиц

Выполните myisamchk *.MYI или, если вы располагаете временем, myisamchk -e *.MYI . Используйте опцию -s (молчаливый режим) для подавления ненужной информации.

Если mysqld остановлен, то следует использовать опцию —update-state для указания myisamchk отмечать таблицы как ‘проверенные'(checked).

Ремонтировать следует только те таблицы, для которых myisamchk выдала ошибки. Для таких таблиц следует перейти к стадии 2.

Если во время проверки будут получены странные ошибки (подобные out of memory), или myisamchk завершится аварийно, то перейдите к стадии 3.

Стадия 2: легкий безопасный ремонт

Примечание: если есть желание ускорить ремонт, рекомендуется добавить: -O sort_buffer=# -O key_buffer=# (где # примерно 1/4 от имеющейся памяти) во всех командах isamchk / myisamchk .

Сначала надо попробовать запустить myisamchk -r -q tbl_name ( -r -q означает «режим быстрого восстановления»). При этом будет сделана попытка исправить индексный файл без изменения файла данных. Если в файле данных содержится все необходимое, а удаленные связи указывают на правильные позиции в файле данных, то команда должна дать результат и таблица будет исправлена. Перейдите к ремонту следующей таблицы. В противном случае следует выполнить следующие действия:

  1. Сделать резервную копию файла данных.
  2. Использовать myisamchk -r tbl_name ( -r означает «режим восстановления»). При этом из файла данных будут удалены некорректные и уничтоженные записи, и будет заново создан индексный файл.
  3. Если на предыдущем шаге проблему решить не удастся, то используйте myisamchk —safe-recover tbl_name . В режиме безопасного восстановления используется старый метод восстановления, справляющийся с некоторыми случаями, которые оказываются не под силу для режима обычного исправления (но работает этот метод медленнее).

Если во время проверки будут получены странные ошибки (подобные out of memory) или myisamchk аварийно завершается, то перейдите к стадии 3.

Стадия 3: сложный ремонт

До этой стадии дело доходит, только если первый 16-килобайтный блок в индексном файле разрушен или содержит неверную информацию, либо когда индексный файл отсутствует. В этом случае необходимо создать новый индексный файл. Необходимо выполнить следующие действия:

  1. Переместить файл данных в какое-нибудь безопасное место.
  2. Использовать файл описания таблицы для создания новых (пустых) файлов — данных и индексного: Если используемая версия SQL не располагает TRUNCATE TABLE , то взамен используется DELETE FROM table_name .
  3. Скопируйте старый файл данных на место недавно созданного (делать перемещение старого файла обратно на место нового нецелесообразно, поскольку в старом файле может снова возникнуть потребность, если что-то пойдет не так).

Вернитесь к стадии 2. myisamchk -r -q теперь должна сработать (но бесконечно повторять стадии не следует).

Что касается MySQL 4.0.2, то тут можно воспользоваться REPAIR . USE_FRM , выполняющей всю эту процедуру автоматически.

Стадия 4: очень сложный ремонт

До этой стадии вы дойдете только в случае, если ко всему прочему запорчен и файл описания. Такого происходить не должно, поскольку файл описания после создания таблицы не изменяется. Выполните следующие действия:

  1. Восстановите файл описания из резервной копии и перейдите к стадии 3. Можно также восстановить индексный файл и вернуться к стадии 2. Во втором случае начинать надо с myisamchk -r .
  2. Если резервной копии нет, но точно известно, как таблица создавалась, то создается копия таблицы в другой базе данных. Новый файл данных удаляется, затем файл описания с индексным файлом перемещаются из другой базы данных в поврежденную. Таким образом вы получаете новый файл описания и индексный файл, не затрагивая при этом файла данных. Делается возврат к стадии 2 с попыткой воссоздать индексный файл.