要升级 InnoDB ReplicaSet 中的实例,请完成以下步骤:
检查已安装二进制文件的版本:
mysqlrouter --version
:检查安装的 MySQL Router 的版本。mysqlsh --version
:检查安装的 MySQL Shell 的版本。mysqld --version
:检查安装的 MySQL Server 版本。要升级 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
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
通过安装新的二进制文件并停止和启动 MySQLShell 来升级 MySQL Shell :
获取并安装最新版本的 MySQL Shell 。
通过发出以下命令停止并退出 MySQL Shell:
\q
通过执行以下命令,从命令行重新启动 MySQL Shell :
mysqlsh
升级 InnoDB ReplicaSet 元数据 :
要升级 InnoDB ReplicaSet ,请将 MySQL Shell 的全局会话连接到 ReplicaSet ,并使用 dba.upgradeMetadata()
操作将 ReplicaSet 的元数据升级为新的元数据。
dba.upgradeMetadata()
函数将安装的元数据模式的版本与此 Shell 支持的元数据模式版本进行比较。如果安装的元数据版本较低,则启动升级过程。
元数据升级
如果 ReplicaSet 已使用最新版本,则元数据升级可能不起作用。
通过在升级主实例之前升级所有辅助实例来升级 MySQL Server 。
升级 MySQL Server 是可选的
升级 MySQL Server 是可选的。服务器升级可能会比升级 MySQL Shell 和 MySQL Router 产生更大的影响。此外,您应该始终保持 MySQL Shell 和 MySQL Router 的最新版本,即使 Server 不是;这对于 InnoDB Cluster 和 ReplicaSet 来说是正确的。
通过执行以下命令之一停止 MySQL Server :
systemctl stop mysqld
/etc/init.d/mysql stop
service mysql stop
mysqladmin -u root -p shutdown
获取并安装最新版本的 MySQL Server 。
通过发出以下命令之一启动MySQL Server:
systemctl start mysqld
/etc/init.d/mysql start
service mysql start
mysqld
升级所有辅助实例后,升级主实例以完成升级过程。
InnoDB ReplicaSet 不支持自动切换主实例。在升级主实例之前,需要将主实例设置为已升级的成员。
将升级的辅助实例设置为主实例:
<ReplicaSet>.setPrimaryInstance(':' )
使用
操作可以安全地将 ReplicaSet 的主实例更改为另一个实例。当前主实例将降级为辅助实例并设置为只读,而升级的实例将成为新的主实例并设置成读写。所有其他次要实例都将更新为从新的主实例复制。针对 ReplicaSet 启动的 MySQL Router 实例会自动开始将读写客户端重定向到新的主服务器。
升级旧的主实例。升级后,可以使用
将此升级后的实例还原为主实例。有关详细信息,请参阅 第 9.6 节 “更改主实例” 。
升级 MySQL Router 、MySQL Shell 和 MySQL Server 后:
通过发出
来检查 ReplicaSet 的状态。在以下示例中,
返回 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 可以连接到一个实例,然后对其进行配置,也可以传递一个实例名来配置一个特定的远程实例。有关更多信息,请参阅 第 6.2.4 节 “持久化设置” 。
以下示例显示了如果 PRIMARY
成员的 read_only
或 super_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 状态” 。