Mysql现在很多模块都是通过plugin的方式连接到 Mysql核心中的,除了大家熟悉的存储引擎都是Plugin之外,Mysql还支持其他类型的plugin。
主要数据结构和定义
在 MySQL 5.7.25 中,主要有以下几种类型:储存引擎(storage engines)
全文索引解析插件(Full-text parsers)
守护插件(Daemons)。监控mysql运行状态
INFORMATION_SCHEMA 插件(INFORMATION_SCHEMA tables)。INFORMATION_SCHEMA plugins支持创建包含通过 INFORMATION_SCHEMA 数据库 向用户公开的服务器元数据的表 。 例如, InnoDB 使用 INFORMATION_SCHEMA 插件提供包含有关当前事务和锁的信息的表。
审计插件。MySQL服务器提供可插拔的审计接口,可以将有关服务器操作的信息报告给感兴趣的各方。 这些操作会发生审核通知(尽管接口是通用的,服务器可以修改为报告其他操作):1)将消息写入常规查询日志(如果启用了日志);2)将消息写入错误日志;3)将查询结果发送给客户端。审计插件可以向审计接口注册,以接收有关服务器操作的通知。 当服务器内发生可审计事件时,服务器确定是否需要通知。 对于每个已注册的审计插件,服务器会根据插件感兴趣的事件类检查事件,如果匹配则将事件传递给插件。此接口使审计插件仅接收有关其认为重要的事件类中的操作的通知,并忽略其他操作。 该接口提供将操作分类为事件类,并进一步划分为每个类中的事件子类。当审计插件被通知可审计事件时,它会收到指向当前THD结构的指针和指向包含有关事件信息的结构的指针。 插件可以检查事件并执行适当的审计操作。 例如,插件可以查看生成结果集或记录的语句,结果中的行数,当前用户的操作对象,或失败操作的错误代码。
日志同步插件(Semisynchronous replication)
认证插件(Authentication)。MySQL支持可插拔身份验证。服务器端和客户端都存在身份验证插件。服务器端的插件实现了身份验证方法,供客户端连接到服务器时使用。客户端上的插件与服务器端插件通信,以提供它所需的身份验证信息。客户端插件可以与用户交互,执行诸如请求密码或其他认证凭证的任务以发送到服务器。
密码验证插件(Password validation and strength checking)。MySQL服务器提供了一个用于编写测试密码的插件的接口。 这样的插件实现了两个功能:1)在分配密码(例如 CREATE USER 和 ALTER USER 语句)的 语句中拒绝太弱的密码 。2)评估 VALIDATE_PASSWORD_STRENGTH() SQL函数 的潜在密码的强度 。
密钥环插件(Keyring)。MySQL服务器支持密钥环插件,使内部服务器组件和插件能够安全地存储敏感信息,以便以后检索。所有MySQL发行版都包含一个名为的密钥环插件 keyring_file 。 MySQL企业版发行版包括其他密钥环插件。
协议跟踪插件。MySQL支持使用协议跟踪插件:客户端插件,用于实现客户端与使用客户端/服务器协议发生的服务器之间的通信跟踪。
查询重写插件。MySQL Server支持查询重写插件,可以在服务器执行之前检查并可能修改服务器接收的语句。 查询重写插件在服务器解析之前或之后获取语句。预分析查询重写插件具有以下特征:1)该插件允许在服务器处理之前重写到达服务器的SQL语句。2)该插件接收一个语句字符串,并可能返回一个不同的字符串。postparse查询重写插件具有以下特征:1)该插件支持基于解析树的语句重写。2)服务器解析每个语句并将其解析树传递给插件,插件可以遍历树。 插件可以将原始树返回到服务器以进行进一步处理,或者构造不同的树并返回该树。
源码中 include/mysql/plugin.h 有各种插件类型的宏定义:
大部分的数据接口,宏和常量都定义在include/mysql/plugin.h中,我们来慢慢看。
先看plugin的类型:
/* The allowable types of plugins */#define MYSQL_UDF_PLUGIN 0 /* User-defined function */
#define MYSQL_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */
#define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */
#define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */
#define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */
#define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */
#define MYSQL_REPLICATION_PLUGIN 6/* The replication plugin type */
#define MYSQL_AUTHENTICATION_PLUGIN 7 /* The authentication plugin type */
#define MYSQL_VALIDATE_PASSWORD_PLUGIN 8 /* validate password plugin type*/
#define MYSQL_GROUP_REPLICATION_PLUGIN 9 /* The Group Replication plugin */
#define MYSQL_KEYRING_PLUGIN 10 /* The Keyring plugin type */
#define MYSQL_MAX_PLUGIN_TYPE_NUM 11 /* The number of plugin types */
插件API组件
服务器插件实现包括几个组件。
SQL语句:mysql.plugin 表中 注册一个插件 并加载插件代码。
mysql.plugin 表中 取消注册插件 并卸载插件代码。
WITH PARSER 全文索引创建 的 子句将全文解析器插件与给定 FULLTEXT 索引 相关联 。
命令行选项和系统变量:该
与插件相关的表:该 mysql.plugin 表列出了安装时使用
客户端插件实现更简单:对于 MYSQL_DEFAULT_AUTH 和 MYSQL_PLUGIN_DIR 选项使客户端程序能够加载身份验证插件。
有一些C API函数可以管理客户端插件。
要检查MySQL如何实现插件,请参考MySQL源代码分发中的以下源文件:在 include/mysql 目录中, plugin.h 公开公共插件API。 任何想要编写插件库的人都应该检查此文件。 文件提供了与特定类型的插件有关的其他信息。 包含特定于客户端插件的信息。 plugin_xxx.h client_plugin.h
在 sql 目录中, sql_plugin.h 并 sql_plugin.cc 包含内部插件实现。 sql_acl.cc 是服务器使用身份验证插件的地方。 插件开发人员无需咨询这些文件。 对于那些想要了解服务器如何处理插件的人来说,它们可能是有趣的。
在该 sql-common 目录中, client_plugin.h 实现C API客户端插件函数,并 client.c 实现客户端身份验证支持。 插件开发人员无需咨询这些文件。 对于那些想要了解服务器如何处理插件的人来说,它们可能是有趣的。