mysql
1.什么是DaemonPlugin
顾名思义,daemon plugin就是一种用来在后台运行的插件,在插件中,我们可以创建一些后台线程来做些有趣的事情。大名鼎鼎的handlesocket就是一个daemon plugin。而在mysql5.6中,也是通过daemon plugin来实现了memcached功能。
2.为什么使用DaemonPlugin
就像handlersocket,大胆的想象力能够创造无限的可能。MySQL Plugin的诱人之处在于其与Mysqld处于同一进程空间中,可以利用任何mysql内核的函数。Handlersocket在实现时,构造出相关参数并直接调用存储引擎的接口,从而穿越了语法解析和优化部分,对于逻辑简单的查询而言,可以极大的提高效率。
另外所有的plugin都提供了showstatus和show variables 命令的接口,因此我们可以利用plugin来显示一些我们想要的信息,例如mysql内部的全局变量值。
总的来说,daemon plugin可以做到以下几点:
1) 创建后台线程,扩展mysql功能
2)扩展status和variables信息
Deamon plugin在mysqld启动时进行初始化,执行完init函数, 因此并不适用于与服务器进行通信的情形,mysql也没有提供任何相关的API
3.如何编写daemonplugin
这里涉及到的一些结构体,对其他类型的plugin而言也是通用的
1)st_mysql_plugin
无论声明哪种plugin,至少要包含该结构体
字段
类型
描述
type
int
用于描述plugin的类型,随着版本更新,越来越多,在5.5中包含8种类型:
MYSQL_UDF_PLUGIN
MYSQL_STORAGE_ENGINE_PLUGIN
MYSQL_FTPARSER_PLUGIN
MYSQL_DAEMON_PLUGIN
MYSQL_INFORMATION_SCHEMA_PLUGIN
MYSQL_AUDIT_PLUGIN
MYSQL_REPLICATION_PLUGIN
MYSQL_AUTHENTICATION_PLUGIN
info
void*
用于指向特定的plugin描述符结构体,在daemon plugin中结构体为st_mysql_daemon,一般第一个字段都是插件接口的版本号
name
const char*
plugin的名字,需要和安装时的名字一致
author
const char*
plugin的作者信息,会在i_s.plugins表中显示
descry
const char*
描述插件
license
ubt
插件许可证:PLUGIN_LICENSE_PROPRIETARY
PLUGIN_LICENSE_GPL
PLUGIN_LICENSE_BSD
init
int (*init)(void *)
当插件被加载时或者mysqld重启时会执行该函数,一般我们会在这里创建好后台线程
deinit
int (*deinit)(void *);
当插件被卸载时做的工作,例如取消线程,清理内存等
version
unsigned int
plugin的版本信息
status_vars
st_mysql_show_var*
描述在执行show status时显示的信息
system_vars
st_mysql_sys_var **
描述在执行show variables显示的信息
__reserved1
void*
注释说为检查依赖而保留,不太明白,直接设为NULL即可
flags
unsigned long
5.5之后增加的字段,plugin的flag:0、
PLUGIN_OPT_NO_INSTALL(不可动态加载)、PLUGIN_OPT_NO_UNINSTALL(不可动态加载)
在plugin.h里提供了宏,我们可以通过宏来声明插件:
mysql_declare_plugin(my_plugin)
{},
{},
……
mysql_declare_plugin_end;
在两个宏之间,我们可以声明多个插件,也就是说在一个文件里,我们可以定义多个Plugin。
上面提到三个结构体,需要在plugin里单独进行定义:
a. st_mysql_daemon
该结构体只包含一个字段,用于声明daemon plugin的版本信息
字段
类型
描述
interface_version
int
一般值为
MYSQL_DAEMON_INTERFACE_VERSION
也许有同学注意到了,这上面提到了两个version,即st_mysql_plugin里的version和st_mysql_daemon里的version,这两者是不相同的。
st_mysql_plugin.version记录的是该plugin的版本号,使用16进制表示,低8位存储副版本号,其他存储主版本号。
而st_mysql_daemon里存储的是daemonplugin接口