В этой статье мы рассматриваем распространённую проблему, с которой пользователи часто сталкиваются при попытке импортировать данные из MySQL в Manticore.
Возможность Manticore индексировать данные из MySQL с помощью инструмента indexer широко известна. Однако, прежде чем перейти к конкретной проблеме, озаглавленной в этой статье, давайте сначала разберёмся в отношениях между Manticore и MySQL.
В настоящее время наиболее мощным API, предлагаемым Manticore, является SphinxQL. Этот API использует транспортный протокол MySQL, что значительно упрощает задачи поиска и другие операции благодаря схожести синтаксиса языка запросов с MySQL. Команды протокола MySQL, необходимые для SphinxQL, реализованы нативно в searchd. Поэтому Manticore не требует наличия минимальной библиотеки MySQL или самого MySQL на хосте, где установлен Manticore.
indexer может взаимодействовать с базой данных MySQL и извлекать данные для построения индекса Manticore. Это соединение с MySQL осуществляется через официальный C++‑клиент, предоставляемый разработчикам MySQL. Важно отметить, что при компиляции Manticore библиотека клиента MySQL не встраивается в бинарные файлы Manticore. То же самое относится к PostgreSQL, XML‑каналам и ODBC. Если пользователь indexer хочет подключиться к PostgreSQL, MySQL или базе данных, поддерживающей ODBC, необходимые драйверные библиотеки должны быть установлены на той же системе, где находится indexer.
Итак, что вызывает сообщение об ошибке 'MySQL source wasn't initialized. Wrong name in dlopen?'?
Существует несколько возможных причин:
libmysqlclientможет быть не установлен в вашей системе. Эта библиотека поставляется с пакетом Linux и может иметь разные названия на разных платформах:- В CentOS/RHEL она называется
mysql-libs. - Пользователи Debian/Ubuntu должны искать
default-libmysqlclient-dev. - В Alpine доступны пакеты
mariadb-connector-c-dev.
- В CentOS/RHEL она называется
Даже если
libmysqlclientустановлен, он может быть неверной версии.indexerкомпилируется против определённой версии клиентской библиотеки, которая обычно включена в стандартный пакет MySQL дистрибутива Linux. Версии MySQL могут различаться между дистрибутивами: некоторые используют официальную MySQL, а другие по умолчанию используют MariaDB.Проблемы возникают, когда вы обновляете до новой мажорной версии MySQL или переключаетесь на другой вариант MySQL. Оба сценария могут привести к проблемам совместимости, поскольку такие действия могут привести к появлению другой (обычно более новой) версии клиентской библиотеки.
Дистрибутивы MySQL предоставляют пакет compatibility, включающий более старые версии клиентской библиотеки для приложений, рассчитанных на работу с этими версиями. Например, если вы переходите на дистрибутив, где по умолчанию используется MariaDB, но хотите использовать последнюю официальную MySQL, следует установить совместимый пакет
mysql-community-libs-compatиз официального источника MySQL.Вы могли установить неподходящий пакет Manticore. Например, вы используете Ubuntu, но по ошибке установили Debian‑пакет Manticore. Хотя
searchdможет работать,indexerможет не функционировать, если он предназначен для другой версии, чем та, что поставляется вашим текущим дистрибутивом.Менее распространённый сценарий возникает, когда MySQL установлен вручную, или библиотека клиента MySQL по какой‑то причине не включена в путь общих библиотек. Хотя Manticore безразличен к способу установки MySQL, он должен уметь находить клиентскую библиотеку, используя путь общих библиотек операционной системы, обычно расположенный в
/usr/libили/usr/lib/x86_64-linux-gnu/. В таких случаяхlibmysqlclientследует добавить (или создать символическую ссылку) в путь по умолчанию ld. Если вы используете пользовательский путь, его необходимо добавить в/etc/ld.so.conf.d/. Например, в некоторых дистрибутивах клиентские библиотеки находятся в папке/usr/lib/mysql, и пакет, устанавливающий эти файлы, также добавляет запись в/etc/ld.so.conf.d/. Альтернативно, путь ld можно скорректировать, включив библиотеку MySQL при запуске демона, напримерLD_LIBRARY_PATH=/path/to/mysql searchd. Если вы используете файл unit systemd, его можно задать вEnvironment, но обычно рекомендуется решить проблему пути клиентской библиотеки на уровне системы. Это связано с возможными изменениями unit‑файлов в будущих обновлениях.