# MySQL source wasn't initialized. Wrong name in dlopen?

В этой статье мы рассматриваем распространённую проблему, с которой пользователи часто сталкиваются при попытке импортировать данные из 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`.
- Даже если `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‑файлов в будущих обновлениях.
