### 2.11.6 在 Unix/Linux 上升级 MySQL 二进制或基于包的安装

本节介绍如何在 Unix/Linux 上升级 MySQL 二进制和基于包的安装。描述了就地和逻辑升级方法。

-   [就地升级](upgrade-binary-package.html#upgrade-procedure-inplace)

-   [逻辑升级](upgrade-binary-package.html#upgrade-procedure-logical)

-   [MySQL 集群升级](upgrade-binary-package.html#upgrading-cluster)

#### 就地升级

就地升级包括关闭旧的 MySQL 服务器，用新的替换旧的 MySQL 二进制文件或包，在现有数据目录上重新启动 MySQL，以及升级现有安装中需要升级的任何剩余部分。有关可能需要升级的内容的详细信息，请参阅[第 2.11.3 节，“MySQL 升级过程升级了什么”](upgrading-what-is-upgraded.html).

笔记

如果您要升级最初通过安装多个 RPM 包生成的安装，请升级所有包，而不仅仅是一些包。例如，如果您之前安装了服务器和客户端 RPM，请不要只升级服务器 RPM。

对于某些 Linux 平台，从 RPM 或 Debian 软件包安装 MySQL 包括用于管理 MySQL 服务器启动和关闭的 systemd 支持。在这些平台上，[**mysqld\_安全的**](mysqld-safe.html)没有安装。在这种情况下，请使用 systemd 进行服务器启动和关闭，而不是以下说明中使用的方法。看[第 2.5.9 节，“使用 systemd 管理 MySQL 服务器”](using-systemd.html).

有关 MySQL 集群安装的升级，另请参阅[MySQL 集群升级](upgrade-binary-package.html#upgrading-cluster).

要执行就地升级：

1.  查看中的信息[第 2.11.1 节，“开始之前”](upgrade-before-you-begin.html).

2.  通过完成初步检查，确保安装的升级准备就绪[第 2.11.5 节，“准备升级安装”](upgrade-prerequisites.html).

3.  如果您将 XA 事务与`InnoDB`， 跑步[`XA 恢复`](xa-statements.html)在升级之前检查未提交的 XA 事务。如果返回结果，则提交或回滚 XA 事务，方法是发出[`XA 提交`](xa-statements.html)要么[`XA 回滚`](xa-statements.html)陈述。

4.  如果您是从 MySQL 5.7.11 或更早版本升级到 MySQL 8.0，并且有加密`InnoDB`表空间，通过执行以下语句旋转密钥环主密钥：

    ```
    ALTER INSTANCE ROTATE INNODB MASTER KEY;
    ```

5.  如果您通常运行配置有的 MySQL 服务器[`innodb_fast_shutdown`](innodb-parameters.html#sysvar_innodb_fast_shutdown)调成`2`（冷关机），通过执​​行以下任一语句将其配置为执行快速或慢速关机：

    ```
    SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
    SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
    ```

    快速或慢速关机，`InnoDB`将其撤消日志和数据文件保留在可以处理版本之间文件格式差异的状态。

6.  关闭旧的 MySQL 服务器。例如：

    ```
    mysqladmin -u root -p shutdown
    ```

7.  升级 MySQL 二进制文件或包。如果升级二进制安装，解压新的 MySQL 二进制分发包。看[获取并解包分发](binary-installation.html#binary-installation-unpack).对于基于包的安装，请安装新包。

8.  使用现有数据目录启动 MySQL 8.0 服务器。例如：

    ```
    mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
    ```

    如果有加密`InnoDB`表空间，使用[`--early-plugin-load`](server-options.html#option_mysqld_early-plugin-load)加载密钥环插件的选项。

    当您启动 MySQL 8.0 服务器时，它会自动检测数据字典表是否存在。如果没有，服务器在数据目录中创建它们，用元数据填充它们，然后继续其正常的启动顺序。在此过程中，服务器会升级所有数据库对象的元数据，包括数据库、表空间、系统和用户表、视图和存储程序（存储过程和函数、触发器和 Event Scheduler 事件）。服务器还会删除以前用于元数据存储的文件。例如，从 MySQL 5.7 升级到 MySQL 8.0 后，您可能会注意到表不再具有`.frm`文件。

    如果此步骤失败，服务器会将所有更改还原到数据目录。在这种情况下，您应该删除所有重做日志文件，在同一数据目录上启动 MySQL 5.7 服务器，并修复任何错误的原因。然后再对5.7服务器进行慢速关机，启动MySQL 8.0服务器再试一次。

9.  在上一步中，服务器根据需要升级数据字典。现在有必要执行任何剩余的升级操作：

    -   从 MySQL 8.0.16 开始，服务器作为上一步的一部分执行此操作，在`mysql`MySQL 5.7 和 MySQL 8.0 之间的系统数据库，以便您可以利用新的权限或功能。它还带来了 Performance Schema，`INFORMATION_SCHEMA`， 和`系统`MySQL 8.0 的数据库是最新的，并检查所有用户数据库是否与当前版本的 MySQL 不兼容。

    -   在 MySQL 8.0.16 之前，服务器只升级上一步中的数据字典。MySQL 8.0服务器启动成功后，执行[**mysql\_升级**](mysql-upgrade.html)执行剩余的升级任务：

        ```
        mysql_upgrade -u root -p
        ```

        然后关闭并重新启动 MySQL 服务器，以确保对系统表所做的任何更改都生效。例如：

        ```
        mysqladmin -u root -p shutdown
        mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
        ```

        第一次启动 MySQL 8.0 服务器时（在前面的步骤中），您可能会注意到错误日志中有关未升级表的消息。如果[**mysql\_升级**](mysql-upgrade.html)已经运行成功，第二次启动服务器时应该没有这样的消息了。

笔记

升级过程不会升级时区表的内容。有关升级说明，请参阅[第 5.1.15 节，“MySQL 服务器时区支持”](time-zone-support.html).

如果升级过程使用[**mysql\_升级**](mysql-upgrade.html)（即 MySQL 8.0.16 之前的版本），该过程也不会升级帮助表的内容。有关这种情况下的升级说明，请参阅[第 5.1.17 节，“服务器端帮助支持”](server-side-help-support.html).

#### 逻辑升级

逻辑升级涉及使用备份或导出实用程序从旧 MySQL 实例导出 SQL，例如[**mysql转储**](mysqldump.html)要么[**mysql泵**](mysqlpump.html)，安装新的 MySQL 服务器，并将 SQL 应用到新的 MySQL 实例。有关可能需要升级的内容的详细信息，请参阅[第 2.11.3 节，“MySQL 升级过程升级了什么”](upgrading-what-is-upgraded.html).

笔记

对于某些 Linux 平台，从 RPM 或 Debian 软件包安装 MySQL 包括用于管理 MySQL 服务器启动和关闭的 systemd 支持。在这些平台上，[**mysqld\_安全的**](mysqld-safe.html)没有安装。在这种情况下，请使用 systemd 进行服务器启动和关闭，而不是以下说明中使用的方法。看[第 2.5.9 节，“使用 systemd 管理 MySQL 服务器”](using-systemd.html).

警告

将从以前的 MySQL 版本提取的 SQL 应用到新的 MySQL 版本可能会由于新的、更改的、不推荐的或删除的特性和功能引入的不兼容性而导致错误。因此，从以前的 MySQL 版本中提取的 SQL 可能需要修改以启用逻辑升级。

要在升级到最新的 MySQL 8.0 版本之前识别不兼容性，请执行中描述的步骤[第 2.11.5 节，“准备升级安装”](upgrade-prerequisites.html).

要执行逻辑升级：

1.  查看中的信息[第 2.11.1 节，“开始之前”](upgrade-before-you-begin.html).

2.  从以前的 MySQL 安装中导出现有数据：

    ```
    mysqldump -u root -p
      --add-drop-table --routines --events
      --all-databases --force > data-for-upgrade.sql
    ```

    笔记

    使用[`--例程`](mysqldump.html#option_mysqldump_routines)和[`--事件`](mysqldump.html#option_mysqldump_events)选项[**mysql转储**](mysqldump.html)（如上所示）如果您的数据库包含存储程序。这[`--所有数据库`](mysqldump.html#option_mysqldump_all-databases)选项包括转储中的所有数据库，包括`mysql`保存系统表的数据库。

    重要的

    如果您有包含生成列的表，请使用[**mysql转储**](mysqldump.html)MySQL 5.7.9 或更高版本提供的实用程序来创建转储文件。这[**mysql转储**](mysqldump.html)早期版本中提供的实用程序对生成的列定义使用了不正确的语法（错误 #20769542）。您可以使用[`INFORMATION_SCHEMA.COLUMNS`](information-schema-columns-table.html)table 来标识具有生成列的表。

3.  关闭旧的 MySQL 服务器。例如：

    ```
    mysqladmin -u root -p shutdown
    ```

4.  安装 MySQL 8.0。有关安装说明，请参阅[第2章，*安装和升级 MySQL*](installing.html).

5.  初始化一个新的数据目录，如中所述[第 2.10.1 节，“初始化数据目录”](data-directory-initialization.html).例如：

    ```
    mysqld --initialize --datadir=/path/to/8.0-datadir
    ```

    复制临时`'根'@'本地主机'`密码显示在您的屏幕上或写入您的错误日志以供以后使用。

6.  使用新的数据目录启动 MySQL 8.0 服务器。例如：

    ```
    mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir &
    ```

7.  重置`根`密码：

    ```
    $> mysql -u root -p
    Enter password: ****  <- enter temporary root password
    ```

    ```
    mysql> ALTER USER USER() IDENTIFIED BY 'your new password';
    ```

8.  将之前创建的转储文件加载到新的 MySQL 服务器中。例如：

    ```
    mysql -u root -p --force < data-for-upgrade.sql
    ```

    笔记

    不建议在服务器上启用 GTID 时加载转储文件（[`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode))，如果您的转储文件包含系统表。[**mysql转储**](mysqldump.html)为使用非事务性 MyISAM 存储引擎的系统表发出 DML 指令，并且在启用 GTID 时不允许这种组合。另请注意，将转储文件从启用了 GTID 的服务器加载到启用了 GTID 的另一台服务器中，会导致生成不同的事务标识符。

9.  执行任何剩余的升级操作：

    -   在 MySQL 8.0.16 及更高版本中，关闭服务器，然后使用[`--升级=强制`](server-options.html#option_mysqld_upgrade)执行剩余升级任务的选项：

        ```
        mysqladmin -u root -p shutdown
        mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir --upgrade=FORCE &
        ```

        重新启动后[`--升级=强制`](server-options.html#option_mysqld_upgrade)，服务器会在`mysql`MySQL 5.7 和 MySQL 8.0 之间的系统模式，以便您可以利用新的权限或功能。它还带来了 Performance Schema，`INFORMATION_SCHEMA`， 和`系统`模式是 MySQL 8.0 的最新版本，并检查所有用户模式是否与当前版本的 MySQL 不兼容。

    -   在 MySQL 8.0.16 之前，执行[**mysql\_升级**](mysql-upgrade.html)执行剩余的升级任务：

        ```
        mysql_upgrade -u root -p
        ```

        然后关闭并重新启动 MySQL 服务器，以确保对系统表所做的任何更改都生效。例如：

        ```
        mysqladmin -u root -p shutdown
        mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir &
        ```

笔记

升级过程不会升级时区表的内容。有关升级说明，请参阅[第 5.1.15 节，“MySQL 服务器时区支持”](time-zone-support.html).

如果升级过程使用[**mysql\_升级**](mysql-upgrade.html)（即 MySQL 8.0.16 之前的版本），该过程也不会升级帮助表的内容。有关这种情况下的升级说明，请参阅[第 5.1.17 节，“服务器端帮助支持”](server-side-help-support.html).

笔记

加载包含 MySQL 5.7 的转储文件`mysql`schema 重新创建两个不再使用的表：`事件`和`过程`.（对应的 MySQL 8.0 表是`事件`和`例行公事`, 都是数据字典表, 都是受保护的。) 升级成功后你可以删除`事件`和`过程`通过执行这些 SQL 语句来创建表：

```
DROP TABLE mysql.event;
DROP TABLE mysql.proc;
```

#### MySQL 集群升级

本节中的信息是对中所述的就地升级过程的补充[就地升级](upgrade-binary-package.html#upgrade-procedure-inplace)，用于升级 MySQL 集群时使用。

从 MySQL 8.0.16 开始，MySQL Cluster 升级可以作为常规滚动升级执行，遵循通常的三个有序步骤：

1.  升级米高梅节点。

2.  一次升级一个数据节点。

3.  一次升级一个 API 节点（包括 MySQL 服务器）。

    升级每个节点的方式与 MySQL 8.0.16 之前的版本几乎相同，因为升级数据字典和升级系统表是分开的。升级每个人有两个步骤`mysqld`：

4.  导入数据字典。

    使用以下命令启动新服务器[`--升级=最小`](server-options.html#option_mysqld_upgrade)升级数据字典但不升级系统表的选项。这与 MySQL 8.0.16 之前的启动服务器而不调用的动作基本相同[**mysql\_升级**](mysql-upgrade.html).

    MySQL 服务器必须连接到`新开发银行`为了完成这个阶段。如果有的话`新开发银行`要么`NDBINFO`表存在，并且服务器无法连接到集群，它退出并显示错误消息：

    ```
    Failed to Populate DD tables.
    ```

5.  升级系统表。

    在 MySQL 8.0.16 之前，DBA 调用[**mysql\_升级**](mysql-upgrade.html)客户端升级系统表。从 MySQL 8.0.16 开始，服务器执行此操作：要升级系统表，请重新启动每个单独的表[**mysqld**](mysqld.html)没有[`--升级=最小`](server-options.html#option_mysqld_upgrade)选项。
