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

4.1 插件类型

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

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

可加载函数 (UDF) 插件

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

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

注意

可加载函数以前称为用户定义函数 (UDF)。这种术语有点用词不当,因为用户定义 也可能应用于使用 SQL 编写的存储函数以及通过修改服务器源代码添加的原生函数。

存储引擎插件

MySQL Server 使用的可插拔存储引擎体系结构使存储引擎可以作为插件编写,并加载到正在运行的服务器中以及从正在运行的服务器中卸载。有关此体系结构的描述,请参见 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 9.0 支持使用 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 语句之前重写到达服务器的 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 节,“编写密钥环插件”