文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  安装和卸载插件

7.6.1 安装和卸载插件

服务器插件必须加载到服务器中才能使用。MySQL 支持在服务器启动和运行时加载插件。也可以在启动时控制已加载插件的激活状态,并在运行时卸载它们。

当插件加载时,有关该插件的信息将如 第 7.6.2 节,“获取服务器插件信息” 中所述。

安装插件

在可以使用服务器插件之前,必须使用以下方法之一安装它。在这些描述中,plugin_name 代表插件名称,例如 innodbcsvvalidate_password

内置插件

服务器会自动识别内置插件。默认情况下,服务器会在启动时启用插件。一些内置插件允许使用 --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-load--plugin-load-add 选项在服务器启动序列中内置插件和存储引擎初始化之后加载插件。 --early-plugin-load 选项用于加载在初始化内置插件和存储引擎之前必须可用的插件。

每个插件加载选项的值都是一个用分号分隔的 plugin_libraryname=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 还允许在启动时加载在运行时无法加载的插件。

--plugin-load-add 选项补充了 --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
使用 INSTALL PLUGIN 语句安装的插件

可以使用 INSTALL PLUGIN 语句在运行时加载位于插件库文件中的插件。该语句还会在 mysql.plugin 表中注册插件,以使服务器在后续重新启动时加载它。因此,INSTALL PLUGIN 需要对 mysql.plugin 表具有 INSERT 权限。

插件库文件基本名称取决于您的平台。常见的后缀包括 Unix 和类 Unix 系统的 .so,以及 Windows 的 .dll

示例:--plugin-load-add 选项在服务器启动时安装插件。要从名为 somepluglib.so 的插件库文件安装名为 myplugin 的插件,请在 my.cnf 文件中使用以下几行

[mysqld]
plugin-load-add=myplugin=somepluglib.so

在这种情况下,插件不会在 mysql.plugin 中注册。在没有 --plugin-load-add 选项的情况下重新启动服务器会导致插件不在启动时加载。

或者,INSTALL PLUGIN 语句会使服务器在运行时从库文件加载插件代码

INSTALL PLUGIN myplugin SONAME 'somepluglib.so';

INSTALL PLUGIN 还会导致 永久 插件注册:插件将列在 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 是要影响的插件的名称,例如 innodbcsvvalidate_password。与其他选项一样,选项名称中的连字符和下划线可以互换。此外,激活状态值不区分大小写。例如,--my_plugin=ON--my-plugin=on 等效。

  • --plugin_name=OFF

    告诉服务器禁用插件。

  • --plugin_name[=ON]

    告诉服务器启用插件。(将选项指定为 --plugin_name 而不带值具有相同的效果。)如果插件初始化失败,则服务器将在禁用插件的情况下运行。

  • --plugin_name=FORCE

    告诉服务器启用插件,但如果插件初始化失败,则服务器不会启动。换句话说,此选项强制服务器以启用插件的方式运行,或者根本不运行。

  • --plugin_name=FORCE_PLUS_PERMANENT

    FORCE 相似,但另外会阻止插件在运行时卸载。如果用户尝试使用 UNINSTALL PLUGIN 这样做,则会发生错误。

插件激活状态在信息架构 PLUGINS 表的 LOAD_OPTION 列中可见。

假设 CSVBLACKHOLEARCHIVE 是内置的可插拔存储引擎,并且您希望服务器在启动时加载它们,但要遵守以下条件:如果 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 启用但初始化失败,则需要插件才能进行的服务器操作方面会发生变化。例如,如果插件实现了存储引擎,则该存储引擎的现有表将变得不可访问,并且尝试为该存储引擎创建新表会导致使用默认存储引擎的表,除非启用了 NO_ENGINE_SUBSTITUTION SQL 模式,以导致发生错误。

禁用插件可能需要调整其他选项。

卸载插件

在运行时,UNINSTALL PLUGIN 语句会禁用并卸载服务器已知的插件。该语句会卸载插件并将其从 mysql.plugin 系统表中删除(如果它已在其中注册)。因此,UNINSTALL PLUGIN 语句需要对 mysql.plugin 表具有 DELETE 权限。如果插件不再在表中注册,则服务器不会在后续重新启动期间加载该插件。

UNINSTALL PLUGIN 可以卸载插件,无论它是使用 INSTALL PLUGIN 在运行时加载的,还是使用插件加载选项在启动时加载的,但要遵守以下条件

  • 它无法卸载内置到服务器中的插件。这些插件可以在信息架构 PLUGINS 表或 SHOW PLUGINS 的输出中识别出来,因为它们的库名称为 NULL

  • 它无法卸载服务器使用 --plugin_name=FORCE_PLUS_PERMANENT 启动的插件,因为这会阻止插件在运行时卸载。这些插件可以在 PLUGINS 表的 LOAD_OPTION 列中识别出来。

要卸载当前使用插件加载选项在服务器启动时加载的插件,请使用以下步骤。

  1. my.cnf 文件中删除与插件相关的任何选项和系统变量。如果任何插件系统变量已持久保存到 mysqld-auto.cnf 文件中,请使用 RESET PERSIST var_name 为每个变量删除它。

  2. 重新启动服务器。

  3. 插件通常使用启动时的插件加载选项或使用 INSTALL PLUGIN 在运行时安装,但不会同时使用两者。但是,如果在某个时间点也使用过 INSTALL PLUGIN,则从 my.cnf 文件中删除插件的选项可能不足以卸载它。如果插件仍然出现在 PLUGINSSHOW PLUGINS 的输出中,请使用 UNINSTALL PLUGIN 将其从 mysql.plugin 表中删除。然后再次重新启动服务器。

插件和可加载函数

安装插件时,也可能会自动安装相关的可加载函数。如果是这样,卸载插件时也会自动卸载这些函数。