5.5.1 安装和卸载插件
必须先将服务器插件加载到服务器中,然后才能使用它们。 MySQL 支持在服务器启动和运行时加载插件。也可以在启动时控制已加载插件的激活状态,并在运行时卸载它们。
加载插件后,有关该插件的信息可从INFORMATION_SCHEMA.PLUGINStable 和SHOW PLUGINS语句中获得。参见第 5.5.2 节“获取服务器插件信息”。
Installing Plugins
在使用服务器插件之前,必须使用以下方法之一安装它。在描述中,* plugin_name
*代 table 插件名称,例如innodb
,csv
或validate_password
。
Built-in Plugins
服务器会自动识别一个内置插件。通常,服务器在启动时启用插件。一些内置插件允许使用--plugin_name[=activation_state]
选项对此进行更改。
已在 mysql.plugin 系统 table 中注册的插件
mysql
系统数据库中的plugin
table 用作插件的注册 table(内置插件除外,不需要注册)。在启动时,服务器将加载 table 中列出的每个插件。通常,对于从mysql.plugin
table 加载的插件,服务器也会启用该插件。可以使用--plugin_name[=activation_state]
选项更改。
如果服务器使用--skip-grant-tables选项启动,则它不会查询mysql.plugin
table,也不会加载此处列出的插件。
使用命令行选项命名的插件
可以在服务器启动时使用--plugin-load,--plugin-load-add或(自 MySQL 5.7.11 起)--early-plugin-load选项加载位于插件库文件中的插件。通常,对于在启动时加载的插件,服务器也会启用该插件。可以使用--plugin_name[=activation_state]
选项更改。
在服务器启动过程中初始化内置插件和存储引擎之后,--plugin-load和--plugin-load-add选项将加载插件。 --early-plugin-load选项用于加载在初始化内置插件和存储引擎之前必须可用的插件。
每个插件加载选项的值是* name
* =
* plugin_library
和 plugin_library
*值的分号分隔列 table。每个name
是要加载的插件的名称,每个plugin_library
是包含插件代码的库文件的名称。如果命名的插件库没有任何前面的插件名称,则服务器会将所有插件加载到该库中。服务器在plugin_dir系统变量命名的目录中查找插件库文件。
插件加载选项不会在mysql.plugin
table 中注册任何插件。对于随后的重新启动,仅当再次给出--plugin-load,--plugin-load-add或--early-plugin-load时,服务器才会再次加载插件。也就是说,该选项会产生一次插件安装操作,该操作会在单次服务器调用时保持不变。
--plugin-load,--plugin-load-add和--early-plugin-load启用插件,即使给出--skip-grant-tables也可以加载(这会导致服务器忽略mysql.plugin
table)。 --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="x;y"
但是这些选项:
--plugin-load-add=y --plugin-load=x
等效于此选项:
--plugin-load=x
使用 INSTALL PLUGIN 语句安装的插件
可以在运行时使用INSTALL PLUGIN语句加载位于插件库文件中的插件。该语句还将插件注册在mysql.plugin
table 中,以使服务器在后续重启时将其加载。因此,INSTALL PLUGIN要求mysql.plugin
table 具有INSERT特权。
插件库文件的基本名称取决于您的平台。通用后缀是.so
(对于 Unix 和类 Unix 系统),.dll
(对于 Windows)。
示例:--plugin-load选项在服务器启动时安装插件。要从名为somepluglib.so
的插件库文件安装名为myplugin
的插件,请在my.cnf
文件中使用以下几行:
[mysqld]
plugin-load=myplugin=somepluglib.so
在这种情况下,插件未在mysql.plugin
中注册。不使用--plugin-load选项重新启动服务器会导致在启动时无法加载插件。
或者,INSTALL PLUGIN语句使服务器在运行时从库文件中加载插件代码:
INSTALL PLUGIN myplugin SONAME 'somepluglib.so';
INSTALL PLUGIN还会导致“永久”插件注册:mysql.plugin
table 中列出了该插件,以确保服务器在后续重启时将其加载。
许多插件可以在服务器启动时或在运行时加载。但是,如果设计的插件必须在服务器启动期间对其进行加载和初始化,则尝试使用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
table 中同时命名,则服务器将启动,但会将这些消息写入错误日志:
[ERROR] Function 'plugin_name' already exists
[Warning] Couldn't load plugin named 'plugin_name'
with soname 'plugin_object_file'.
控制插件激活状态
如果服务器在启动时知道插件(例如,因为该插件使用--plugin-load选项命名或在mysql.plugin
table 中注册),则服务器将默认加载并启用该插件。可以使用--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这样做,则会发生错误。
插件激活状态在INFORMATION_SCHEMA.PLUGINStable 的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
启用了该插件而隐式禁用,但无法初始化,则需要该插件的服务器操作方面将发生变化。例如,如果插件实现了存储引擎,则无法访问该存储引擎的现有 table,并且尝试为该存储引擎创建新 table 会导致使用默认存储引擎的 table,除非启用了NO_ENGINE_SUBSTITUTION SQL 模式会导致错误代替发生。
禁用插件可能需要调整其他选项。例如,如果使用--skip-innodb启动服务器以禁用InnoDB,则可能需要在启动时省略其他innodb_xxx
选项。此外,由于InnoDB是默认存储引擎,因此除非您使用--default_storage_engine指定另一个可用的存储引擎,否则它不会启动。您还必须设置--default_tmp_storage_engine。
Uninstalling Plugins
在运行时,UNINSTALL PLUGIN语句禁用并卸载服务器已知的插件。该语句将卸载插件并将其从mysql.plugin
系统 table 中删除(如果已在其中注册)。因此,UNINSTALL PLUGIN语句需要mysql.plugin
table 的DELETE特权。如果插件不再在 table 中注册,则服务器不会自动加载插件以供后续重新启动。
UNINSTALL PLUGIN可以卸载插件,无论它是在运行时使用INSTALL PLUGIN加载还是在启动时使用插件加载选项加载,都必须满足以下条件:
-
它无法卸载服务器内置的插件。可以将它们标识为在INFORMATION_SCHEMA.PLUGINS或SHOW PLUGINS的输出中库名称为
NULL
的库。 -
它无法卸载使用
--plugin_name=FORCE_PLUS_PERMANENT
启动服务器的插件,这会阻止在运行时卸载插件。这些可以从INFORMATION_SCHEMA.PLUGINStable 的LOAD_OPTION
列中识别。
要卸载当前在服务器启动时使用 plugin-loading 选项加载的插件,请使用此过程。
-
从
my.cnf
文件中删除与插件相关的所有选项。 -
重新启动服务器。
-
通常在启动时使用插件加载选项或在运行时使用INSTALL PLUGIN来安装插件,但不能同时安装两者。但是,如果在某个时候也使用了INSTALL PLUGIN,则从
my.cnf
文件中删除插件的选项可能不足以卸载它。如果插件仍出现在INFORMATION_SCHEMA.PLUGINS或SHOW PLUGINS的输出中,请使用UNINSTALL PLUGIN将其从mysql.plugin
table 中删除。然后再次重新启动服务器。