Днем я пошел на работу и был потрясен, узнав, что на моем веб-сайте dedecms возникла проблема. Когда я посетил его, я обнаружил полноэкранную ошибку и проверил журнал MySQL, и появилось сообщение об ошибке:
Таблица '.. dedecmsv4dede_archives' помечен как поврежденный и должен быть исправлен.
В нем говорится, что таблица статей dede_archives помечена как проблемная и требует восстановления. Поэтому я быстро восстановил исторические данные и зашел в Интернет, чтобы выяснить причину. В конечном итоге проблема будет решена. Решение следующее:
Найдите инструмент bin/myisamchk в каталоге установки MySQL и введите в командной строке:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
Тогда инструмент myisamchk поможет вам восстановить индекс. таблицы данных. Перезапустите MySQL, и проблема решена.
Анализ проблемы:
1. Причина ошибки. Некоторые пользователи сети сказали, что это ошибка индекса, вызванная частыми запросами и обновлением таблицы dede_archives. Поскольку моя страница была сгенерирована не статически, а динамически, я вполне согласен с этим утверждением. . Также сообщается, что база данных MYSQL по какой-то причине была повреждена. Например, внезапное отключение электроэнергии на сервере базы данных, некоторые операции с исходным файлом таблицы при предоставлении услуг таблице базы данных могут привести к сбою базы данных MYSQL. повреждена. Таблица повреждена, и данные не могут быть прочитаны. Короче говоря, часы повреждены из-за каких-то непостижимых проблем.
Номер проблемы 145
2. Решение проблемы.
Когда вы пытаетесь исправить проблему с поврежденной таблицей, существует три типа восстановления. Если вы получаете сообщение об ошибке о том, что временный файл не может быть создан, удалите файл, указанный в сообщении, и повторите попытку — обычно это остаток предыдущей операции восстановления.
Три исправления заключаются в следующем:
% myisamchk --recover --quick /путь/к/имя_таблицы
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /путь/к/имя_таблицы
Первый — самый быстрый и используется для устранения наиболее распространенных проблем; последний — самый медленный и используется для устранения проблем, которые невозможно устранить другими методами.
Проверка и восстановление файлов данных MySQL. Если описанные выше методы не могут восстановить поврежденную таблицу, прежде чем сдаваться, вы также можете попробовать эти два совета:
Если вы подозреваете, что в индексном файле (*.MYI) таблицы произошла непоправимая ошибка или даже файл утерян, вы можете использовать файл данных (*.MYD) и файл формата данных (*.frm), чтобы регенерировать его. Сначала создайте копию файла данных (tblName.MYD). Перезапустите службу MySQL и подключитесь к ней. Используйте следующую команду, чтобы удалить содержимое таблицы:
mysql> УДАЛИТЬ ИЗ имени таблицы;
При удалении содержимого таблицы будет создан новый индексный файл. Выйдите из системы и снова закройте службу, затем перезапишите новый (пустой) файл данных только что сохраненным файлом данных (tblName.MYD). Наконец, используйте myisamchk для выполнения стандартного восстановления (второй метод выше) для регенерации данных индекса на основе содержимого данных таблицы и файла формата таблицы.
Если файл формата вашей таблицы (tblName.frm) отсутствует или имеет непоправимую ошибку, но вы знаете, как использовать соответствующий оператор CREATE TABLE для повторного создания таблицы, вы можете восстановить новый файл .frm и использовать его со своими файлами данных. и индексные файлы (если есть проблемы с индексным файлом, используйте описанный выше метод, чтобы восстановить новый). Сначала сделайте копию файлов данных и индекса, а затем удалите исходные файлы (удалите все записи, относящиеся к этой таблице, в каталоге данных).
Запустите службу MySQL и создайте новую таблицу, используя исходный файл CREATE TABLE. Новый файл .frm должен работать нормально, но лучше всего выполнить стандартное восстановление (второй метод выше).
3. Знакомство с инструментом myisamchk (см. официальное руководство по MySQL).
Утилита myisamchk может использоваться для получения информации о таблицах базы данных или для их проверки, исправления и оптимизации. myisamchk применяется к таблицам MyISAM (таблицам, соответствующим файлам .MYI и .MYD).
Метод для вызова myisamchk:
оболочка> myisamchk [опции] имя_таблицы ...
options определяет, что вы хотите, чтобы myisamchk делал. Они описаны позже. Вы также можете получить список опций, вызвав myisamchk --help.
tbl_name — это таблица базы данных, которую вы хотите проверить или восстановить. Если вы не запускаете myisamchk где-то в каталоге базы данных, вам необходимо указать путь к каталогу базы данных, поскольку myisamchk не знает, где находится ваша база данных. Фактически, myisamchk не заботится о том, находится ли файл, с которым вы работаете, в каталоге базы данных; вы можете скопировать файл, соответствующий таблице базы данных, в другое место и выполнить там операцию восстановления;
При желании вы можете использовать командную строку myisamchk для присвоения имен нескольким таблицам. Вы также можете указать таблицу, назвав индексный файл (с суффиксом «.MYI»). Это позволяет вам указать все таблицы в каталоге, используя схему «*.MYI». Например, если вы находитесь в каталоге базы данных, вы можете проверить все таблицы MyISAM в каталоге следующим образом:
shell> myisamchk *.MYI
Если вы не находитесь в каталоге базы данных, вы можете проверить там все таблицы, указав путь к каталогу:
shell>myisamchk /path/to/database_dir/*.MYI
Вы даже можете проверить все таблицы во всех базах данных, указав подстановочный знак для пути к каталогу данных MySQL:
Shell> myisamchk /path/to/datadir/*/*.MYI
Рекомендуемый способ быстрой проверки всех таблиц MyISAM:
Shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
Если вы хотите проверить все таблицы MyISAM и восстановить поврежденные таблицы, вы можете использовать следующую команду:
Shell> myisamchk --silent --force --fast --update-state
-O key_buffer=64M -O sort_buffer=64M
-O read_buffer=1M -O write_buffer=1M
/путь/к/каталогу/данных/*/*.MYI
Эта команда предполагает, что у вас более 64 МБ свободной памяти. Подробную информацию о выделении памяти с помощью myisamchk см. в Разделе 5.9.5.5, «Использование памяти myisamchk».
При запуске myisamchk вы должны убедиться, что другие программы не используют таблицу. В противном случае при запуске myisamchk будет отображено следующее сообщение об ошибке:
предупреждение: клиенты используют или не закрыли таблицу должным образом.
Это означает, что вы пытаетесь проверить таблицу, которая обновляется другой программой (например, сервером mysqld), которая не закрыла файл или завершила работу, не закрыв файл должным образом.
Если mysqld запущен, вы должны принудительно сбросить все изменения таблицы, все еще находящиеся в памяти, с помощью FLUSH TABLES. При запуске myisamchk вы должны убедиться, что другие программы не используют таблицу. Самый простой способ избежать этой проблемы — использовать CHECK TABLE вместо myisamchk для проверки таблицы.