MySQL Shell 9.0  /  MySQL InnoDB ReplicaSet  /  升级 InnoDB ReplicaSet

9.11 升级 InnoDB ReplicaSet

要升级 InnoDB ReplicaSet 中的实例,请完成以下步骤

检查已安装二进制文件的版本

  • mysqlrouter --version: 检查已安装的 MySQL Router 版本。

  • mysqlsh --version: 检查已安装的 MySQL Shell 版本。

  • mysqld --version: 检查已安装的 MySQL 服务器版本。

升级 MySQL Router。

要升级 MySQL Router,请完成以下步骤

  1. 停止 MySQL Router。

    在 Unix 系统上,如果您使用了可选的 --directory 引导选项,则会创建一个自包含的安装,其中包含所有生成的目录和文件,位于您在 引导 路由器时选择的目录中。这些文件包括 stop.sh。导航到此目录并发出此命令

    ./stop.sh

    在 Microsoft Windows 上,如果您使用了可选的 --directory 引导选项,则会创建一个自包含的安装,其中包含所有生成的目录和文件,位于您在 引导 路由器时选择的目录中。这些文件包括 stop.ps1。导航到此目录并发出此命令

    .\stop.ps1

    或者在使用 systemd 的 Linux 系统上,通过发出以下命令停止 MySQL Router 服务

    systemctl stop mysqlrouter.service

    否则,杀死关联的 mysqlrouter 进程的 进程 ID (PID)

  2. 获取并安装 最新版本的 MySQL Router。

  3. 启动 MySQL Router。

    在 Unix 系统上,如果您使用了可选的 --directory 引导选项,则会创建一个自包含的安装,其中包含所有生成的目录和文件,位于您选择的目录中。这些文件包括 start.sh。导航到该目录并发出此命令

    ./start.sh

    如果新的路由器路径已更改,则必须更新 start.sh 脚本以反映该路径。

    #!/bin/bash
    basedir=/tmp/myrouter
    ROUTER_PID=$basedir/mysqlrouter.pid /usr/bin/mysqlrouter -c $basedir/mysqlrouter.conf &
    disown %-

    如果您手动升级 MySQL Router,而不是使用包管理,则可以更新 basedir=。重新引导路由器还会重新生成 start.sh 脚本。

    或者在使用 systemd 的 Linux 系统上,通过发出以下命令启动 MySQL Router 服务

    systemctl start mysqlrouter.service

    在 Microsoft Windows 上,如果您使用了可选的 --directory 引导选项,则会创建一个自包含的安装,其中包含所有生成的目录和文件,位于您选择的目录中。这些文件包括 start.ps1。导航到该目录并发出此命令

    .\start.ps1

    在使用新的路由器二进制文件启动 MySQL Router 时,路由器的版本将升级

    mysqlrouter --version

升级 MySQL Shell

通过安装新的二进制文件,以及停止和启动 MySQL Shell 来升级 MySQL Shell

  1. 获取并安装 最新版本的 MySQL Shell。

  2. 通过发出以下命令停止并退出 MySQL Shell

    \q
  3. 从命令行重新启动 MySQL Shell,通过发出以下命令

    mysqlsh
  4. 升级 InnoDB ReplicaSet 元数据

    • 要升级 InnoDB ReplicaSet,请将 MySQL Shell 的全局会话连接到您的 ReplicaSet,并使用 dba.upgradeMetadata() 操作将 ReplicaSet 的元数据升级到新的元数据。

      dba.upgradeMetadata() 函数将已安装的元数据模式的版本与该 Shell 支持的元数据模式的版本进行比较。如果已安装的元数据版本较低,则会启动升级过程。

    元数据升级

    如果 ReplicaSet 已经使用最新版本,则元数据升级可能不会执行任何操作。

升级 MySQL 服务器

通过在升级主实例之前升级所有辅助实例来升级 MySQL 服务器。

升级 MySQL 服务器是可选的

升级 MySQL 服务器是可选的。服务器升级的影响可能比升级 MySQL Shell 和 MySQL Router 更大。此外,您应始终将 MySQL Shell 和 MySQL Router 保持在最新版本,即使服务器没有升级也是如此;对于 InnoDB 集群和 ReplicaSet 来说,这一点尤其重要。

  1. 通过发出以下命令之一来停止 MySQL 服务器

    • 如果 MySQL 服务器使用的是 systemd,则发出以下命令

      systemctl stop mysqld
    • 如果 MySQL 服务器使用的是 init.d,则发出以下命令

      /etc/init.d/mysql stop
    • 如果 MySQL 服务器使用的是 service,则发出以下命令

      service mysql stop
    • 如果您在 Microsoft Windows 上部署了 MySQL 服务器,则发出以下命令

      mysqladmin -u root -p shutdown
  2. 获取并安装 最新版本的 MySQL 服务器。

  3. 通过发出以下命令之一来启动 MySQL 服务器

    • 如果 MySQL 服务器使用的是 systemd,则发出以下命令

      systemctl start mysqld
    • 如果 MySQL 服务器使用的是 init.d,则发出以下命令

      /etc/init.d/mysql start
    • 如果 MySQL 服务器使用的是 service,则发出以下命令

      service mysql start
    • 如果您在 Microsoft Windows 上部署了 MySQL 服务器,则发出以下命令

      mysqld
  4. 升级完所有辅助实例后,升级主实例以完成升级过程。

    InnoDB ReplicaSet 中没有自动主切换。您需要在升级主实例之前将主实例设置为您已升级的成员。

    将已升级的辅助实例设置为主实例

    <ReplicaSet>.setPrimaryInstance('<host>:<port>')

    使用 <ReplicaSet>.setPrimaryInstance() 操作可以安全地将 ReplicaSet 的主实例更改为另一个实例。当前的主实例将降级为辅助实例并变为只读,而提升的实例将成为新的主实例并变为可写。所有其他辅助实例都将更新为从新的主实例复制。您针对 ReplicaSet 引导的 MySQL Router 实例将自动开始将读写客户端重定向到新的主实例。

    升级 旧的 主实例。升级完后,您可以使用 <ReplicaSet>.setPrimaryInstance() 将此升级的实例恢复为主实例。有关更多信息,请参见 第 9.7 节,“更改主实例”

升级后状态检查

升级 MySQL Router、MySQL Shell 和 MySQL 服务器后

  • 通过发出 <ReplicaSet>.status() 来检查 ReplicaSet 的状态。在以下示例中,<ReplicaSet>.status() 返回 instanceErrors

      mysqlsh> <ReplicaSet>.status();
    {
        "replicaSet": {
            "name": "myReplicaSet",
            "primary": "example-el7-1644251369:30014",
            "status": "AVAILABLE",
            "statusText": "All instances available.",
            "topology": {
                "example-el7-1644251369:30011": {
                    "address": "example-el7-1644251369:30011",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "SECONDARY",
                    "mode": "R/O",
                    "replication": {
                        "applierStatus": "APPLIED_ALL",
                        "applierThreadState": "Waiting for an event from Coordinator",
                        "applierWorkerThreads": 4,
                        "receiverStatus": "ON",
                        "receiverThreadState": "Waiting for source to send event",
                        "replicationLag": null
                    },
                    "status": "ONLINE"
                },
                "example-el7-1644251369:30014": {
                    "address": "example-el7-1644251369:30014",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "PRIMARY",
                    "mode": "R/W",
                    "status": "ONLINE"
                },
                "example-el7-1644251369:30017": {
                    "address": "example-el7-1644251369:30017",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "SECONDARY",
                    "mode": "R/O",
                    "replication": {
                        "applierStatus": "APPLIED_ALL",
                        "applierThreadState": "Waiting for an event from Coordinator",
                        "applierWorkerThreads": 4,
                        "receiverStatus": "ON",
                        "receiverThreadState": "Waiting for source to send event",
                        "replicationLag": null
                    },
                    "status": "ONLINE"
                },
                "example-el7-1644251369:30021": {
                    "address": "example-el7-1644251369:30021",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "SECONDARY",
                    "mode": "R/O",
                    "replication": {
                        "applierStatus": "APPLIED_ALL",
                        "applierThreadState": "Waiting for an event from Coordinator",
                        "applierWorkerThreads": 4,
                        "receiverStatus": "ON",
                        "receiverThreadState": "Waiting for source to send event",
                        "replicationLag": null
                    },
                    "status": "ONLINE"
                }
            },
            "type": "ASYNC"
        }
    }

    instanceError 告诉我们发出 dba.configureReplicaSetInstance() 来修复错误。

    dba.configureReplicaSetInstance(instance) 会配置您要在 ReplicaSet 中使用的每个实例。MySQL Shell 可以连接到实例并配置它,也可以传递一个 instance 名称来配置特定的远程实例。有关更多信息,请参见 第 6.2.3 节,“持久化设置”

    以下示例显示了如果 PRIMARY 成员的 read_onlysuper_read_only 设置为 ON,则 <ReplicaSet>.status() 的输出

    mysqlsh > <ReplicaSet>.status();
    replicaset.status();
    {
        "replicaSet": {
            "name": "myReplicaSet",
            "primary": "example-el7-1644251369:30014",
            "status": "UNAVAILABLE",
            "statusText": "PRIMARY instance is not available, but there is at least one SECONDARY 
                           that could be force-promoted.",
            "topology": {
                "example-el7-1644251369:30011": {
                    "address": "example-el7-1644251369:30011",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "SECONDARY",
                    "mode": "R/O",
                    "replication": {
                        "applierStatus": "APPLIED_ALL",
                        "applierThreadState": "Waiting for an event from Coordinator",
                        "applierWorkerThreads": 4,
                        "receiverStatus": "ON",
                        "receiverThreadState": "Waiting for source to send event",
                        "replicationLag": null
                    },
                    "status": "ONLINE"
                },
                "example-el7-1644251369:30014": {
                    "address": "example-el7-1644251369:30014",
                    "fenced": true,
                    "instanceErrors": [
                        "ERROR: Instance is a PRIMARY but is READ-ONLY: read_only=ON, super_read_only=ON",
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "PRIMARY",
                    "mode": "R/O",
                    "status": "ERROR"
                },
                "example-el7-1644251369:30017": {
                    "address": "example-el7-1644251369:30017",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "SECONDARY",
                    "mode": "R/O",
                    "replication": {
                        "applierStatus": "APPLIED_ALL",
                        "applierThreadState": "Waiting for an event from Coordinator",
                        "applierWorkerThreads": 4,
                        "receiverStatus": "ON",
                        "receiverThreadState": "Waiting for source to send event",
                        "replicationLag": null
                    },
                    "status": "ONLINE"
                },
                "example-el7-1644251369:30021": {
                    "address": "example-el7-1644251369:30021",
                    "instanceErrors": [
                        "NOTE: The required parallel-appliers settings are not enabled on the instance. 
                               Use dba.configureReplicaSetInstance() to fix it."
                    ],
                    "instanceRole": "SECONDARY",
                    "mode": "R/O",
                    "replication": {
                        "applierStatus": "APPLIED_ALL",
                        "applierThreadState": "Waiting for an event from Coordinator",
                        "applierWorkerThreads": 4,
                        "receiverStatus": "ON",
                        "receiverThreadState": "Waiting for source to send event",
                        "replicationLag": null
                    },
                    "status": "ONLINE"
                }
            },
            "type": "ASYNC"
        }
    }

    有关更多信息,请参见 第 9.10 节,“检查 InnoDB ReplicaSet 的状态”