扩展 MySQL 8.4  /  MySQL 插件 API  /  插件类型

4.1 插件类型

插件 API 使得能够创建实现多种功能的插件

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

可加载函数 (UDF) 插件

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

有关使用 MySQL 接口加载可加载函数的信息,请参阅 第 6.2 节,“添加可加载函数”。 编译和安装可加载函数插件的步骤在 可加载函数编译和安装 中进行了描述。

注意

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

存储引擎插件

MySQL 服务器使用的可插拔存储引擎架构使存储引擎能够作为插件编写,并加载到正在运行的服务器中,也可以从运行的服务器中卸载。 有关此架构的说明,请参阅 MySQL 存储引擎架构概述.

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

全文解析器插件

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

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

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

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

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

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

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

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

  • 插件可以与内置解析器协同工作,充当它的前端。 在这种角色中,插件从输入中提取文本,并将文本传递给解析器,解析器使用其正常的解析规则将文本拆分为词语。 此解析受 innodb_ft_xxxft_xxx 系统变量和停用词列表的影响。

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

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

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

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 节,“编写全文解析器插件”。 MySQL 8.4 支持带有 MyISAMInnoDB 的全文插件。

守护进程插件

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

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

INFORMATION_SCHEMA 插件

INFORMATION_SCHEMA 插件使能够创建包含服务器元数据的表,这些元数据通过 INFORMATION_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 语句之前重写这些语句。

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

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

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

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

  • 插件可以使用 mysql_parser 插件服务来实现以下目的

    • 激活语句摘要计算,并获取语句的规范化版本,而与 Performance Schema 是否生成摘要无关。

    • 遍历解析树。

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

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

预解析和后解析查询重写插件共享以下特点

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

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

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

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

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

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

MySQL 发行版包含一个名为 Rewriter 的后解析查询重写插件。该插件是基于规则的。您可以向它的规则表添加行,以使 SELECT 语句重写。有关更多信息,请参见 Rewriter 查询重写插件

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

密钥环插件

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

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

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