要升级 InnoDB ReplicaSet 中的实例,请完成以下步骤
检查已安装二进制文件的版本
mysqlrouter --version: 检查已安装的 MySQL Router 版本。
mysqlsh --version: 检查已安装的 MySQL Shell 版本。
mysqld --version: 检查已安装的 MySQL 服务器版本。
要升级 MySQL Router,请完成以下步骤
-
停止 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)。
获取并安装 最新版本的 MySQL Router。
-
启动 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。
-
通过发出以下命令停止并退出 MySQL Shell
\q
-
从命令行重新启动 MySQL Shell,通过发出以下命令
mysqlsh
-
-
要升级 InnoDB ReplicaSet,请将 MySQL Shell 的全局会话连接到您的 ReplicaSet,并使用
dba.upgradeMetadata()
操作将 ReplicaSet 的元数据升级到新的元数据。dba.upgradeMetadata()
函数将已安装的元数据模式的版本与该 Shell 支持的元数据模式的版本进行比较。如果已安装的元数据版本较低,则会启动升级过程。
元数据升级如果 ReplicaSet 已经使用最新版本,则元数据升级可能不会执行任何操作。
-
通过在升级主实例之前升级所有辅助实例来升级 MySQL 服务器。
升级 MySQL 服务器是可选的。服务器升级的影响可能比升级 MySQL Shell 和 MySQL Router 更大。此外,您应始终将 MySQL Shell 和 MySQL Router 保持在最新版本,即使服务器没有升级也是如此;对于 InnoDB 集群和 ReplicaSet 来说,这一点尤其重要。
-
通过发出以下命令之一来停止 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
-
获取并安装 最新版本的 MySQL 服务器。
-
通过发出以下命令之一来启动 MySQL 服务器
-
如果 MySQL 服务器使用的是 systemd,则发出以下命令
systemctl start mysqld
-
如果 MySQL 服务器使用的是 init.d,则发出以下命令
/etc/init.d/mysql start
-
如果 MySQL 服务器使用的是 service,则发出以下命令
service mysql start
-
如果您在 Microsoft Windows 上部署了 MySQL 服务器,则发出以下命令
mysqld
-
-
升级完所有辅助实例后,升级主实例以完成升级过程。
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(
会配置您要在 ReplicaSet 中使用的每个实例。MySQL Shell 可以连接到实例并配置它,也可以传递一个instance
)instance
名称来配置特定的远程实例。有关更多信息,请参见 第 6.2.3 节,“持久化设置”。以下示例显示了如果
PRIMARY
成员的read_only
或super_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 的状态”。