服务器插件必须在服务器启动前加载,以便使用。 MySQL支持服务器启动和运行时加载插件。也可以在启动时控制加载插件的激活状态,并在运行时卸载它们。
加载插件后,关于插件的信息可以在第7.6.2节“获取服务器插件信息”中找到。
在服务器插件可以使用之前,必须使用以下方法之一安装。在描述中,plugin_name
表示插件名称,例如innodb
、csv
或validate_password
。
内置插件
内置插件是服务器自动识别的。默认情况下,服务器在启动时启用插件。这可以使用--
选项更改。plugin_name
[=activation_state
]
注册在mysql.plugin系统表中的插件
mysql.plugin系统表充当插件注册表(除了内置插件外,内置插件不需要注册)。在正常启动序列中,服务器从表中加载插件。默认情况下,对于从mysql.plugin表加载的插件,服务器也启用插件。这可以使用--
选项更改。plugin_name
[=activation_state
]
如果服务器使用--skip-grant-tables
选项启动,mysql.plugin表中的插件将不会加载且不可用。
使用命令行选项命名的插件
插件库文件中的插件可以使用--plugin-load
、--plugin-load-add
或--early-plugin-load
选项在服务器启动时加载。通常,对于在启动时加载的插件,服务器也启用插件。这可以使用--
选项更改。plugin_name
[=activation_state
]
--plugin-load
和--plugin-load-add
选项在服务器启动序列中加载插件,位于内置插件和存储引擎初始化之后。--early-plugin-load
选项用于加载必须在内置插件和存储引擎初始化之前可用的插件。
每个插件加载选项的值是一个以分号分隔的列表,包含 插件库
和 名称
=
插件库
值。每个 插件库
是包含插件代码的库文件的名称,每个 名称
是要加载的插件的名称。如果插件库没有前缀插件名称,服务器将加载库中的所有插件。使用前缀插件名称,服务器将仅加载库中的指定插件。服务器在由 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
实例时,所有实例都生效。 -
参数格式与
--plugin-load
相同,但可以使用多个--plugin-load-add
实例来避免指定一个长的、难以管理的--plugin-load
参数。 -
--plugin-load-add
可以在没有--plugin-load
时给出,但任何出现在--plugin-load
之前的--plugin-load-add
实例都没有效果,因为--plugin-load
重置了要加载的插件集。
例如,这些选项:
--plugin-load=x --plugin-load-add=y
等同于这些选项:
--plugin-load-add=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-like 系统,.dll
用于 Windows。
示例:--plugin-load-add
选项在服务器启动时安装插件。要从插件库文件 somepluglib.so
安装名为 myplugin
的插件,请在 my.cnf
文件中使用以下行:
[mysqld]
plugin-load-add=myplugin=somepluglib.so
在这种情况下,插件不会在 mysql.plugin
表中注册。重新启动服务器时,不带 --plugin-load-add
选项,插件将不会在启动时加载。
或者,INSTALL PLUGIN
语句会在运行时从库文件加载插件代码:
INSTALL PLUGIN myplugin SONAME 'somepluglib.so';
INSTALL PLUGIN
也会导致“永久”插件注册:插件将被列入 mysql.plugin
表,以确保服务器在后续重新启动时加载它。
许多插件可以在服务器启动时或运行时加载。但是,如果插件设计为必须在服务器启动时加载和初始化,尝试使用 INSTALL PLUGIN
语句加载它将产生错误:
mysql> INSTALL PLUGIN myplugin SONAME '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-add
选项命名或在 mysql.plugin
表中注册),服务器将加载和启用插件。可以使用 --
启动选项控制插件的激活状态,其中 plugin_name
[=activation_state
]plugin_name
是要影响的插件的名称,例如 innodb
、csv
或 validate_password
。与其他选项一样,选项名称中的破折号和下划线是可互换的。此外,激活状态值不区分大小写。例如,--my_plugin=ON
和 --my-plugin=on
是等效的。
-
--
plugin_name
=OFF告诉服务器禁用插件。这可能不适用于某些内置插件,例如
mysql_native_password
,直到 MySQL 8.2。从 MySQL 8.2 开始,可以在服务器启动时禁用已弃用的mysql_native_password
插件。 -
--
plugin_name
[=ON]告诉服务器启用插件。(指定选项为
--
而不带值具有相同的效果。)如果插件无法初始化,服务器将以禁用插件状态运行。plugin_name
-
--
插件名称
=FORCE告诉服务器启用插件,但如果插件初始化失败,服务器将不启动。换言之,这个选项强制服务器以启用插件或根本不启动。
-
--
插件名称
=FORCE_PLUS_PERMANENT类似于
FORCE
,但另外防止插件在运行时被卸载。如果用户尝试使用UNINSTALL PLUGIN
卸载插件,将发生错误。
插件激活状态可在 Information Schema PLUGINS
表的 LOAD_OPTION
列中查看。
假设 CSV
、BLACKHOLE
和 ARCHIVE
是内置的可插拔存储引擎,并且您想在启动时加载它们,subject to 这些条件:服务器允许在 CSV
初始化失败时运行,必须要求 BLACKHOLE
初始化成功,并且应该禁用 ARCHIVE
。要实现这一点,请在选项文件中使用以下行:
[mysqld]
csv=ON
blackhole=FORCE
archive=OFF
选项 --enable-
的格式是 插件名称
--
的同义词。插件名称
=ON--disable-
和 插件名称
--skip-
选项格式是 插件名称
--
的同义词。插件名称
=OFF
如果插件被禁用,无论是明确地使用 OFF
还是隐式地因为它被启用为 ON
但初始化失败,服务器操作的某些方面将发生变化。例如,如果插件实现了存储引擎,那么该存储引擎的现有表将变得不可访问,并且尝试创建该存储引擎的新表将导致使用默认存储引擎,除非启用了 NO_ENGINE_SUBSTITUTION
SQL 模式以便在这种情况下发生错误。
禁用插件可能需要调整其他选项。
在运行时,UNINSTALL PLUGIN
语句禁用并卸载服务器已知的插件。该语句卸载插件并从 mysql.plugin
系统表中删除它。如果插件注册在该表中,则需要 DELETE
权限来卸载插件。由于插件不再注册在表中,服务器在后续重新启动时不会加载插件。
UNINSTALL PLUGIN
可以卸载在运行时加载的插件,无论是使用 INSTALL PLUGIN
加载还是在启动时使用插件加载选项加载,subject to 这些条件:
-
它不能卸载服务器内置的插件。这些插件可以从 Information Schema
PLUGINS
表或SHOW PLUGINS
的输出中识别出来,它们的库名称为NULL
。 -
它不能卸载使用
--
启动的插件,这些插件禁止在运行时卸载。这些插件可以从插件名称
=FORCE_PLUS_PERMANENTPLUGINS
表的LOAD_OPTION
列中识别出来。
要卸载当前使用插件加载选项加载的插件,请使用以下过程。
-
从
my.cnf
文件中删除与插件相关的选项和系统变量。如果任何插件系统变量被持久化到mysqld-auto.cnf
文件中,请使用RESET PERSIST
删除每个变量。var_name
-
重新启动服务器。
-
插件通常使用启动时的插件加载选项或在运行时使用
INSTALL PLUGIN
安装,但不能同时使用两者。然而,从my.cnf
文件中删除插件的选项可能不足以卸载插件,如果曾经使用INSTALL PLUGIN
安装过插件。如果插件仍然出现在PLUGINS
或SHOW PLUGINS
的输出中,请使用UNINSTALL PLUGIN
从mysql.plugin
表中删除插件。然后重新启动服务器。