扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  / 4.4 编写插件  /  4.4.5 编写守护进程插件

4.4.5 编写守护进程插件

守护进程插件是一种简单类型的插件,用于应由服务器运行但不与其通信的代码。本节介绍如何使用 plugin/daemon_exampleMySQL 源代码分发目录中的示例插件编写守护进程服务器插件。该目录包含 daemon_example.cc名为守护程序插件的源文件,该插件daemon_example定期将心跳字符串写入 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成员 ( ) 表示在or daemon_example等​​语句中用于引用插件的 名称。这也是或 显示的名称。 INSTALL PLUGINUNINSTALL PLUGINSHOW 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;