服务器插件必须加载到服务器中才能使用。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_library
和 name
=
plugin_library
值列表。每个 plugin_library
都是包含插件代码的库文件的名称,每个 name
都是要加载的插件的名称。如果插件库没有前导插件名称,则服务器会加载库中的所有插件。如果有前导插件名称,则服务器只会加载库中的命名插件。服务器会在 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
的情况下给出--plugin-load-add
,但任何出现在--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
需要对 mysql.plugin
表具有 INSERT
权限。
插件库文件的基本名称取决于您的平台。常见的后缀是 Unix 和类 Unix 系统的 .so
、Windows 的 .dll
。
示例:--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
插件。--
plugin_name
[=ON]告诉服务器启用插件。(将选项指定为
--
而不指定值具有相同的效果。)如果插件初始化失败,则服务器会在插件被禁用后运行。plugin_name
--
plugin_name
=FORCE告诉服务器启用插件,但如果插件初始化失败,则服务器不会启动。换句话说,此选项强制服务器在启用插件后运行,否则根本不会运行。
--
plugin_name
=FORCE_PLUS_PERMANENT类似于
FORCE
,但此外还防止插件在运行时被卸载。如果用户尝试使用UNINSTALL PLUGIN
卸载插件,则会发生错误。
插件激活状态在信息架构 PLUGINS
表的 LOAD_OPTION
列中可见。
假设 CSV
、BLACKHOLE
和 ARCHIVE
是内置的可插拔存储引擎,并且您希望服务器在启动时加载它们,但要遵守以下条件:如果 CSV
初始化失败,则允许服务器运行;必须要求 BLACKHOLE
初始化成功;应禁用 ARCHIVE
。要实现这一点,请在选项文件中使用以下行
[mysqld]
csv=ON
blackhole=FORCE
archive=OFF
--enable-
选项格式是 plugin_name
--
的同义词。 plugin_name
=ON--disable-
和 plugin_name
--skip-
选项格式是 plugin_name
--
的同义词。plugin_name
=OFF
如果插件被禁用(无论是显式使用 OFF
,还是隐式使用 ON
启用,但初始化失败),则需要插件的服务器操作方面会发生变化。例如,如果插件实现存储引擎,则该存储引擎的现有表将变得不可访问,并且尝试为该存储引擎创建新表会导致使用默认存储引擎的表,除非启用了 NO_ENGINE_SUBSTITUTION
SQL 模式,以导致出现错误。
禁用插件可能需要调整其他选项。
在运行时,UNINSTALL PLUGIN
语句会禁用并卸载服务器已知的插件。该语句会卸载插件并将其从 mysql.plugin
系统表中删除(如果它在那里注册)。因此,UNINSTALL PLUGIN
语句需要对 mysql.plugin
表具有 DELETE
权限。由于插件不再在表中注册,因此服务器在后续重启时不会加载该插件。
UNINSTALL PLUGIN
可以卸载插件,无论它是使用 INSTALL PLUGIN
在运行时加载,还是使用插件加载选项在启动时加载,但要遵守以下条件
它无法卸载内置到服务器中的插件。这些插件可以识别为信息架构
PLUGINS
表或SHOW PLUGINS
输出中的库名称为NULL
的插件。它无法卸载服务器启动时使用
--
启动的插件,因为这会阻止插件在运行时卸载。这些插件可以从plugin_name
=FORCE_PLUS_PERMANENTPLUGINS
表的LOAD_OPTION
列中识别出来。
要卸载当前使用插件加载选项在服务器启动时加载的插件,请使用以下步骤。
从
my.cnf
文件中删除与插件相关的任何选项和系统变量。如果任何插件系统变量已持久保存到mysqld-auto.cnf
文件,请使用RESET PERSIST
删除每个变量,以将其删除。var_name
重启服务器。
插件通常使用启动时的插件加载选项或使用
INSTALL PLUGIN
在运行时安装,但不会同时使用两者。但是,如果在某个时候也使用了INSTALL PLUGIN
,则从my.cnf
文件中删除插件的选项可能不足以卸载它。如果插件仍然出现在PLUGINS
或SHOW PLUGINS
的输出中,请使用UNINSTALL PLUGIN
将其从mysql.plugin
表中删除。然后再次重启服务器。