Как исправить поврежденные таблицы в 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;
Предполагая, что ремонт был успешным, вы увидите сообщение, подобное следующему:

Output
+--------------------------------+--------+----------+--------------+
| 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

Если сервер по-прежнему выходит из строя или иным образом недоступен, тогда может быть полезно включить force_recovery опцию InnoDB. Вы можете сделать это, отредактировав 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, все еще могут быть повреждены, но благодаря функциям автоматического восстановления риск повреждения и сбоев таблиц значительно ниже.

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0