7.6.1 安装和卸载插件
服务器插件必须在服务器启动或运行时加载,以便使用。MySQL 支持在服务器启动和运行时加载插件。还可以在启动时控制已加载插件的激活状态,并在运行时卸载它们。
在插件加载时,关于插件的信息将根据第7.6.2节,“获取服务器插件信息”中描述。
在使用插件之前,必须使用以下方法之一安装插件。在描述中,plugin_name
表示插件名称,如 innodb
、csv
或 validate_password
。
内置插件由服务器自动识别。默认情况下,服务器在启动时启用插件。一些内置插件允许更改该行为,以使用 --
选项。plugin_name
[=activation_state
]
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
还允许在启动时加载不能在运行时加载的插件。
The --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-add
实例,如果在--plugin-load
之前出现,无效,因为--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
Plugins Installed with the 安装插件语句
插件可以在运行时使用INSTALL PLUGIN
语句加载。语句还将插件注册到mysql.plugin
表中,以便在服务器重启时自动加载。因此,INSTALL PLUGIN
需要在mysql.plugin
表上的INSERT
权限。
插件库文件的基础名称取决于您的平台。常见的后缀是.so
用于Unix和Unix-like系统,.dll
用于Windows。
示例:使用--plugin-load-add
选项在服务器启动时安装插件。要安装名为myplugin
的插件从插件库文件somepluglib.so
中,可以在my.cnf
文件中添加以下行:
[mysqld]
plugin-load-add=myplugin=somepluglib.so
在这种情况下,插件不在mysql.plugin
中注册。重启服务器时不使用--plugin-load-add
选项将导致插件在启动时不被加载。
Alternatively,INSTALL PLUGIN
语句可以在运行时从库文件中加载插件代码:
INSTALL PLUGIN myplugin SONAME 'somepluglib.so';
INSTALL PLUGIN
还将插件注册为““permanent””:插件在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
是内置的可插拔存储引擎,并且您想在启动时加载它们,subject to these conditions:服务器允许在CSV
初始化失败时运行,必须确保BLACKHOLE
初始化成功,并且禁用ARCHIVE
。要实现该目标,可以使用以下选项文件中的行:
[mysqld]
csv=ON
blackhole=FORCE
archive=OFF
The --enable-
option format is a synonym for plugin_name
--
. The plugin_name
=ON--disable-
and plugin_name
--skip-
option formats are synonyms for plugin_name
--
.plugin_name
=OFF
如果插件被禁用,可能是因为它被明确地使用OFF
禁用,或者是因为它在启用时使用ON
但在初始化失败的情况下。插件的禁用将影响服务器的某些操作,例如,如果插件实现了存储引擎,现有的表将变得不可访问,尝试创建新的表将使用默认存储引擎,除非启用NO_ENGINE_SUBSTITUTION
SQL 模式,以便在出现错误时。
禁用插件可能需要调整其他选项。
在运行时,UNINSTALL PLUGIN
语句禁用和卸载服务器知晓的插件。语句卸载插件并从mysql.plugin
系统表中删除它,如果它注册在那里。因此,UNINSTALL PLUGIN
语句需要DELETE
权限对mysql.plugin
表。由于插件不再注册在表中,服务器在随后的重启时不再加载插件。
UNINSTALL PLUGIN
可以卸载插件,无论它是在运行时使用INSTALL PLUGIN
或在启动时使用插件加载选项,subject to these conditions:
-
它不能卸载内置到服务器中的插件。这些插件可以通过在输出中找到
NULL
的库名称来识别,或者通过PLUGINS
表或SHOW PLUGINS
。 -
它不能卸载服务器在启动时使用
--
,这将防止插件卸载在运行时。这些插件可以通过plugin_name
=FORCE_PLUS_PERMANENTLOAD_OPTION
列在PLUGINS
表中识别。
要卸载当前已加载的插件,请按照以下步骤进行。
-
从
my.cnf
文件中删除与插件相关的选项和系统变量。如果插件系统变量已经被持久化到mysqld-auto.cnf
文件中,使用RESET PERSIST
语句来删除每一个变量。var_name
-
重启服务器。
-
插件通常使用启动时的插件加载选项或在运行时使用
INSTALL PLUGIN
来安装,但是不能同时使用两种方法。然而,从my.cnf
文件中删除插件的选项可能不足以卸载插件,如果在某个时候已经使用INSTALL PLUGIN
安装过插件。即使从PLUGINS
或SHOW PLUGINS
输出中仍然显示插件,可以使用UNINSTALL PLUGIN
将其从mysql.plugin
表中删除,然后重新启动服务器。
安装插件时,也可能自动安装相关的可加载函数。如果是这样,那么卸载插件也将自动卸载这些函数。