Documentation Home
MySQL 外壳 8.0  / 第 9 章 MySQL InnoDB 副本集  /  9.11 升级InnoDB ReplicaSet

9.11 升级InnoDB ReplicaSet

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

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

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

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

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

升级 MySQL 路由器。

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

  1. 停止 MySQL 路由器。

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

    ./stop.sh

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

    .\stop.ps1

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

    systemctl stop mysqlrouter.service

    否则,终止关联的 mysqlrouter进程的进程 ID (PID)

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

  3. 启动 MySQL 路由器。

    在 Unix 系统上,如果您使用了可选的-directory-bootstrap 选项,则会在您选择的位置创建一个包含所有生成的目录和文件的独立安装。这些文件包括 start.sh. 导航到目录并发出以下命令:

    ./start.sh

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

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

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

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

    systemctl start mysqlrouter.service

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

    .\start.ps1

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

    mysqlrouter --version

升级 MySQL 外壳

通过安装新的二进制文件并停止和启动 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 集群和 ReplicaSets 也是如此。

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

    • 如果 MySQL 服务器正在使用 systemd问题:

      systemctl stop mysqld
    • 如果 MySQL 服务器正在使用 init.d问题:

      /etc/init.d/mysql stop
    • 如果 MySQL 服务器正在使用 服务问题:

      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 mysql start
    • 如果您在 Microsoft Windows 问题上部署了 MySQL 服务器:

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

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

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

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

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

    升级old主实例。升级后,您可以使用 <ReplicaSet>.setPrimaryInstance()将升级后的实例恢复为主实例。有关详细信息,请参阅 第 9.6 节 “更改主实例”

升级后状态检查

升级 MySQL Router、MySQL Shell 和 MySQL Servers 后:

  • 通过发出 来检查 ReplicaSet 的状态 <ReplicaSet>.status()。在以下示例中,<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.4 节,“持久设置”

    以下示例显示了 <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 的状态”。.