本文问题
- 如何加载插件?有几种方法,这几种方法有什么不同?
- 在数据库启动时加载插件使用哪些选项?每个选项之间有什么不同?
- 如何设置插件的激活状态?
- 如何卸载插件,卸载插件有什么限制?
- 如何判断一个插件能否使用语句进行卸载?
在使用MySQL服务器插件前,必须先将插件加载到服务器。MySQL支持在服务器启动和运行时加载插件,在服务器启动时可以控制插件的激活状态,在服务器运行时可以卸载插件。
常用语句
加载插件
通过语句加载
INSTALL PLUGIN plugin_name SONAME 'plugin_name.so'
通过命令行加载
--plugin-load=plugin_name.so
--plugin-load-add="plugin_name.so;group_replication.so"
--early-plugin-load=plugin_name.so
强制激活插件
[mysqld]
plugin-name=FORCE_PLUS_PERMANENT
卸载插件
UNINSTALL PLUGIN plugin_name
查看插件状态
SELECT PLUGIN_NAME,LOAD_OPTION from information_schema.plugins;
加载插件
在使用服务器插件前,必须通过以下方法之一加载插件。
内置插件
服务器会自动识别内置插件。通常,服务器在启动时启用插件。一些内置插件可以通过 --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_dir
选项指定的目录中查找插件库文件
插件加载选项不会在mysql.plugin
表中注册插件,也就是说,这三个选项指定的插件加载是一次性的,如果下次还需要加载这些插件,需要在服务器启动时继续使用选项指定
当数据库使用--skip-grant-talbes
选项启动时,在命令行中用选项执行的插件也会进行加载.这三个选项也可以用来加载一些只能在数据库启动时加载的插件
三个插件加载选项的区别和联系
-
--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-add
来代替一个长的--plugin-load
选项 - 可以在不指定
--plugin-load
的情况下使用--plugin-load-add
,但是如果在--plugin-load-add
之后使用--plugin-load
,那么之前那些--plugin-load-add
的值都会失效,因为--plugin-load
会重置要加载的插件列表
使用INSTALL PLUGIN安装的插件
可以在数据库运行时使用INSTALL PLUGIN
选项来加载插件,这个语句还会在mysql.plugin
表中注册插件,以便在服务器重启后加载插件。因此,INSTALL PLUGIN
语句需要mysql.plugin
表的INSERT
权限
插件库文件名名称取决于操作系统,在类Unix
系统中,后缀为.so
,在Windows
系统中,后缀为.dll
如果在插件加载选项(--load-plugin
,--load-plugin-add
,--early-load-plugin
)和mysql.plugin
中指定了同一个插件名称,数据库可以正常启动,但是会在错误日志中进行记录
[ERROR] Function 'plugin_name' already exists
[Warning] Couldn't load plugin named 'plugin_name' with soname 'plugin_object_file'.
控制插件激活状态
数据库在启动时如果检测到有插件需要加载(使用了插件加载选项或在mysql.plugin
表中),默认加载并激活插件。可以通过使用--plugin_name[=activation_state]
选项来控制插件的激活状态。
-
--plugin-name=OFF
禁用插件。某些内置插件(如mysql_native_password
)无法禁用。
等同于--disable-plugin-name
或者--skip-plugin-name
-
--plugin-name[=ON]
启用插件。如果插件无法初始化,在禁用插件的情况下正常启动服务器
等同于--enbale-plugin-name
-
--plugin-name=FORCE
强制启用插件。如果插件初始化失败,则数据库也不会启动 -
--plugin-name=FORCE_PLUSE_PERMANENT
强制启用插件并且不允许卸载插件。在这种情况下,使用UNISTALL PLUGIN
语句会报错
如果插件被禁用,无论是通过设置值为OFF
显示禁用,或者是由于插件初始化隐式禁用,需要使用该插件的数据库操作会受到影响。例如,如果一个存储引擎插件被禁用,则该存储引擎现有的表都无法访问,而且无法创建这种存储引擎的表。
禁用插件可能会需要调整其他选项。例如,如果使用--skip-innodb
来禁用InnoDB
存储引擎,在启动数据库时也要去除其他innodb_xxx
选项。
卸载插件
在数据库运行时,可以通过UNINSTALL PLUGIN
来禁用和卸载插件。这个语句会卸载插件并将插件从mysql.plugin
表中删除(如果之前在表中注册过的话)。所以,UNINSTALL PLUGIN
语句需要mysql.plugin
表的DELETE
权限。当插件不在注册表中之后,数据库重启会不会自动加载插件。
无论插件是通过插件加载选项还是INSTALL PLUGIN
语句加载的,都可以通过UNINSTALL PLUGIN
语句进行卸载,但是以下情况除外:
- 无法卸载服务器内置的插件
可以通过SHOW PLUGINS
或者select PLUGIN_NAME,PLUGIN_LIBRARY,LOAD_OPTION from information_schema.plugins;
查看插件是否为内置插件PLUGIN_LIBRARY=NULL
为内部插件 - 无法卸载使用
--plugin-name=FORCE_PLUS_PERMANENT
选项启动的插件
可以通过SELECT PLUGIN_NAME,LOAD_OPTION from information_schema.plugins;
来查看插件是使用什么选项启动的
对于在数据库启动是通过插件加载选项加载的插件,可以通过以下步骤进行卸载
- 从
my.cnf
文件中删除与插件有关的所有选项 - 重新启动数据库
- 通常,插件通过在数据库启动时设置插件加载选项或者在数据库运行时使用
INSTALL PLUGIN
语句在进行加载,不会两者同时使用。但是,某些时候如果也使用了INSTALL PLUGIN
,从my.cnf
文件中删除查询选项不能卸载插件。如果插件仍然出现在SHOW PLUGINS
或者NFORMANTION_SCHEMA.PLUGINS
的输出中,使用UNINSTALL PLUGINS
将它从mysql.plugin
表中删除,并再次重启数据库。
问题答案
- 如何加载插件?有几种方法,这几种方法有什么不同?
内置插件和mysql.plugin表中的插件会在数据库启动后自动加载。
还有两种方法可以加载插件:在数据库运行时,使用INSTALL PLUGIN plugin_name SONAME plugin_name.so
加载插件。或者在数据库启动时,使用--plugin-load
,--plugin-load-add
,--early-plugin-load
选项指定要加载的选项。
这两种方法的不同在于:INSTALL PLUGIN
语句会将插件添加到mysql.plugin
表中,在下次数据库启动时自动启动。但是在启动时使用选项加载插件是一次性的,如果下次要加载相同的插件,还要在启动时再用选项指定插件名称。此外,在使用--skip-grant-tables
选项启动数据库时,会跳过mysql.plugin
表,所以使用INSTALL PLUGIN
语句加载的插件不会启动,但是在启动时使用选项指定的插件不受--skip-grant-talbes
的影响。 - 在数据库启动时加载插件使用哪些选项?每个选项之间有什么不同?
一共有三个选项--plugin-load
,--plugin-load-add
,--early-plugin-load
-
--early-plugin-load
指定的插件在数据库内置插件和存储引擎初始化前加载,其他两个选项指定的插件在之后加载 -
--plugin-load-add
选项可以多次生效,如果存在多个该选项,所有选项指定的插件都会进行加载。而--plugin-load
选项会重置插件加载列表,如果有多个plugin-load
选项,只有最后一个选项生效 - 由于
--plugin-load
会重置检查加载列表,如果在该选项之前存在--plugin-load-add
选项,那么之前的那些--plugin-load-add
选项也都会失效
- 如何设置插件的激活状态?
- 启用插件
--plugin-name
,--plugin-name=on
,--enable-plugin-name
- 禁用插件
--plugin-name=OFF
,--disabble-plugin-name
,--skip-plugin-name
- 强制启用插件
--plugin-name=FORCE
- 强制启用插件并且不允许卸载
--plugin-name=FORCE_PLUS_PERMANENT
- 如何卸载插件,卸载插件有什么限制?
可以使用UNINSTALL PLUGIN plugin_name
语句来卸载插件,这个语句还会将插件中mysql.plugin
中删除
在以下情况下,插件不允许在数据库运行时卸载
- 数据库内置插件
- 使用
--plugin-name=FORCE_PLUS_PERMANENT
选项启动的插件
- 如何判断一个插件能否使用语句进行卸载?
SELECT plugin_name,plugin_library,load_option FROM information_schema.plugins
library
列为NULL
表示为该插件为内置插件,无法卸载
load_option
列为FORCE_PLUS_PERMANENT
表示该插件已设置强制启用和不允许卸载,也无法通过语句卸载