MySQL插件的安装、激活和卸载

本文问题

  1. 如何加载插件?有几种方法,这几种方法有什么不同?
  2. 在数据库启动时加载插件使用哪些选项?每个选项之间有什么不同?
  3. 如何设置插件的激活状态?
  4. 如何卸载插件,卸载插件有什么限制?
  5. 如何判断一个插件能否使用语句进行卸载?

在使用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选项启动时,在命令行中用选项执行的插件也会进行加载.这三个选项也可以用来加载一些只能在数据库启动时加载的插件

三个插件加载选项的区别和联系

  1. --plugin-load--plugin-load-add选项在加载内置插件并且存储引擎初始化后加载插件。--early-plugin-load选项用于指定的插件必须在内置插件加载和存储引擎初始化前加载的情况
  2. --plugin-load-add是对--plugin-load选项的补充:
    每个--plugin-load选项都会重新设置在数据库启动时要加载的插件列表。而--plugin-load-add选项会在保持之前的设置的情况下额外增加插件。 如果启动选项中包含多个--plugin-load选项,只有最后一个生效,如果包含多个--plugin-load-add选项,则他们全部生效
  3. --plugin-load的格式和--plugin-load-add的格式相同,可以通过使用多个--plugin-load-add来代替一个长的--plugin-load选项
  4. 可以在不指定--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;来查看插件是使用什么选项启动的

对于在数据库启动是通过插件加载选项加载的插件,可以通过以下步骤进行卸载

  1. my.cnf文件中删除与插件有关的所有选项
  2. 重新启动数据库
  3. 通常,插件通过在数据库启动时设置插件加载选项或者在数据库运行时使用INSTALL PLUGIN语句在进行加载,不会两者同时使用。但是,某些时候如果也使用了INSTALL PLUGIN,从my.cnf文件中删除查询选项不能卸载插件。如果插件仍然出现在SHOW PLUGINS或者NFORMANTION_SCHEMA.PLUGINS的输出中,使用UNINSTALL PLUGINS将它从mysql.plugin表中删除,并再次重启数据库。

问题答案

  1. 如何加载插件?有几种方法,这几种方法有什么不同?
    内置插件和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的影响。
  2. 在数据库启动时加载插件使用哪些选项?每个选项之间有什么不同?
    一共有三个选项--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选项也都会失效
  1. 如何设置插件的激活状态?
  • 启用插件
    --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
  1. 如何卸载插件,卸载插件有什么限制?
    可以使用UNINSTALL PLUGIN plugin_name语句来卸载插件,这个语句还会将插件中mysql.plugin中删除
    在以下情况下,插件不允许在数据库运行时卸载
  • 数据库内置插件
  • 使用--plugin-name=FORCE_PLUS_PERMANENT选项启动的插件
  1. 如何判断一个插件能否使用语句进行卸载?
    SELECT plugin_name,plugin_library,load_option FROM information_schema.plugins
    library列为NULL表示为该插件为内置插件,无法卸载
    load_option列为FORCE_PLUS_PERMANENT表示该插件已设置强制启用和不允许卸载,也无法通过语句卸载

你可能感兴趣的:(MySQL插件的安装、激活和卸载)