MySQL服务器插件
MySQL支持用于创建服务器组件的插件API。插件可以在服务器启动时加载,也可以在运行时加载和卸载而无需重新启动服务器。该接口支持的组件包括但不限于存储引擎,INFORMATION_SCHEMA
表,全文分析器插件和服务器扩展。
MySQL发行版包含几个实现服务器扩展的插件:
- 用于验证客户端尝试连接到MySQL Server的插件。插件可用于多种身份验证协议。
- 连接控制插件,使管理员能够在一定数量的连续失败的客户端连接尝试之后引入增加的延迟。请参见“连接控制插件”。
- 密码验证插件可实施密码强度策略并评估潜在密码的强度。请参见“密码验证组件”。
- 半同步复制插件实现了复制功能的接口,只要至少一个从属已响应每个事务,复制功能就允许主控继续进行。请参见“半同步复制”。
- 使用组复制,您可以跨一组MySQL服务器实例创建高度可用的分布式MySQL服务,并具有内置的数据一致性,冲突检测和解决以及组成员资格服务。请参见组复制。
- MySQL Enterprise Edition包含一个线程池插件,该插件通过有效管理大量客户端连接的语句执行线程来管理连接线程,从而提高服务器性能。请参见“ MySQL企业线程池”。
- MySQL Enterprise Edition包含一个审计插件,用于监视和记录连接和查询活动。请参见“ MySQL企业审核”。
- MySQL Enterprise Edition包含一个防火墙插件,该插件实现了应用程序级防火墙,以使数据库管理员可以根据与接受的语句模式的白名单匹配来允许或拒绝SQL语句执行。请参见“ MySQL企业防火墙”。
- 查询重写插件会检查MySQL Server收到的语句,并可能在服务器执行它们之前对其进行重写。请参见“MySQL服务器重写器查询重写插件”和“ ddl_rewriter插件”。
- 通过版本令牌,可以创建服务器令牌并围绕服务器令牌进行同步,应用程序可以使用这些令牌来防止访问不正确或过时的数据。版本令牌基于实现了
version_tokens
插件和一组用户定义功能的插件库。请参见“版本令牌”。 - 密钥环插件可为敏感信息提供安全的存储。请参见“ MySQL密钥环”。
- X插件扩展了MySQL Server,使其能够充当文档存储。运行X插件使MySQL Server可以使用X协议与客户端进行通信,该协议旨在将MySQL的ACID兼容存储功能公开为文档存储。请参见“ X插件”。
- 克隆允许
InnoDB
从本地或远程MySQL服务器实例克隆数据。请参见“MySQL服务器克隆插件”。 - 测试框架插件测试服务器服务。有关这些插件的信息,请参见MySQL Server Doxygen文档的“用于测试插件服务的插件”部分,网址为 https://dev.mysql.com/doc/index-other.html。
以下各节描述如何安装和卸载插件,以及如何在运行时确定安装了哪些插件并获取有关它们的信息。有关编写插件的信息,请参见“ MySQL插件API”。
安装和卸载插件
必须先将服务器插件加载到服务器中,然后才能使用它们。MySQL支持在服务器启动和运行时加载插件。也可以在启动时控制已加载插件的激活状态,并在运行时卸载它们。
加载插件后,可从INFORMATION_SCHEMA.PLUGINS
表和SHOW PLUGINS
语句中获取有关它的信息。请参见“获取服务器插件信息”。
- 安装插件
- 控制插件激活状态
- 卸载插件
安装插件
在使用服务器插件之前,必须使用以下方法之一安装它。在说明中,plugin_name
表示插件的名称,例如innodb
,csv
或validate_password
。
内置插件:
服务器会自动识别一个内置插件。通常,服务器在启动时启用插件。一些内置插件允许使用选项更改此设置。--plugin_name[= ctivation_state]
在mysql.plugin
系统表中注册的插件:
系统数据库中的plugin
表mysql
用作插件的注册表(内置插件除外,不需要注册)。在启动时,服务器将加载表中列出的每个插件。通常,对于从mysql.plugin
表中加载的插件,服务器也会启用该插件。可以使用该选项进行更改。--plugin_name[= ctivation_state]
如果使用该--skip-grant-tables
选项启动服务器,则它不会查询该mysql.plugin
表,也不会加载该表中列出的插件。
用命令行选项命名的插件:
位于插件库文件中的插件可以在与服务器启动时加载--plugin-load
,--plugin-load-add
或--early-plugin-load
选项。通常,对于在启动时加载的插件,服务器也会启用该插件。可以使用该选项进行更改。--plugin_name[= ctivation_state]
在服务器启动过程中初始化内置插件和存储引擎之后,--plugin-load
和--plugin-load-add
选项会加载插件。该--early-plugin-load
选项用于加载在初始化内置插件和存储引擎之前必须可用的插件。
每个plugin-loading选项的值是和值的分号分隔列表。每个都是要加载的插件的名称,也是包含插件代码的库文件的名称。如果命名了一个没有任何前面的插件名称的插件库,则服务器会将所有插件加载到该库中。服务器在系统变量命名的目录中查找插件库文件。name
=
plugin_library
plugin_library
name
plugin_library
plugin_dir
插件加载选项不会在mysql.plugin
表中注册任何插件。对于后续重新启动时,服务器负载再次插件只有当--plugin-load
,--plugin-load-add
或--early-plugin-load
再次给出。也就是说,该选项会生成一次插件安装操作,该操作会在单次服务器调用时保持不变。
--plugin-load
,--plugin-load-add
和--early-plugin-load
使插件当待甚至加载--skip-grant-tables
给出(其导致服务器忽略该mysql.plugin
表)。--plugin-load
,--plugin-load-add
和,--early-plugin-load
还允许在启动时加载无法在运行时加载的插件。
该--plugin-load-add
选项是对--plugin-load
选项的补充:
- 每个
--plugin-load
重置实例都会在启动时重置要加载--plugin-load-add
的插件集,而在不重置当前集的情况下将一个或多个插件添加到要加载的插件集。因此,如果--plugin-load
指定的多个实例,则只有最后一个实例生效。对于的多个实例--plugin-load-add
,它们全部生效。 - 参数格式与for相同
--plugin-load
,但--plugin-load-add
可以使用的多个实例来避免将大量插件指定为单个长而笨拙的--plugin-load
参数。 --plugin-load-add
可以在不存在的情况下给出--plugin-load
,但--plugin-load-add
之前出现的任何实例--plugin-load
均无效,因为--plugin-load
重置了要加载的插件集。
例如,这些选项:
--plugin-load=x --plugin-load-add=y
等效于此选项:
--plugin-load="x;y"
但是这些选项:
--plugin-load-add=y --plugin-load=x
等效于此选项:
--plugin-load=x
使用以下INSTALL PLUGIN
语句安装的插件:
可以使用以下INSTALL PLUGIN
语句在运行时加载位于插件库文件中的插件。该语句还在mysql.plugin
表中注册插件,以使服务器在随后的重新启动时加载它。因此,INSTALL PLUGIN
需要INSERT
该mysql.plugin
表的特权。
插件库文件的基本名称取决于您的平台。通用后缀适用.so
于Unix和类Unix系统,.dll
适用于Windows。
示例:该--plugin-load
选项在服务器启动时安装插件。要从名为myplugin
的插件库文件安装名为的插件somepluglib.so
,请在my.cnf
文件中使用以下几行:
[mysqld] plugin-load=myplugin=somepluglib.so
在这种情况下,插件未在中注册mysql.plugin
。在不使用该--plugin-load
选项的情况下重新启动服务器会导致在启动时无法加载该插件。
或者,该INSTALL PLUGIN
语句使服务器在运行时从库文件中加载插件代码:
INSTALL PLUGIN mypluginSONAME 'somepluglib.so';
INSTALL PLUGIN
还会导致“永久的”插件注册:该mysql.plugin
表中列出了该插件,以确保服务器在后续重启时将其加载。
许多插件可以在服务器启动时或在运行时加载。但是,如果设计的插件必须在服务器启动期间对其进行加载和初始化,则尝试在运行时使用加载该插件,从而INSTALL PLUGIN
产生错误:
mysql>INSTALL PLUGIN mypluginSONAME 'somepluglib.so'; ERROR 1721 (HY000): Plugin 'myplugin' is marked as not dynamically installable. You have to stop the server to install it.
在这种情况下,你必须使用--plugin-load
,--plugin-load-add
或--early-plugin-load
。
如果使用表中的--plugin-load
,,--plugin-load-add
或--early-plugin-load
选项同时命名了一个插件(作为较早的INSTALL PLUGIN
语句的结果)mysql.plugin
,则服务器将启动,但会将这些消息写入错误日志:
[ERROR] Function 'plugin_name' already exists [Warning] Couldn't load plugin named 'plugin_name' with soname 'plugin_object_file'.
控制插件激活状态
如果服务器在启动时知道插件(例如,因为该插件使用--plugin-load
选项命名或已在mysql.plugin
表中注册),则服务器将默认加载并启用该插件。它可以控制激活状态对于这样的插件使用启动选项,其中是插件的影响名称,如,,或。与其他选项一样,破折号和下划线在选项名称中可以互换。同样,激活状态值也不区分大小写。例如,和是等效的。--plugin_name[= ctivation_state]
plugin_name
innodb
csv
validate_password
--my_plugin=ON
--my-plugin=on
--plugin_name=OFF
告诉服务器禁用插件。对于某些内置插件(例如)可能无法实现
mysql_native_password
。--plugin_name[=ON]
告诉服务器启用插件。(将选项指定为不带值将具有相同的效果。)如果插件未能初始化,则服务器将在禁用插件的情况下运行。
--plugin_name
--plugin_name=FORCE
告诉服务器启用插件,但是如果插件初始化失败,则服务器不会启动。换句话说,此选项将强制服务器在启用或未启用插件的情况下运行。
--plugin_name=FORCE_PLUS_PERMANENT
类似于
FORCE
,但此外还可以防止插件在运行时被卸载。如果用户尝试使用进行操作UNINSTALL PLUGIN
,则会发生错误。
插件激活状态LOAD_OPTION
在INFORMATION_SCHEMA.PLUGINS
表的列中可见。
假设CSV
,BLACKHOLE
以及ARCHIVE
是内置可插拔存储引擎以及您希望服务器在启动时加载它们,受以下条件:服务器被允许运行,如果CSV
初始化失败,必须要求BLACKHOLE
初始化成功,并应禁用ARCHIVE
。为此,请在选项文件中使用以下几行:
[mysqld] csv=ON blackhole=FORCE rchive=OFF
该选项的格式是一个同义词。在和选项格式是同义词。--enable-plugin_name
--plugin_name=ON
--disable-plugin_name
--skip-plugin_name
--plugin_name=OFF
如果禁用了某个插件,则OFF
由于已启用该插件而隐式启用了该插件,或者隐式地禁用了该插件,ON
但初始化失败,需要该插件的服务器操作方面将发生变化。例如,如果插件实现了存储引擎,则该存储引擎的现有表将变得不可访问,并且尝试为该存储引擎创建新表会导致使用默认存储引擎的表,除非NO_ENGINE_SUBSTITUTION
启用了 SQL模式导致错误。相反发生。
禁用插件可能需要调整其他选项。例如,如果使用--skip-innodb
disable来启动服务器,则启动时可能需要省略InnoDB
其他选项。此外,由于它是默认的存储引擎,因此除非您使用指定了另一个可用的存储引擎,否则它不会启动。您还必须设置。innodb_xxx
InnoDB
--default_storage_engine
--default_tmp_storage_engine
卸载插件
在运行时,该UNINSTALL PLUGIN
语句禁用和卸载服务器已知的插件。该语句将卸载插件并将其从mysql.plugin
系统表中删除(如果已在系统表中注册)。因此,UNINSTALL PLUGIN
语句需要DELETE
该mysql.plugin
表的特权。如果插件不再在表中注册,则服务器不会自动加载插件以供后续重启。
UNINSTALL PLUGIN
可以在INSTALL PLUGIN
满足以下条件的情况下卸载插件,而不管它是在运行时使用插件加载选项还是在使用插件加载选项启动时加载的:
- 它无法卸载服务器内置的插件。可以将它们标识为
NULL
在INFORMATION_SCHEMA.PLUGINS
或输出中具有库名的库SHOW PLUGINS
。 - 它无法卸载以其启动服务器的插件,从而阻止了在运行时卸载插件。这些可以从表的列中识别出来。
--plugin_name=FORCE_PLUS_PERMANENT
LOAD_OPTION
INFORMATION_SCHEMA.PLUGINS
要卸载当前在服务器启动时使用plugin-loading选项加载的插件,请使用以下过程。
- 从
my.cnf
文件中删除与插件相关的所有选项。 - 重新启动服务器。
- 通常,在启动时或
INSTALL PLUGIN
在运行时使用插件加载选项安装插件,但不能同时使用两者。但是,从my.cnf
文件中删除插件的选项可能不足以在某些时候将其卸载INSTALL PLUGIN
。如果插件仍出现在INFORMATION_SCHEMA.PLUGINS
或的输出中SHOW PLUGINS
,请使用将该插件UNINSTALL PLUGIN
从mysql.plugin
表格中删除。然后再次重新启动服务器。
获取服务器插件信息
有几种方法可以确定服务器中安装了哪些插件:
该
INFORMATION_SCHEMA.PLUGINS
表为每个已加载插件包含一行。任何PLUGIN_LIBRARY
值为的NULL
都是内置的,无法卸载。mysql>
SELECT *FROM INFORMATION_SCHEMA.PLUGINS \G *************************** 1. row *************************** PLUGIN_NAME : binlog PLUGIN_VERSION : 1.0 PLUGIN_STATUS : ACTIVE PLUGIN_TYPE : STORAGE ENGINE PLUGIN_TYPE_VERSION : 50158.0 PLUGIN_LIBRARY : NULL PLUGIN_LIBRARY_VERSION : NULL PLUGIN_AUTHOR : Oracle Corporation PLUGIN_DESCRIPTION : This is a pseudo storage engine to represent the binlog in a transaction PLUGIN_LICENSE : GPL LOAD_OPTION : FORCE ... *************************** 10. row *************************** PLUGIN_NAME : InnoDB PLUGIN_VERSION : 1.0 PLUGIN_STATUS : ACTIVE PLUGIN_TYPE : STORAGE ENGINE PLUGIN_TYPE_VERSION : 50158.0 PLUGIN_LIBRARY : ha_innodb_plugin.so PLUGIN_LIBRARY_VERSION : 1.0 PLUGIN_AUTHOR : Oracle Corporation PLUGIN_DESCRIPTION : Supports transactions, row-level locking, and foreign keys PLUGIN_LICENSE : GPL LOAD_OPTION : ON ...该
SHOW PLUGINS
语句为每个已加载的插件显示一行。任何Library
值为的NULL
都是内置的,无法卸载。mysql>
SHOW PLUGINS \G *************************** 1. row *************************** Name : binlog Status : ACTIVE Type : STORAGE ENGINE Library : NULL License : GPL ... *************************** 10. row *************************** Name : InnoDB Status : ACTIVE Type : STORAGE ENGINE Library : ha_innodb_plugin.so License : GPL ...- 该
mysql.plugin
表显示了已向进行注册的插件INSTALL PLUGIN
。该表仅包含插件名称和库文件名,因此它没有提供与PLUGINS
表或SHOW PLUGINS
语句一样多的信息。