扩展 MySQL 8.4  /  ...  /  编写守护进程插件

4.4.5 编写守护进程插件

守护进程插件是一种简单的插件类型,用于运行服务器应该运行但又不与其通信的代码。本节介绍如何编写守护进程服务器插件,使用 MySQL 源代码发行版中 plugin/daemon_example 目录中的示例插件。该目录包含名为 daemon_example 的守护进程插件的 daemon_example.cc 源文件,该插件定期将心跳字符串写入数据目录中名为 mysql-heartbeat.log 的文件。

要编写守护进程插件,请在插件源文件中包含以下头文件。根据插件的功能和要求,可能还需要其他 MySQL 或通用头文件。

#include <mysql/plugin.h>

plugin.h 定义了 MYSQL_DAEMON_PLUGIN 服务器插件类型和声明插件所需的数据结构。

daemon_example.cc 文件设置库描述符如下。库描述符包含一个通用的服务器插件描述符。

mysql_declare_plugin(daemon_example)
{
  MYSQL_DAEMON_PLUGIN,
  &daemon_example_plugin,
  "daemon_example",
  "Brian Aker",
  "Daemon example, creates a heartbeat beat file in mysql-heartbeat.log",
  PLUGIN_LICENSE_GPL,
  daemon_example_plugin_init, /* Plugin Init */
  daemon_example_plugin_deinit, /* Plugin Deinit */
  0x0100 /* 1.0 */,
  NULL,                       /* status variables                */
  NULL,                       /* system variables                */
  NULL,                       /* config options                  */
  0,                          /* flags                           */
}
mysql_declare_plugin_end;

name 成员(daemon_example)表示用于在诸如 INSTALL PLUGINUNINSTALL PLUGIN 等语句中引用插件的名称。这也是 SHOW PLUGINSINFORMATION_SCHEMA.PLUGINS 显示的名称。

插件描述符的第二个成员 daemon_example_plugin 指向特定于类型的守护进程插件描述符。此结构仅包含特定于类型的 API 版本号

struct st_mysql_daemon daemon_example_plugin=
{ MYSQL_DAEMON_INTERFACE_VERSION  };

特定于类型的结构没有接口函数。服务器和插件之间没有通信,除了服务器从通用插件描述符调用初始化和去初始化函数来启动和停止插件之外

  • daemon_example_plugin_init() 打开心跳文件并生成一个线程,该线程定期唤醒并将下一条消息写入文件。

  • daemon_example_plugin_deinit() 关闭文件并执行其他清理工作。

要编译和安装插件库文件,请使用 第 4.4.3 节 “编译和安装插件库” 中的说明进行操作。要使库文件可供使用,请将其安装在插件目录中(由 plugin_dir 系统变量命名的目录)。对于 daemon_example 插件,当您从源代码构建 MySQL 时,它将被编译和安装。它也包含在二进制发行版中。构建过程生成一个名为 libdaemon_example.so 的共享对象库(.so 后缀可能会因平台而异)。

要使用插件,请在服务器上注册它。例如,要在运行时注册插件,请使用以下语句,并根据您的平台调整 .so 后缀

INSTALL PLUGIN daemon_example SONAME 'libdaemon_example.so';

有关插件加载的其他信息,请参见 安装和卸载插件

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS 表或使用 SHOW PLUGINS 语句。请参见 获取服务器插件信息

当插件加载时,它会定期将心跳字符串写入数据目录中名为 mysql-heartbeat.log 的文件。此文件会无限增长,因此,在您确认插件运行正常后,请卸载它

UNINSTALL PLUGIN daemon_example;