28.2.1 插件类型

插件 API 支持创建具有多种功能的插件:

以下各节概述了这些插件类型。

存储引擎插件

MySQL 服务器使用的可插入存储引擎体系结构使存储引擎可以作为插件编写,并可以加载到正在运行的服务器中或从中卸载。有关此体系结构的说明,请参见第 15.11 节“ MySQL 存储引擎体系结构概述”

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

全文分析器插件

MySQL 具有内置的解析器,默认情况下它用于全文操作(解析要索引的文本,或解析查询字符串以确定用于搜索的术语)。 InnoDBMyISAMtable 支持内置的全文分析器。

MySQL 还具有支持中文,日文和韩文(CJK)的基于字符的 ngram 全文解析器,以及支持日文的基于单词的 MeCab 解析器插件,可用于InnoDBMyISAMtable。

对于全文处理,“解析”是指基于规则定义文本或单词的规则,从文本或查询字符串中提取单词(或在基于 n-gram 字符的解析器中为“令牌”)。单词边界所在的地方。

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

内置全文分析器的分析属性在第 12.9 节“全文搜索功能”中描述。这些属性包括用于确定如何从文本中提取单词的规则。解析器受到某些系统变量的影响,这些系统变量会导致将较短或较长的单词排除在外,并受到停用词列 table 的影响,这些停用词列 table 标识了要忽略的常见单词。有关更多信息,请参见第 12.9.4 节“全文停用词”第 12.9.6 节“微调 MySQL 全文搜索”

使用插件 API,您可以使用默认的内置全文分析器以外的全文分析器。例如,如果您使用日语,则可以选择使用 MeCab 全文解析器。插件 API 还使您能够提供自己的全文语法分析器,从而可以控制语法分析器的基本功能。解析器插件可以扮演以下两种角色之一:

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

如果需要使用与内置解析器不同的规则来确定如何将 Importing 拆分为单词,则可以选择提供自己的全文解析器。例如,内置的解析器认为文本“区分大小写”由两个单词“ case”和“ sensitive”组成,而应用程序可能需要将文本视为一个单词。

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

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

解析器插件也有可能同时在两个角色中运行。也就是说,它可以从非明文 Importing 中提取文本(前端角色),还可以将文本解析为单词(从而替换内置的解析器)。

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

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

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

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

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

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

有关全文插件的更多信息,请参见第 28.2.4.4 节“编写全文分析器插件”。 MySQL 5.7 支持带有MyISAMInnoDB的全文插件。

Daemon Plugins

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

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

INFORMATION_SCHEMA Plugins

INFORMATION_SCHEMA插件可用于创建包含服务器元数据的 table,这些 table 通过INFORMATION_SCHEMA数据库向用户公开。例如,InnoDB使用INFORMATION_SCHEMA插件来提供包含有关当前事务和锁的信息的 table。

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

半同步复制插件

默认情况下,MySQL 复制是异步的。使用半同步复制时,在主端执行的提交会阻塞,然后返回执行事务的会话,直到至少一个从属方确认它已接收并记录了事务事件为止。半同步复制通过互补的主插件和 Client 端插件实现。参见第 16.3.9 节“同步复制”

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

Audit Plugins

MySQL 服务器提供了一个可插入的审计接口,该接口使有关服务器操作的信息可以报告给相关方。这些操作会发生审核通知(尽管接口是通用的,并且可以修改服务器以报告其他操作):

  • 将消息写到常规查询日志(如果已启用日志)

  • 将消息写入错误日志

  • 向 Client 发送查询结果

审核插件可以在审核界面中注册,以接收有关服务器操作的通知。当服务器内发生可审核事件时,服务器将确定是否需要通知。对于每个注册的审计插件,服务器将对照该插件感兴趣的事件类检查事件,如果匹配,则将事件传递给插件。

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

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

有关审核插件的更多信息,请参见第 28.2.4.8 节“编写审核插件”

Authentication Plugins

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

可插拔身份验证还启用代理用户功能,其中一个用户采用另一用户的身份。服务器端身份验证插件可以将连接用户应具有的身份的用户名返回服务器。参见第 6.2.14 节“代理用户”

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

Password-Validation Plugins

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

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

协议跟踪插件

MySQL 支持协议跟踪插件的使用:Client 端插件,用于实现使用 Client 机/服务器协议对 Client 机与服务器之间的通信进行跟踪。

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

查询重写插件

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

预准备查询重写插件具有以下 Feature:

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

  • 插件会收到一条语句字符串,并可能返回其他字符串。

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

  • 该插件允许基于解析树重写语句。

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

  • 插件可以出于以下目的使用mysql_parser插件服务:

  • 激活语句摘要计算并获得独立于 Performance Schema 是否产生摘要的语句的规范化版本。

    • 遍历解析树。

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

有关插件服务的更多信息,请参见第 28.3 节“用于插件的 MySQL 服务”

预编写和后编写查询重写插件具有以下 Feature:

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

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

    • 使用--log-raw,服务器会将原始语句记录为已接收。
  • 如果插件重写了一条语句,则服务器将根据重写后的语句(而不是原始语句)决定是否将其写入二进制日志(从而写入任何复制从站)。如果插件仅将SELECT语句重写为SELECT语句,则对二进制日志记录没有影响,因为服务器不会将SELECT语句写入二进制日志。

  • 如果插件重写了一条语句,服务器将生成一条Note消息,Client 端可以使用SHOW WARNINGS查看该消息。消息具有以下格式,其中* stmt_in 是原始语句, stmt_out *是重写的语句:

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

MySQL 发行版包括名为Rewriter的后解析查询重写插件。这个插件是基于规则的。您可以在其规则 table 中添加行以引起SELECT语句重写。有关更多信息,请参见第 5.5.4 节“重写器查询重写插件”

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

Keyring Plugins

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

所有 MySQL 发行版都包含一个名为keyring_file的密钥环插件。 MySQL Enterprise Edition 发行版包含其他密钥环插件。参见第 6.4.4 节“ MySQL 密钥环”

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