28.3 MySQL 插件服务

MySQL 服务器插件可以访问服务器“插件服务”。插件服务接口公开了插件可以调用的服务器功能。它是插件 API 的补充,并具有以下 Feature:

  • 服务使插件可以使用普通函数调用来访问服务器内部的代码。服务也可用于用户定义的功能(UDF)。

  • 服务是可移植的,可以在多个平台上工作。

  • 该接口包括一个版本控制机制,以便可以在加载时根据插件版本检查服务器支持的服务版本。版本控制可以防止服务器提供的服务版本与插件预期或要求的服务版本之间存在不兼容性。

  • 有关用于测试插件服务的插件的信息,请参阅 MySQL 服务器 Doxygen 文档的“用于测试插件服务的插件”部分,位于https://dev.mysql.com/doc/index-other.html

插件服务接口与插件 API 区别如下:

  • 插件 API 允许服务器使用插件。调用计划由服务器来调用插件。这使插件可以扩展服务器功能或注册以接收有关服务器处理的通知。

  • 插件服务接口使插件可以在服务器内部调用代码。调用倡议在于用于调用服务功能的插件。这使得服务器中已经实现的功能可以被许多插件使用。他们不需要自己单独实施它。

要确定存在哪些服务及其提供的功能,请查看 MySQL 源代码分发的include/mysql目录。相关文件为:

  • plugin.h包括services.h,这是“ umbrella”头,其中包括所有可用的特定于服务的头文件。

  • 特定于服务的 Headers 的名称格式为service_xxx.h

每个特定于服务的 Headers 应包含 Comments,这些 Comments 提供给定服务的完整用法文档,包括可用的服务功能,它们的调用 Sequences 和返回值。

对于希望修改服务器以添加新服务的开发人员,请参见MySQL 内部:MySQL 插件服务

可用服务包括:

  • locking_service:一种服务,该服务实现具有三个属性的锁:锁名称空间,锁名称和锁模式。该锁定接口有两个级别:1)作为 C 语言接口,可以从服务器插件或用户定义的函数作为插件服务调用; 2)在 SQL 级别,作为一组用户定义的函数,这些函数 Map 到对服务例程的调用。有关更多信息,请参见第 28.3.1 节“锁定服务”

  • my_plugin_log_service:使插件能够报告错误并指定错误消息的服务。服务器将消息写入其错误日志。

  • my_snprintf:字符串格式化服务,可在各个平台上产生一致的结果。

  • my_thd_scheduler:用于插件选择线程计划程序的服务。

  • mysql_password_policy:用于密码验证和强度检查的服务。

  • mysql_string:用于字符串操作的服务。

  • security_context:使插件能够检查或操纵线程安全性上下文的服务。此服务提供设置程序和获取程序例程,以访问服务器Security_context类的属性,其中包括诸如 os 用户和主机,经过身份验证的用户和主机以及 Client 端 IP 地址之类的属性。

  • thd_alloc:内存分配服务。

  • thd_wait:用于插件报告睡眠或失速状态的服务。

本节的其余部分描述了插件如何使用作为服务可用的服务器功能。另请参见“守护程序”示例插件的源,该插件使用my_snprintf服务。在 MySQL 源代码发布中,该插件位于plugin/daemon_example目录中。

要使用插件中的一项或多项服务,插件源文件必须包含plugin.h头文件才能访问与服务相关的信息:

#include <mysql/plugin.h>

这不代 table 任何额外的安装费用。插件无论如何都必须包含该文件,因为它包含每个插件都需要的定义和结构。

要访问服务,插件会像其他功能一样调用服务功能。例如,要将字符串格式化为缓冲区以进行打印,请调用由同名服务提供的my_snprintf()函数:

char buffer[BUFFER_SIZE];

my_snprintf(buffer, sizeof(buffer), format_string, argument_to_format, ...);

要报告服务器将写入错误日志的错误,请首先选择一个错误级别。 mysql/service_my_plugin_log.h定义以下级别:

enum plugin_log_level
{
  MY_ERROR_LEVEL,
  MY_WARNING_LEVEL,
  MY_INFORMATION_LEVEL
};

然后调用my_plugin_log_message()

int my_plugin_log_message(MYSQL_PLUGIN *plugin, enum plugin_log_level level,
                          const char *format, ...);

For example:

my_plugin_log_message(plugin_ptr, MY_ERROR_LEVEL, "Cannot initialize plugin");

某些插件服务可能由*插件提供,因此仅在加载了提供服务的插件时可用。使用此类服务的任何 MySQL 组件都应检查该服务是否可用。

生成插件时,请在链接时使用-lmysqlservices标志链接到libmysqlservices库。例如,对于 CMake ,将其放在顶级CMakeLists.txt文件中:

FIND_LIBRARY(MYSQLSERVICES_LIB mysqlservices
 PATHS "${MYSQL_SRCDIR}/libservices" NO_DEFAULT_PATH)

将其放在包含插件源的目录中的CMakeLists.txt文件中:

# the plugin needs the mysql services library for error logging
TARGET_LINK_LIBRARIES (your_plugin_library_name ${MYSQLSERVICES_LIB})