Как исправить поврежденные таблицы в MySQL

Note

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

Некоторые распространенные причины поврежденных таблиц:

  • Сервер MySQL останавливается в середине записи.

  • Внешняя программа изменяет таблицу, которая одновременно изменяется сервером.

  • Машина неожиданно выключилась.

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

  • Где-то в программном коде MySQL есть программная ошибка.

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

Сначала остановите службу MySQL:

sudo systemctl stop mysql

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

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

После создания резервной копии вы готовы начать расследование того, действительно ли таблица повреждена. Если в таблице используетсяMyISAM storage engine, вы можете проверить, не повреждена ли она, запустив оператор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 предлагает несколькоalternative methods for repairing corrupted tables.

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

Редко возникает необходимость исправления таблиц InnoDB, поскольку InnoDB имеет механизм восстановления после сбоя, который может решить большинство проблем при перезапуске сервера. Однако, если вы столкнетесь с ситуацией, когда вам нужно восстановить поврежденную таблицу InnoDB, документация MySQL рекомендует использовать“Dump and Reload” method. Это включает в себя восстановление доступа к поврежденной таблице с использованием утилитыmysqldump для созданияlogical backup таблицы, которая сохранит структуру таблицы и данные в ней, а затем перезагрузку таблицы обратно в базу данных. .

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

sudo systemctl restart mysql

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

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

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

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

. . .
[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. Таблицы, использующие InnoDBcan, по-прежнему будут повреждены, но из-за егоauto-recovery features риск повреждения таблицы и сбоев значительно ниже.

Related