Manticore使用indexer工具从MySQL索引数据的能力广为人知。然而,在深入探讨本文标题中提到的具体问题之前,让我们首先了解Manticore与MySQL之间的关系。
目前,Manticore提供的最强大的API是SphinxQL。该API使用MySQL传输协议,由于其查询语言语法与MySQL的相似性,大大简化了搜索任务和其他操作。SphinxQL所需的MySQL协议命令在searchd中本地实现。因此,Manticore在安装Manticore的主机上不需要最低的MySQL库或MySQL要求。
indexer工具可以连接到MySQL数据库并检索数据以构建Manticore索引。这种连接到MySQL数据库的方式通过为MySQL开发人员提供的官方C++客户端实现。重要的是,当Manticore被编译时,MySQL客户端库不会嵌入到Manticore二进制文件中。PostgreSQL、XML管道和ODBC也是如此。如果indexer用户希望连接到PostgreSQL、MySQL或支持ODBC的数据库,则必须在indexer所在的系统上安装相应的驱动程序库。
那么,是什么导致了“MySQL源未初始化。dlopen中的名称错误?”这个错误信息?
有几个潜在的原因:
您的系统上可能未安装libmysqlclient。这个库随Linux软件包分发,并且在不同平台上可能有不同的名称:
在CentOS/RHEL上,它被称为
mysql-libs。- Debian/Ubuntu用户应查找
default-libmysqlclient-dev。 - Alpine包含
mariadb-connector-c-dev包。 - 即使安装了
libmysqlclient,它可能不是正确的版本。Indexer是针对特定客户端库版本编译的,这通常与Linux发行版的默认MySQL软件包捆绑在一起。MySQL版本在不同Linux发行版之间可能有所不同,有些使用官方MySQL,而有些则选择MariaDB作为默认。
- Debian/Ubuntu用户应查找
当您升级到MySQL的新主要版本或切换到不同的MySQL变体时,会出现问题。这两种情况都可能导致兼容性问题,因为这些操作可能会引入不同(通常是更新)版本的客户端库。
MySQL发行版提供了一个兼容性包,其中包含旧版本的客户端库,供设计用于这些版本的应用程序使用。例如,如果您切换到默认使用MariaDB的发行版,但希望使用最新的官方MySQL,则应从官方MySQL源安装
mysql-community-libs-compat兼容包。您可能安装了不合适的Manticore包。例如,您可能正在使用Ubuntu,但意外安装了Manticore的Debian包。虽然
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。如果您使用systemd单元文件,可以在Environment中设置它,但通常建议系统范围地解决客户端库路径。这是由于未来更新可能会导致单元文件发生变化。A less common scenario occurs when MySQL is manually installed, or the MySQL client library is not included in the shared libraries path for some reason. Although Manticore is indifferent to the installation method of MySQL, it must be able to locate the client library using the operating system's shared library path, typically found at
/usr/libor/usr/lib/x86_64-linux-gnu/. In such cases,libmysqlclientshould be added (or symlinked) to the default ld path. If you're using a custom path, you'll need to include that path in/etc/ld.so.conf.d/. For instance, in some distributions, the client libraries are situated in the/usr/lib/mysqlfolder, and the package that installs these files also contributes an entry to/etc/ld.so.conf.d/. Alternatively, the ld library path can be adjusted to include the MySQL library when initiating a daemon, such asLD_LIBRARY_PATH=/path/to/mysql searchd. If you utilize a systemd unit file, you can set it in theEnvironment, but it is generally recommended to resolve the client library path system-wide. This is due to potential changes in unit files brought about by future updates.