扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  /  4.1 插件类型

4.1 插件类型

插件 API 支持创建实现多种功能的插件:

以下部分概述了这些插件类型。

可加载函数 (UDF) 插件

可加载函数可以包含在插件库文件中并安装在服务器上。

有关将 MySQL 接口用于可加载函数的信息,请参阅第 6.2 节,“添加可加载函数”Loadable Function Compiling and Installing中描述了编译和安装可加载函数插件的步骤。

笔记

可加载函数以前称为用户定义函数 (UDF)。该术语有点用词不当,因为用户定义也适用于使用 SQL 编写的存储函数和通过修改服务器源代码添加的本机函数。

存储引擎插件

MySQL Server 使用的可插拔存储引擎架构使存储引擎可以作为插件编写,并加载到正在运行的服务器中或从中卸载。有关此体系结构的描述,请参阅 MySQL 存储引擎体系结构概述

有关如何使用插件 API 编写存储引擎的信息,请参阅 MySQL 内部结构:编写自定义存储引擎

全文解析器插件

MySQL 有一个内置的解析器,它默认用于全文操作(解析要索引的文本,或解析查询字符串以确定要用于搜索的术语)。InnoDBMyISAM 表 支持内置的全文解析器 。

MySQL 还有一个支持中文、日语和韩语 (CJK) 的基于字符的 ngram 全文解析器,以及一个支持日语的基于单词的 MeCab 解析器插件,用于 InnoDBMyISAM 表。

对于全文处理,解析意味着根据定义由哪些字符序列组成单词的规则从文本或查询字符串中提取单词(或标记,在基于 n-gram 字符的解析器的情况下)单词边界所在的位置。

当出于索引目的进行解析时,解析器将每个单词传递给服务器,服务器将其添加到全文索引中。解析查询字符串时,解析器将每个词传递给服务器,服务器累积这些词以供搜索使用。

全文搜索功能 中描述了内置全文解析器的解析属性。这些属性包括用于确定如何从文本中提取单词的规则。解析器受某些系统变量的影响,这些变量会导致排除较短或较长的单词,以及标识要忽略的常用单词的停用词列表。有关详细信息,请参阅 全文停用词微调 MySQL 全文搜索

插件 API 使您能够使用除默认内置全文解析器之外的全文解析器。例如,如果您使用的是日语,则可以选择使用 MeCab 全文解析器。插件 API 还使您能够提供自己的全文解析器,以便您可以控制解析器的基本职责。解析器插件可以以两种角色中的任何一种运行:

  • 该插件可以替换内置的解析器。在这个角色中,插件读取要解析的输入,将其拆分为词,并将词传递给服务器(用于索引或令牌累积)。ngram 和 MeCab 解析器作为内置全文解析器的替代品运行。

    如果您需要使用与内置解析器不同的规则来确定如何将输入拆分为单词,您可以选择提供自己的全文解析器。例如,内置解析器认为文本 case-sensitive由两个单词 casesensitive组成,而应用程序可能需要将文本视为单个单词。

  • 该插件可以通过充当内置解析器的前端来与内置解析器结合使用。在此角色中,插件从输入中提取文本并将文本传递给解析器,解析器使用其正常解析规则将文本拆分为单词。此解析受 or 系统变量和停用词列表的影响。 innodb_ft_xxxft_xxx

    以这种方式使用解析器的一个原因是您需要索引 PDF 文档、XML 文档或 .doc文件等内容。内置解析器不适用于这些类型的输入,但插件可以从这些输入源中提取文本并将其传递给内置解析器。

解析器插件也可以在这两种角色中运行。也就是说,它可以从非明文输入中提取文本(前端角色),并将文本解析为单词(从而取代内置解析器)。

全文插件在每个索引的基础上与全文索引相关联。也就是说,当您最初安装解析器插件时,不会导致它用于任何全文操作。它只是变得可用。例如,全文解析器插件可以 WITH PARSER在创建单个 FULLTEXT索引时在子句中命名。要在创建表时创建这样的索引,请执行以下操作:

CREATE TABLE t
(
  doc CHAR(255),
  FULLTEXT INDEX (doc) WITH PARSER parser_name
) ENGINE=InnoDB;

或者您可以在创建表后添加索引:

ALTER TABLE t ADD FULLTEXT INDEX (doc) WITH PARSER parser_name;

将解析器与索引相关联的唯一 SQL 更改是WITH PARSER子句。搜索与以前一样指定,查询不需要更改。

当您将解析器插件与 FULLTEXT索引相关联时,该插件是使用索引所必需的。如果删除解析器插件,则与其关联的任何索引都将变得不可用。任何尝试使用插件不可用的表都会导致错误,但DROP TABLE仍有可能。

有关全文插件的更多信息,请参阅 第 4.4.4 节,“编写全文解析器插件”MyISAMMySQL 5.7 支持带有和 的全文插件 InnoDB

守护进程插件

守护进程插件是一种简单类型的插件,用于应由服务器运行但不与其通信的代码。MySQL 发行版包括一个示例守护程序插件,该插件将周期性心跳消息写入文件。

有关守护程序插件的更多信息,请参阅 第 4.4.5 节,“编写守护程序插件”

INFORMATION_SCHEMA 插件

INFORMATION_SCHEMAINFORMATION_SCHEMA 插件允许创建包含通过数据库向用户公开的服务器元数据的表。例如,InnoDB使用 INFORMATION_SCHEMA插件提供包含有关当前事务和锁的信息的表。

有关 INFORMATION_SCHEMA插件的更多信息,请参阅 第 4.4.6 节,“编写 INFORMATION_SCHEMA 插件”

半同步复制插件

MySQL 复制默认是异步的。使用半同步复制,在返回到执行事务的会话之前,在源端执行的提交会阻塞,直到至少一个副本确认它已经收到并记录了事务的事件。半同步复制是通过互补的源和客户端插件实现的。请参阅 半同步复制

有关半同步复制插件的更多信息,请参阅 第 4.4.7 节,“编写半同步复制插件”

审计插件

MySQL 服务器提供了一个可插入的审计接口,可以将有关服务器操作的信息报告给感兴趣的各方。这些操作会出现审计通知(尽管接口是通用的并且可以修改服务器以报告其他操作):

  • 将消息写入一般查询日志(如果启用了日志)

  • 将消息写入错误日志

  • 向客户端发送查询结果

审计插件可以在审计接口上注册以接收有关服务器操作的通知。当服务器内发生可审计事件时,服务器确定是否需要通知。对于每个已注册的审计插件,服务器会根据插件感兴趣的那些事件类检查事件,如果匹配则将事件传递给插件。

此接口使审计插件能够仅接收有关它们认为重要的事件类中的操作的通知,而忽略其他事件类。该接口提供将操作分类为事件类,并进一步划分为每个类中的事件子类。

当审计插件收到可审计事件的通知时,它会收到一个指向当前 THD 结构的指针和一个指向包含事件信息的结构的指针。该插件可以检查事件并执行任何适当的审计操作。例如,插件可以查看生成结果集或被记录的语句、结果中的行数、操作的当前用户是谁或失败操作的错误代码。

有关审计插件的更多信息,请参阅 第 4.4.8 节,“编写审计插件”

认证插件

MySQL 支持可插入的身份验证。身份验证插件存在于服务器端和客户端。服务器端的插件实现客户端连接到服务器时使用的身份验证方法。客户端的插件与服务器端的插件进行通信,以提供所需的身份验证信息。客户端插件可以与用户交互,执行诸如请求密码或其他身份验证凭据以发送到服务器的任务。请参阅 可插入身份验证

可插入身份验证还支持代理用户功能,其中一个用户使用另一个用户的身份。服务器端身份验证插件可以向服务器返回连接用户应具有其身份的用户名。请参阅代理用户

有关身份验证插件的更多信息,请参阅 第 4.4.9 节,“编写身份验证插件”

密码验证插件

MySQL 服务器提供了一个用于编写测试密码的插件的接口。这样的插件实现了两个功能:

有关编写此类插件的信息,请参阅 第 4.4.10 节,“编写密码验证插件”

协议跟踪插件

MySQL 支持使用协议跟踪插件:客户端插件实现了对使用客户端/服务器协议发生的客户端和服务器之间通信的跟踪。

有关协议跟踪插件的更多信息,请参阅 第 4.4.11 节,“编写协议跟踪插件”

查询重写插件

MySQL 服务器支持查询重写插件,这些插件可以在服务器执行之前检查并可能修改服务器接收到的语句。查询重写插件在服务器解析它们之前或之后获取语句。

预解析查询重写插件具有以下特征:

  • 该插件允许在服务器处理 SQL 语句之前重写到达服务器的 SQL 语句。

  • 该插件接收一个语句字符串并可能返回一个不同的字符串。

解析后查询重写插件具有以下特征:

  • 该插件启用基于解析树的语句重写。

  • 服务器解析每个语句并将其解析树传递给插件,插件可以遍历树。该插件可以将原始树返回给服务器进行进一步处理,或者构建一个不同的树并返回它。

  • 插件可以将mysql_parser 插件服务用于这些目的:

    • 激活语句摘要计算并获取与性能模式是否生成摘要无关的语句的规范化版本。

    • 遍历解析树。

    • 解析语句。如果插件从解析树构造新的语句字符串,这将很有用。该插件可以让服务器解析字符串以生成一棵新树,然后将该树作为重写语句的表示返回。

有关插件服务的更多信息,请参阅 MySQL 插件服务

Preparse 和 postparse 查询重写插件具有以下特征:

  • 如果安装了查询重写插件,该 --log-raw选项会影响语句日志记录,如下所示:

    • 如果没有--log-raw,服务器会记录查询重写插件返回的语句。这可能与收到的声明不同。

    • 使用--log-raw,服务器记录收到的原始语句。

  • 如果插件重写了语句,服务器会根据重写的语句而不是原始语句来决定是否将其写入二进制日志(并因此写入任何副本)。如果插件仅将语句重写 SELECTSELECT语句,则对二进制日志记录没有影响,因为服务器不会将SELECT语句写入二进制日志。

  • 如果插件重写语句,服务器会生成一条 Note消息,客户端可以使用SHOW WARNINGS. 消息具有这种格式,其中 stmt_in是原始语句,stmt_out是重写后的语句:

    Query 'stmt_in' rewritten to 'stmt_out' by a query rewrite plugin

MySQL 发行版包括一个名为Rewriter. 这个插件是基于规则的。您可以向其规则表中添加行以引起 SELECT语句重写。有关详细信息,请参阅 重写器查询重写插件

查询重写插件使用与审计插件相同的 API。有关审计插件的更多信息,请参阅 第 4.4.8 节,“编写审计插件”

密钥环插件

从 MySQL 5.7.11 开始,MySQL 服务器支持密钥环插件,使内部服务器组件和插件能够安全地存储敏感信息以供以后检索。

所有 MySQL 发行版都包含一个名为 keyring_file. MySQL Enterprise Edition 发行版包括额外的密钥环插件。请参阅MySQL 密钥环

有关密钥环插件的更多信息,请参阅 第 4.4.12 节,“编写密钥环插件”