Как найти поврежденную таблицу

Как известно, любые повреждения происходят в результате каких-либо внешних факторов. Состояние внутренней структуры таблиц баз данных (БД), в данном случае таблиц MySQL, всецело определяет, насколько надёжным будет использование самой БД. На высоконагруженных серверах БД повреждение таблиц отнюдь не редкость. Администраторам, да и самим пользователям порой приходится прибегать к починке структуры таблиц своих БД. О том, по каким причинам повреждаются таблицы и какие существуют методы решения данной проблемы на примере MySQL и будет изложено в данной статье.

Содержание

  1. Причины повреждения таблиц
  2. Проверка таблиц на предмет повреждений
  3. Восстановление MyISAM-таблиц
  4. Восстановление InnoDB-таблиц
  5. Заключение

Причины повреждения таблиц

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

  • аппаратный сбой, когда произошло внезапное отключение системы, например из-за сбоев в электропитании;
  • внезапная остановка работы сервера MySQL, когда в этот момент осуществлялись доступ к БД и/или чтение и запись таблиц;
  • несанкционированный доступ к файлам БД со стороны сторонних программ.

В любом случае, первое, что нужно сделать — это остановить работу MySQL-сервера, сделать резервные копии файлов таблиц, которые по умолчанию находятся в каталоге /var/lib/mysql:

$ cp -r /var/lib/mysql ~/backups/mysql_back

Для выполнения этой команды могут потребоваться привилегии суперпользователя или пользователя, имеющего доступ к каталогу /var/lib/mysql. Только после этого можно приступить к разбору ситуации и проверить, действительно ли таблицы повреждены. Для этого можно воспользоваться командной консолью MySQL. Но предварительно необходимо снова запустить MySQL-сервер. И авторизоваться на нём (от имени пользователя-администратора) с помощью команды:

$ mysql -u username -p

Здесь username – имя пользователя-администратора в системе MySQL.

Проверка таблиц на предмет повреждений

Проверить таблицы на предмет повреждения можно встроенными средствами MySQL, если для них используется движок MyISAM. Для этого используется специальный запрос «CHECK TABLE». Итак, для начала, после авторизации в системе MySQL (как описано в предыдущей главе) необходимо выбрать интересующую БД:

mysql> use db_name;

Здесь db_name – имя требуемой базы данных, таблицы которой нужно проверить. Для получения списка всех имеющихся на сервере БД можно выполнить следующий запрос:

mysql> show databases;

Теперь можно выполнить, собственно, саму проверку:

mysql> check table db_table;
+--------------------+-------+----------+----------+
| Table              | Op    | Msg_type | Msg_text |
+--------------------+-------+----------+----------+
| db_name.db_table   | check | status   | OK       |
+--------------------+-------+----------+----------+
1 row in set (0.00 sec)

Как нетрудно догадаться, «db_table» здесь — это имя требуемой таблицы. В данном случае вывод в столбце «Msg-text» говорит о том, что с таблицей всё в порядке.

Восстановление MyISAM-таблиц

В случае, когда повреждения таблиц всё же есть. То с большой степенью вероятности таблицу можно починить, используя запрос «REPAIR TABLE»:

mysql> repair table db_table;

Теперь, если починка завершилась нормально, будет получен следующий вывод:

+-------------------+--------+----------+----------+
| Table             | Op     | Msg_type | Msg_text |
+-------------------+--------+----------+----------+
| db_name.db_table  | repair | status   | OK       |
+-------------------+--------+----------+----------+

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

Восстановление InnoDB-таблиц

В случае, если повреждённые таблицы обслуживались движком InnoDB, то придётся использовать более сложный метод восстановления. Дело в том, что движок InnoDB сам способен следить за исправностью таблиц и устранять повреждения. Однако, если он по каким-либо причинам не справляется с этой задачей, то сервер MySQL останавливается.

Метод восстановления для InnoDB-таблиц рекомендуется разработчиками MySQL и суть его в следующем:

  • необходимо сначала восстановить доступ к повреждённой таблице, поскольку сервер в этом случае останавливается;
  • выполнить резервную копию в виде дампа повреждённых таблиц, используя утилиту mysqldump, которая сохраняет структуру таблицы и данные;
  • удалить повреждённую таблицу;
  • выполнить загрузку дампа таблицы, но уже во вновь созданную таблицу БД, что будет сделано утилитой mysqldump автоматически.

Для восстановления доступа к таблицам можно сначала попытаться перезагрузить сервер MySQL. Если это не помогло, то можно запустить его с опцией innodb_force_recovery. Для этого необходимо отредактировать конфигурационный файл /etc/mysql/mysql.conf.d/mysqld.cnf, например, используя текстовый редактор nano:

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

Необходимо сделать изменения в разделе [mysqld], добавив в него строку:

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

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

$ mysqldump -u username -p db_name db_table > ~/backups/back.dump

Дамп back.dump будет сохранён в подкаталоге backups домашнего каталога текущего пользователя.

Теперь необходимо удалить из БД повреждённую таблицу. Для этого после авторизации в командной консоли MySQL (как описано в главе «Причины повреждения таблиц»), нужно выполнить следующий запрос:

mysql> DROP TABLE db_name.db_table;

Если БД была предварительно выбрана командой use, то в запросе следует указать только таблицу:

mysql> DROP TABLE db_table;

Теперь можно выйти из командной консоли MySQL командой exit. И выполнить загрузку дампа таблицы в БД:

$ mysql -u user -p < /home/username/backups/back.dump

В данном случае вместо «/home/username/backups/back.dump» следует использовать  местоположение, куда ранее был сохранён дамп.

Заключение

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Время на прочтение
4 мин

Количество просмотров 25K

MyISAM — основная, вернее, одна из главных (наряду с InnoDB) систем хранения данных в СУБД MySQL. При этом MyISAM таблицы повреждаются очень просто — с этим проблем нет никаких. Сложнее все повреждения ликвидировать, хотя это тоже можно сделать довольно быстро. В этом материале объясняется, как можно решить проблему с использованием myisamchk для идентификации проблемы с MyISAM и ее исправления.

Общеизвестно, что при создании таблицы в MySQL, создаются три различных файла: *.frm — формат таблицы, *.MYD (MyData) — хранение данных, *.MYI (MyIndex) — индекс. Для крупных баз данных стоит использовать InnoDB, поскольку здесь есть некоторая схожесть с Oracle и соответствующая функциональность.

В качестве примера демонстрации ошибки будем использовать вот это:

undef error - DBD::mysql::db selectrow_array failed: Table 'attach_data' is
marked as crashed and should be repaired [for Statement "SELECT LENGTH(thedata)
FROM attach_data WHERE id = ?"] at Bugzilla/Attachment.pm line 344
Bugzilla::Attachment::datasize('Bugzilla::Attachment=HASH(0x9df119c)') called

Понятно, что таблица attach_data повреждена, и ее нужно исправить. Таблицу будем исправлять с использованием myisamchk.

1. Определяем все поврежденные таблицы, используя myisamchk

# myisamchk /var/lib/mysql/bugs/*.MYI >> /tmp/myisamchk_log.txt
 
myisamchk: error: Wrong bytesec: 0-0-0 at linkstart: 18361936
MyISAM-table 'attach_data.MYI' is corrupted
Fix it using switch "-r" or "-o"
myisamchk: warning: 1 client is using or hasn't closed the table properly
MyISAM-table 'groups.MYI' is usable but should be fixed
myisamchk: warning: 1 client is using or hasn't closed the table properly
MyISAM-table 'profiles.MYI' is usable but should be fixed

Если указать вывод myisamchk во временный файл, на дисплее будут показаны только имена поврежденных таблиц. А вот в файле /tmp/myisamchk_log.txt будет указано гораздо больше данных включая имена неповрежденных таблиц:

Checking MyISAM file: user_group_map.MYI
Data records:     182   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1

2. Исправляем поврежденные таблицы, используя myisamchk

Для этого используем myisamchk, с опцией -r, как и показано ниже:

# myisamchk -r profiles.MYI
 
- recovering (with sort) MyISAM-table 'profiles.MYI'
Data records: 80
- Fixing index 1
- Fixing index 2

Здесь может появиться сообщение об ошибке: clients are using or haven’t closed the table properly, в случае, если таблицы до сих пор используются каким-либо приложением или другими таблицами. Для того, чтобы избежать появления этой ошибки, стоит завершить mysqld, прежде, чем начать исправление таблиц. Здесь можно использовать FLUSH TABLES.

3. Запускаем проверку и исправлением для всей БД MySQL

# myisamchk --silent --force --fast --update-state /var/lib/mysql/bugs/*.MYI
 
myisamchk: MyISAM file /var/lib/mysql/bugs/groups.MYI
myisamchk: warning: 1 client is using or hasn't closed the table properly
myisamchk: MyISAM file /var/lib/mysql/bugs/profiles.MYI
myisamchk: warning: 1 client is using or hasn't closed the table properly

-s: выводим только ошибки. Можно использовать двойной -s -s, чтобы сделать режим максимально «тихим»;
-f: автоматический перезапуск myisamchk с опцией -r, есть обнаружены ошибки;
-F: проверка только таблиц, которые не были закрыты в нормальном режиме;
-U: отмечаем таблицы, как поврежденные, если обнаружены ошибки.

4. Использование дополнительной памяти для больших БД MySQL

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

# myisamchk --silent --force --fast --update-state 
--key_buffer_size=512M --sort_buffer_size=512M 
--read_buffer_size=4M --write_buffer_size=4M 
/var/lib/mysql/bugs/*.MYI

5. Использование myisamchk для получения данных о таблице

При необходимости можно получить довольно много данных.

# myisamchk -dvv profiles.MYI
 
MyISAM file:         profiles.MYI
Record format:       Packed
Character set:       latin1_swedish_ci (8)
File-version:        1
Creation time:       2007-08-16 18:46:59
Status:              open,changed,analyzed,optimized keys,sorted index pages
Auto increment key:              1  Last value:                    88
Data records:                   88  Deleted blocks:                 0
Datafile parts:                118  Deleted data:                   0
Datafile pointer (bytes):        4  Keyfile pointer (bytes):        4
Datafile length:              6292  Keyfile length:              6144
Max datafile length:    4294967294  Max keyfile length: 4398046510079
Recordlength:                 2124
 
table description:
Key Start Len Index   Type                     Rec/key         Root  Blocksize
1   2     3   unique  int24                          1         1024       1024
2   5     765 unique  char packed stripped           1         2048       4096
 
Field Start Length Nullpos Nullbit Type
1     1     1
2     2     3                      no zeros
3     5     765                    no endspace

6. Все опции myisamchk

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

# myisamchk –help

Общие опции:

-s: только вывод ошибок;
-v: вывод большего количества информации;
-V: вывод версии и выход;
-w: ждать, если таблица заблокирована.

Опции проверки:

-c: проверка таблиц на ошибки;
-е: очень «грубая» проверка. Стоит использовать только в крайнем случае, если в обычном режиме ошибки не обнаруживаются;
-F: быстрая проверка, проверяются только таблицы, которые не закрывались правильно;
-С: проверка только таблиц, которые изменились со времени последней поверки;
-f: автоматический перезапуск myisamchk с опцией -r, есть обнаружены ошибки;
-i: вывод статистики по проверенным таблицам;
-m: облегченный режим проверки, быстрее, чем обычный, находится 99,99% ошибок;
-U: обновление статуса: пометка таблиц как поврежденных, если обнаруживаются любые ошибки;
-T: не помечать таблицы как проверенные.

Опции исправления:

-B: бэкап файла .MYD, «filename-time.BAK»;
–correct-checksum;
-е: попытка исправления максимального числа строк в файле данных. Кроме того, эта команда находит «мусорные» строки. Не стоит использовать эту команду, если ситуация не безнадежна;
-f: перезапись старых временных файлов;
-r: исправляет почти все, кроме уникальных ключей, которые на самом деле не уникальны;
-n: принудительная сортировка, даже, если временный файл получается очень большим;
-о: использование старого метода восстановления;
-q: быстрое исправление без модификации файла данных;
-u: распаковка файла, запакованного myisampack.

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

«MySQL Table помечен как сбойный, а последнее (автоматическое?) Восстановление завершилось неудачей».

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

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

Решение первое – Восстановить таблицу с помощью команды myisamchk

  1. Войдите на свой сервер, используя команду SSH, например – ssh [email protected]
  2. Остановите демон / службу MySQL, выполнив команду-service mysql stop
  3. Перейдите в свою базу данных MySQL. Каталог обычно находится в / var / lib / mysql. Используемая команда: cd / var / lib / mysql / YOUR_DATABASE_NAME
  4. Теперь вам нужно просто запустить команду myisamchk, выполнив – myisamchk -r table_name

Note – На предыдущем шаге вы должны заменить фактическое имя таблицы на «имя таблицы». В выводе команды будет указано восстановление таблицы, а также исправлены все поврежденные записи.

  1. Запустите службу MySQL снова, выполнив команду – запуск службы mysql

Проблема с таблицами MySQL теперь будет решена, и вы можете запрашивать таблицы в базе данных через MySQL CLI.

Решение второе – Найти и исправить сломанные таблицы

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

Чтобы найти таблицу, помеченную как поврежденную и нуждающуюся в ремонте, выполните эти команды

  1. # myisamchk -s /var/lib/mysql/*/*.MYI
  2. MyISAM-таблица ‘/var/lib/mysql/dbname/table_name.MYI’ помечена как сбойная и должна быть исправлена

Приведенная выше команда выведет список всех таблиц, которые помечены как аварийные и требуют ремонта.

  1. Чтобы восстановить таблицу, выполните следующую команду – # myisamchk -r /var/lib/mysql/dbname/table_name.MYI

Вам необходимо выполнить эту команду для каждой таблицы, которая помечена как поврежденная и требует ремонта. Каждый раз значение table_name будет отличаться.

  1. Приведенное выше решение устранит ошибку. Если это не нужно, остановите Демон / службу MySQL, выполнив команду mysql stop из службы.

После остановки веб-службы MySQL вам необходимо обновить состояние таблиц, чтобы MySQL CLI знал, что поврежденные таблицы были проверены и исправлены. Выполните приведенную ниже команду, чтобы обновить состояние таблицы.

  1. myisamchk -r –update-state /var/lib/mysql/dbname/table_name.MYI

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

  1. служба mysql start

Решение третье – Различные способы восстановления поврежденных таблиц

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

Этап первый – проверка таблиц

Запустите myisamchk * .MYI или myisamchk -e * .MYI. Вы также можете использовать опцию без вывода сообщений, чтобы скрыть ненужную информацию. Синтаксис команды: myisamchk –silent * .MYI

Некоторые из симптомов поврежденной таблицы проявляются в виде запросов, которые неожиданно прерываются, и вы получаете такие ошибки, как:

  • Неожиданный конец файла
  • Не удается найти файл tbl_name.MYI (код ошибки: nnn)
  • Запись файла разбита
  • Ошибка nnn из обработчика таблицы
  • tbl_name.frm заблокирован от изменений

Чтобы получить больше информации об ошибке, используйте run perror nnn, где nnn – номер ошибки.

Стадия Два – Легкий Безопасный Ремонт

После того, как вы нашли поврежденные таблицы, вам нужно попробовать команду

  1. Используйте myisamchk -r -q tbl_name

Здесь -r -q означает «режим быстрого восстановления». Эта команда попытается восстановить файл индекса таблицы, не касаясь файла данных. Если по какой-либо причине таблица не ремонтируется, выполните приведенные ниже команды.

  1. Создайте резервную копию файла данных, прежде чем продолжить
  2. Используйте myisamchk -r tbl_name. Здесь -r означает «режим восстановления». Команда удаляет неправильные строки и удаленные строки из файла данных и восстанавливает индексный файл. Если этот шаг не удался, выполните команду ниже
  3. Используйте myisamchk –safe-recovery tbl_name. Это старый метод восстановления, используемый в особых случаях, когда нормальный режим восстановления не срабатывает

Поскольку режим безопасного восстановления медленный, вам нужно набраться терпения, пока происходит восстановление данных. Чтобы ускорить процесс восстановления, при запуске myisamchk установите значения переменных key_buffer_size и sort_buffer_size для каждой примерно 25% доступной памяти.

Этап 3 – Сложный ремонт

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

Чтобы разрешить такие случаи, вам нужно создать новый индексный файл. Вот шаги, чтобы следовать.

  1. Переместить файл данных в безопасное место
  2. Создайте новый пустой файл данных и индексный файл, используя команды, приведенные ниже
    • mysql db_name
    • SET autocommit = 1;
    • TRUNCATE TABLE tbl_name;
    • Уволиться
  3. Скопируйте старый файл данных в новый файл данных.
  4. Теперь вернитесь к этапу 2 и выполните команды, и они должны работать для восстановления таблиц.

Что делать, если ни одно из этих решений не работает?

Если вы не можете устранить ошибку с помощью вышеупомянутых методов, не отчаивайтесь. Вы можете использовать автоматизированное решение проблемы. Stellar Repair for 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;
Предполагая, что ремонт был успешным, вы увидите сообщение, подобное следующему:

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

9 апреля, 2019 12:02 пп
3 415 views
| Комментариев нет

MariaDB, mySQL

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

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

  • Доступ к логам ошибок 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: MySQL

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