У нас есть база данных MySql 5.5, на которой работает InnoDB в Linux. В одной таблице (с именем table_search) работает MyISAM, чтобы иметь возможность выполнять полнотекстовый поиск. В таблице 823 368 строк.
Вчера у нас произошел сбой сервера, чтобы восстановить его снова, мы переместили необработанные данные на новый сервер, и теперь мы работаем на новом сервере.
Сначала все работало нормально, но через час в журналах ошибок мы получили что-то вроде этого:
1. Duplicate entry 'X-Y-Z' for key index_titles (where index_titles is an index in table_search)
2. After this there where lots of errors: Incorrect key file for table './database/table_search.MYI'; try to repair it
3. After this there where lots of errors: Table './database/table_search' is marked as crashed and should be repaired
Мы пытались исправить это с помощью:
myisamchk table_search.MYI
Мы получили такую ошибку:
myisamchk: error: Keypointers and record positions doesn't match
MyISAM-table 'table_search.MYI' is corrupted
Затем мы попробовали:
myisamchk -r -o table_search.MYI
Теперь все снова работало, пока час назад не случилось то же самое. Итак, мы снова использовали myisamchk, и он работает.
Но это не кажется таким стабильным, как это случилось снова. Что мы можем сделать, чтобы этого больше не повторилось? Почему он испорчен? Каково решение?
Решение было другое. Мы перезапустили сервер, используя:
ft_min_word_len=3
(извините, что не упомянул об этом в вопросе)
В этом документе на MySql мы узнали, что:
Если вы используете myisamchk для выполнения операции, которая изменяет индексы таблиц (например, восстановление или анализ), индексы FULLTEXT перестраиваются с использованием значений полнотекстовых параметров по умолчанию для минимальной и максимальной длины слова и файла стоп-слов, если вы не укажете иное. Это может привести к сбою запросов.
Это было решение:
shell> myisamchk --recover --ft_min_word_len=3 table_search.MYI
Теперь сервер работает нормально почти 24 часа.
Звучит так, как будто ваша таблица повреждена, и myisamchk не может ее восстановить.
Думаю, вам лучше всего восстановить таблицу из резервной копии или, если затронут только ваш поисковый индекс, воссоздать и заново заполнить эту таблицу.