Восстановление поврежденных таблиц MySQL

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

Читайте также:

Таблицы MySQL могут повредиться – это значит, что в работе произошла ошибка и MySQL не может прочитать данные, которые в них хранятся.

Вот некоторые общие причины повреждения таблиц:

  • Сервер MySQL остановился, не завершив операцию записи.
  • Таблица изменяется внешней программой и сервером одновременно.
  • Машина внезапно остановилась.
  • Произошла поломка аппаратного обеспечения.
  • В коде MySQL появился баг.

Если вам кажется, что одна из ваших таблиц была повреждена, вам нужно сделать бэкап вашего каталога данных, прежде чем приступить к устранению неполадок или попытаться восстановить таблицу.

Сначала остановите сервис MySQL:

sudo systemctl stop mysql

Затем скопируйте все ваши данные в резервный каталог. В системе Ubuntu каталогом данных по умолчанию является /var/lib/mysql/:

cp -r /var/lib/mysql /var/lib/mysql_bkp

После этого вы можете попробовать узнать, действительно ли повреждена таблица. Если таблица использует движок MyISAM, вы можете проверить ее целостность с помощью оператора CHECK TABLE в командной строке MySQL:

CHECK TABLE table_name;

В выводе этого оператора появится сообщение, из которого вы узнаете, повреждена ваша таблица или нет. Если таблица MyISAM действительно повреждена, ее обычно можно исправить с помощью оператора REPAIR TABLE:

REPAIR TABLE table_name;

Если восстановление данных прошло успешно, вы увидите такое сообщение:

+--------------------------+--------+----------+----------+
| Table                    | Op     | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status   | OK       |
+--------------------------+--------+----------+----------+

Если же это не помогло, обратитесь к документации MySQL за альтернативными методами восстановления поврежденных таблиц.

Если поврежденная таблица использует движок хранения InnoDB, процесс ее восстановления будет другим. InnoDB – это движок хранения MySQL по умолчанию начиная с версии 5.5, он включает в себя автоматическую проверку и исправление ошибок. InnoDB проверяет наличие поврежденных страниц, отслеживая контрольные суммы на каждой странице. Если он находит несоответствие контрольных сумм, он автоматически останавливает сервер MySQL.

Необходимость исправления таблиц InnoDB возникает редко, поскольку InnoDB имеет встроенный механизм восстановления после сбоя, который может решить большинство проблем при перезапуске сервера. Однако если вам все же нужно восстановить поврежденную таблицу InnoDB самостоятельно, документация MySQL рекомендует использовать метод сброса и перезагрузки. Этот метод подразумевает восстановление доступа к поврежденной таблице с помощью утилиты mysqldump, которая создает логическую резервную копию таблицы, сохраняя структуру и данные, а затем перезагружает таблицу обратно в базу данных.

Попробуйте перезапустить сервис MySQL, чтобы узнать, поможет ли это восстановить доступ к серверу.

sudo systemctl restart mysql

Если сервер по-прежнему выходит из строя или недоступен, тогда может быть полезно включить опцию InnoDB force_recovery. Вы можете сделать это, отредактировав файл mysqld.cnf:

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

В раздел [mysqld] добавьте следующую строку:

. . .
[mysqld]
. . .
innodb_force_recovery=1

Сохраните и закройте файл, а затем попробуйте перезапустить MySQL снова. Если вы можете получить доступ к поврежденной таблице, используйте утилиту mysqldump, чтобы выгрузить данные из таблицы в новый файл. Вы можете назвать этот файл как угодно (здесь мы назовем его out.sql):

mysqldump database_name table_name > out.sql

Затем удалите таблицу из базы данных. Чтобы избежать повторного открытия командной строки MySQL, вы можете использовать следующий синтаксис:

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

После этого восстановите таблицу с помощью только что созданного дампа:

mysql -u user -p < out.sql

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

Читайте также: Устранение ошибок сокетов в MySQL

Tags: