28.2.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文件按如下所示设置库 Descriptors。库 Descriptors 包括单个通用服务器插件 Descriptors。

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)table 示在诸如INSTALL PLUGINUNINSTALL PLUGIN之类的语句中用于引用插件的名称。这也是SHOW PLUGINSINFORMATION_SCHEMA.PLUGINS显示的名称。

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

struct st_mysql_daemon daemon_example_plugin=
{ MYSQL_DAEMON_INTERFACE_VERSION  };

特定于类型的结构没有接口功能。服务器和插件之间没有通信,除了服务器从通用插件 Descriptors 中调用初始化和反初始化函数来启动和停止插件:

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

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

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

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

INSTALL PLUGIN daemon_example SONAME 'libdaemon_example.so';

有关插件加载的其他信息,请参见第 5.5.1 节“安装和卸载插件”

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

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

UNINSTALL PLUGIN daemon_example;