MySQL Shell 8.4  /  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 shell 脚本以反映该路径。

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

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

    或者在使用 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 节,“持久化设置”

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

    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 的状态”。.