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表示该插件已设置强制启用和不允许卸载,也无法通过语句卸载
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容