Pull to refresh

MySQL: Поиск по FULLTEXT индексу вешает базу. Решение проблемы

Reading time1 min
Views895
Ловил несколько месяцев назад один трудноуловимый баг с поиском по базе. А сегодня, прочитав топик HTTP, RFC 3986 и браузеры, решил рассказать общественности, вдруг у кого-то тоже всплывет.

Проблема
Есть сайт в UTF8. Есть MySQL база в UTF8 и FULLTEXT индексом. Поиск по нему идет в BOOLEAN MODE. При определенном виде запросов БД перестаёт отвечать. Причем только для одной БД в рамках сервера MySQL. Нормальный перезапуск демона не срабатывает, получается ребутнуть только жестким mysql -9.
Замечена такая неприятность на MySQL 5.0.51a и выше

Почему?
А дело всё в том, что это какой-то странный баг самого MySQL и решать они его почему-то не торопятся. Оказывается, если фраза для поиска будет в cp1251 кодировке, а база в UTF8, то на N-ном таком запросе БД повиснет в состоянии FULLTEXT Initialization, причем залочит все таблицы, а не только одну с индексом. Проявляется не с первого запроса, но раз-два в день может случаться.

Лекарство
Перед подстановкой поисковой фразы в запрос переконвертируем её в UTF8, если надо.

Кто виноват?
А вот тут я расскажу, при чем тут топик, который мне напомнил эту историю.
Я поддерживаю один сайт, как хобби. С сайта можно поставить поисковый плагин к браузеру в формате OpenSearch. Как выяснилось, браузеры некоторых пользователей при поиске через этот плагин почему-то думают, что сайту нужна Windows-1251 кодировка. Откуда у них такая уверенность, я не знаю. Возможно Firefox запомнил, что когда-то давно сайт был в Windows кодировке. Возможно на это влияет отсутствие кодировки в коде плагина. А может просто магнитные бури, проблема-то появлялась раз-два в день :)

Ссылка на багрепорт
bugs.mysql.com/bug.php?id=37067
Tags:
Hubs:
Total votes 22: ↑21 and ↓1+20
Comments4

Articles