### 5.6.1 安装和卸载插件

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

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

加载插件时，有关它的信息可用，如中所述[第 5.6.2 节，“获取服务器插件信息”](obtaining-plugin-information.html).

-   [安装插件](plugin-loading.html#server-plugin-installing)

-   [控制插件激活状态](plugin-loading.html#server-plugin-activating)

-   [卸载插件](plugin-loading.html#server-plugin-uninstalling)

-   [插件和可加载函数](plugin-loading.html#server-plugin-loadable-function-installing)

#### 安装插件

在使用服务器插件之前，必须使用以下方法之一安装它。在说明中，*`插件名称`*代表插件名称，例如`innodb`,`csv`， 要么`验证密码`.

-   [内置插件](plugin-loading.html#server-plugin-installing-built-in)

-   [在 mysql.plugin 系统表中注册的插件](plugin-loading.html#server-plugin-installing-system-table)

-   [以命令行选项命名的插件](plugin-loading.html#server-plugin-installing-command-line)

-   [使用 INSTALL PLUGIN 语句安装的插件](plugin-loading.html#server-plugin-installing-install-plugin)

##### 内置插件

服务器会自动识别内置插件。默认情况下，服务器在启动时启用插件。一些内置插件允许使用`--*`插件名称`*[=*`激活状态`*]`选项。

##### 在 mysql.plugin 系统表中注册的插件

这`mysql.plugin`系统表用作插件的注册表（内置插件除外，不需要注册）。在正常启动过程中，服务器会加载表中注册的插件。默认情况下，对于从`mysql.plugin`表，服务器也启用插件。这可以通过`--*`插件名称`*[=*`激活状态`*]`选项。

如果服务器以[`--skip-grant-tables`](server-options.html#option_mysqld_skip-grant-tables)选项，插件注册在`mysql.plugin`表未加载且不可用。

##### 以命令行选项命名的插件

位于插件库文件中的插件可以在服务器启动时加载[`--插件加载`](server-options.html#option_mysqld_plugin-load),[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)， 要么[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)选项。通常，对于在启动时加载的插件，服务器也会启用该插件。这可以通过`--*`插件名称`*[=*`激活状态`*]`选项。

这[`--插件加载`](server-options.html#option_mysqld_plugin-load)和[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)在服务器启动序列期间初始化内置插件和存储引擎后，选项加载插件。这[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)选项用于加载在内置插件和存储引擎初始化之前必须可用的插件。

每个插件加载选项的值是一个分号分隔的列表*`插件库`*和*`姓名`*`=`*`插件库`*价值观。每个*`插件库`*是包含插件代码的库文件的名称，每个*`姓名`*是要加载的插件的名称。如果插件库的名称没有任何前面的插件名称，则服务器会加载该库中的所有插件。使用前面的插件名称，服务器仅从库中加载指定的插件。服务器在由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量。

插件加载选项不会在`mysql.plugin`桌子。对于后续重新启动，服务器仅在以下情况下再次加载插件[`--插件加载`](server-options.html#option_mysqld_plugin-load),[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)， 要么[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)再次给出。也就是说，该选项会生成一个一次性的插件安装操作，该操作会在单个服务器调用中持续存在。

[`--插件加载`](server-options.html#option_mysqld_plugin-load),[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)， 和[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)即使在[`--skip-grant-tables`](server-options.html#option_mysqld_skip-grant-tables)给出（这会导致服务器忽略`mysql.plugin`桌子）。[`--插件加载`](server-options.html#option_mysqld_plugin-load),[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)， 和[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)还允许在启动时加载无法在运行时加载的插件。

这[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项补充了[`--插件加载`](server-options.html#option_mysqld_plugin-load)选项：

-   每个实例[`--插件加载`](server-options.html#option_mysqld_plugin-load)重置插件集以在启动时加载，而[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)将一个或多个插件添加到要加载的插件集而不重置当前集。因此，如果多个实例[`--插件加载`](server-options.html#option_mysqld_plugin-load)已指定，仅最后一项适用。有多个实例[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)，都适用。

-   参数格式与 for 相同[`--插件加载`](server-options.html#option_mysqld_plugin-load), 但有多个实例[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)可用于避免将大量插件指定为单个冗长笨重的[`--插件加载`](server-options.html#option_mysqld_plugin-load)争论。

-   [`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)可以在没有的情况下给予[`--插件加载`](server-options.html#option_mysqld_plugin-load), 但任何实例[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)之前出现的[`--插件加载`](server-options.html#option_mysqld_plugin-load)没有效果，因为[`--插件加载`](server-options.html#option_mysqld_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.html)陈述。该语句还将插件注册在`mysql.plugin`表以使服务器在后续重新启动时加载它。为此原因，[`安装插件`](install-plugin.html)需要[`插入`](privileges-provided.html#priv_insert)的特权`mysql.plugin`桌子。

插件库文件的基本名称取决于您的平台。常见的后缀是`。所以`对于 Unix 和类 Unix 系统，`.dll`对于 Windows。

示例：[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项在服务器启动时安装插件。安装一个名为`我的插件`从一个名为的插件库文件`somepluglib.so`, 在 a 中使用这些行`我的.cnf`文件：

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

在这种情况下，插件未在`mysql.plugin`.重新启动服务器而不使用[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项导致插件在启动时不加载。

或者，[`安装插件`](install-plugin.html)语句使服务器在运行时从库文件中加载插件代码：

```
INSTALL PLUGIN myplugin SONAME 'somepluglib.so';
```

[`安装插件`](install-plugin.html)也会导致“永久”插件注册：插件在`mysql.plugin`表以确保服务器在后续重新启动时加载它。

许多插件可以在服务器启动或运行时加载。但是，如果插件被设计成必须在服务器启动期间加载和初始化，则尝试在运行时使用[`安装插件`](install-plugin.html)产生错误：

```
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.
```

在这种情况下，您必须使用[`--插件加载`](server-options.html#option_mysqld_plugin-load),[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)， 要么[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load).

如果插件同时使用[`--插件加载`](server-options.html#option_mysqld_plugin-load),[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)， 要么[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)选项和（作为较早的结果[`安装插件`](install-plugin.html)声明）在`mysql.plugin`表，服务器启动但将这些消息写入错误日志：

```
[ERROR] Function 'plugin_name' already exists
[Warning] Couldn't load plugin named 'plugin_name'
with soname 'plugin_object_file'.
```

#### 控制插件激活状态

如果服务器在启动时知道插件（例如，因为插件使用[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项或注册在`mysql.plugin`表），服务器默认加载并启用插件。可以使用`--*`插件名称`*[=*`激活状态`*]`启动选项，其中*`插件名称`*是要影响的插件的名称，例如`innodb`,`csv`， 要么`验证密码`.与其他选项一样，短划线和下划线在选项名称中可以互换。此外，激活状态值不区分大小写。例如，`--my_plugin=开启`和`--my-plugin=on`是等价的。

-   `--*`插件名称`*=关闭`

    [](<>)[](<>)

    告诉服务器禁用插件。这对于某些内置插件可能是不可能的，例如`mysql_native_password`.

-   `--*`插件名称`*[=开]`

    [](<>)[](<>)

    告诉服务器启用插件。（将选项指定为`--*`插件名称`*`没有值具有相同的效果。）如果插件无法初始化，服务器将在禁用插件的情况下运行。

-   `--*`插件名称`*=力`

    [](<>)[](<>)

    告诉服务器启用插件，但如果插件初始化失败，服务器不会启动。换句话说，此选项强制服务器在启用或不启用插件的情况下运行。

-   `--*`插件名称`*=FORCE_PLUS_PERMANENT`

     [](<>)[](<>)

    喜欢`力量`，但另外会阻止插件在运行时被卸载。如果用户尝试这样做[`卸载插件`](uninstall-plugin.html)，发生错误。

    插件激活状态在`加载选项`的列[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)桌子。

    假设`CSV`,`黑洞`， 和`档案`是内置的可插入存储引擎，并且您希望服务器在启动时加载它们，受以下条件限制：允许服务器运行，如果`CSV`初始化失败，必须要求`黑洞`初始化成功，应该禁用`档案`.为此，请在选项文件中使用这些行：


```
[mysqld]
csv=ON
blackhole=FORCE
archive=OFF
```

这`- 使能够-*`插件名称`*`选项格式是同义词`--*`插件名称`*=开`.这`--禁用-*`插件名称`*`和`- 跳过-*`插件名称`*`选项格式是同义词`--*`插件名称`*=关闭`.

如果插件被禁用，要么明确地使用`离开`或隐含地因为它启用了`在`但无法初始化，需要更改插件的服务器操作方面。例如，如果插件实现了存储引擎，则存储引擎的现有表将变得不可访问，并且尝试为存储引擎创建新表会导致表使用默认存储引擎，除非[`NO_ENGINE_SUBSTITUTION`](sql-mode.html#sqlmode_no_engine_substitution)启用 SQL 模式会导致发生错误。

禁用插件可能需要调整其他选项。例如，如果您使用[`--skip-innodb`](innodb-parameters.html#option_mysqld_innodb)禁用[`InnoDB`](innodb-storage-engine.html)， 其他`innodb_*`xxx`*`options 可能也需要在启动时省略。此外，由于[`InnoDB`](innodb-storage-engine.html)是默认存储引擎，除非您指定另一个可用的存储引擎，否则它无法启动[`--default_storage_engine`](server-system-variables.html#sysvar_default_storage_engine).您还必须设置[`--default_tmp_storage_engine`](server-system-variables.html#sysvar_default_tmp_storage_engine).

#### 卸载插件

在运行时，[`卸载插件`](uninstall-plugin.html)语句禁用和卸载服务器已知的插件。该语句卸载插件并将其从`mysql.plugin`系统表，如果它在那里注册。为此原因，[`卸载插件`](uninstall-plugin.html)声明要求[`删除`](privileges-provided.html#priv_delete)的特权`mysql.plugin`桌子。由于插件不再在表中注册，服务器在后续重新启动期间不会加载插件。

[`卸载插件`](uninstall-plugin.html)可以卸载插件，无论它是否在运行时加载[`安装插件`](install-plugin.html)或在启动时使用插件加载选项，受以下条件限制：

-   它无法卸载服务器内置的插件。这些可以识别为具有库名称的那些`空值`在输出中[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)要么[`显示插件`](show-plugins.html).

-   它无法卸载服务器启动时使用的插件`--*`插件名称`*=FORCE_PLUS_PERMANENT`，它可以防止插件在运行时卸载。这些可以从`加载选项`的列[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)桌子。

    要卸载当前在服务器启动时使用插件加载选项加载的插件，请使用此过程。

1.  从`我的.cnf`归档与插件相关的任何选项和系统变量。如果任何插件系统变量被持久化到`mysqld-auto.cnf`文件，使用删除它们[`重置持久 *`变量名`*`](reset-persist.html)为每个人删除它。

2.  重新启动服务器。

3.  插件通常在启动时使用插件加载选项或使用[`安装插件`](install-plugin.html)在运行时，但不是两者兼而有之。但是，从`我的.cnf`如果在某些时候，文件可能不足以卸载它[`安装插件`](install-plugin.html)也被使用了。如果插件仍然出现在输出中[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)要么[`显示插件`](show-plugins.html)， 采用[`卸载插件`](uninstall-plugin.html)将其从`mysql.plugin`桌子。然后再次重新启动服务器。

#### 插件和可加载函数

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