扩展 MySQL 9.0  /  ...  /  编写守护程序插件

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;