### 17.4.8故障切换期间切换源

您可以使用[`将复制源更改为`](change-replication-source-to.html)语句（来自MySQL 8.0.23）或[`将主机更改为`](change-master-to.html)语句（MySQL 8.0.23之前）。副本不检查源上的数据库是否与副本上的数据库兼容；它只是从新源的二进制日志中指定的坐标开始读取和执行事件。在故障转移情况下，组中的所有服务器通常从同一个二进制日志文件执行相同的事件，因此更改事件源不应影响数据库的结构或完整性，前提是在进行更改时要小心。

副本应在启用二进制日志记录的情况下运行（[`--木箱`](replication-options-binary-log.html#option_mysqld_log-bin)选项），这是默认设置。如果您没有使用GTID进行复制，那么复制副本也应该使用[`--日志从属更新=关闭`](replication-options-binary-log.html#sysvar_log_slave_updates)（默认情况下记录副本更新）。这样，复制副本就可以成为源，而无需重新启动复制副本[**mysqld**](mysqld.html).假设您的结构如所示[图17.4，“使用复制的冗余，初始结构”](replication-solutions-switch.html#figure_replication-redundancy-before).

[](<>)

**图17.4使用复制的冗余，初始结构**

<img alt="Two web clients direct both database reads and database writes to a single MySQL source server. The MySQL source server replicates to MySQL Replica 1, MySQL Replica 2, and MySQL Replica 3." src="images/redundancy-before.png" height="408" width="374" />

在这个图中`MySQL源代码`保存源数据库`MySQL副本`主机是副本`网络客户端`计算机正在执行数据库读写操作。不会显示仅发出读取（通常会连接到副本）的Web客户端，因为它们不需要在出现故障时切换到新服务器。有关读/写扩展复制结构的更详细示例，请参阅[第17.4.5节，“使用复制进行扩展”](replication-solutions-scaleout.html).

每个MySQL副本(`复制品1`,`副本2`和`复制品3`)副本是否在启用二进制日志记录的情况下运行，并且[`--日志从属更新=关闭`](replication-options-binary-log.html#sysvar_log_slave_updates)。因为复制副本从源接收的更新在[`--日志从属更新=关闭`](replication-options-binary-log.html#sysvar_log_slave_updates)则每个复制副本上的二进制日志最初为空。如果出于某种原因`MySQL源代码`如果不可用，则可以选择其中一个副本作为新源。例如，如果你选择`复制品1`全部的`网络客户端`应该重定向到`复制品1`，将更新写入其二进制日志。`副本2`和`复制品3`然后从`复制品1`.

使用运行复制副本的原因[`--日志从属更新=关闭`](replication-options-binary-log.html#sysvar_log_slave_updates)是为了防止副本接收两次更新，以防您导致其中一个副本成为新的源。如果`复制品1`有[`--日志从属更新`](replication-options-binary-log.html#sysvar_log_slave_updates)启用，这是默认设置，它会写入从中接收到的任何更新`来源`在它自己的二进制日志中。这意味着`副本2`改变`来源`到`复制品1`作为其来源，它可能会从`复制品1`它已经从`来源`.

确保所有副本都已处理其中继日志中的任何语句。在每个副本上，发布[`停止复制IO_线程`](stop-replica.html)，然后检查[`显示进程列表`](show-processlist.html)直到你看到`已读取所有中继日志`。如果所有副本都是这样，则可以将其重新配置为新设置。在复制品上`复制品1`被提升为源头、问题[`停止复制`](stop-replica.html)和[`重置主机`](reset-master.html).

在其他复制品上`副本2`和`复制品3`使用[`停止复制`](stop-replica.html)和`将复制源更改为源_HOST='Replica1'`或`将MASTER更改为MASTER_HOST='Replica1'`（在哪里`“复制1”`表示的真实主机名`复制品1`).使用[`将复制源更改为`](change-replication-source-to.html) \| `将主机更改为`，添加有关如何连接到的所有信息`复制品1`从…起`副本2`或`复制品3` (*`使用者`*, *`暗语`*, *`港口城市`*).在这种情况下发出语句时，不需要指定`复制品1`要读取的二进制日志文件或日志位置，因为第一个二进制日志文件和位置4是默认值。最后，执行[`开始复制`](start-replica.html)在…上`副本2`和`复制品3`.

新的复制设置就位后，您需要告知每个`网络客户端`将其声明指向`复制品1`.从那时起，所有由`网络客户端`到`复制品1`被写入的二进制日志中`复制品1`，其中包含发送到的每个update语句`复制品1`自从`来源`停止。

生成的服务器结构如所示[图17.5，“源故障后使用复制的冗余”](replication-solutions-switch.html#figure_replication-redundancy-after).

[](<>)

**图17.5源故障后使用复制的冗余**

<img alt="The MySQL source server has failed, and is no longer connected into the replication topology. The two web clients now direct both database reads and database writes to MySQL Replica 1, which is the new source. MySQL Replica 1 replicates to MySQL Replica 2 and MySQL Replica 3." src="images/redundancy-after.png" height="408" width="429" />

什么时候`来源`再次可用时，应将其作为`复制品1`.要做到这一点，请发布`来源`相同的[`将复制源更改为`](change-replication-source-to.html) \| [`将主机更改为`](change-master-to.html)声明如下：`副本2`和`复制品3`先前`来源`然后变成了`复制品1`然后拿起`网络客户端`写下它离线时错过了。

使`来源`再次输入源代码时，请使用前面的步骤`复制品1`不可用且`来源`将成为新的来源。在此过程中，不要忘记运行[`重置主机`](reset-master.html)在…上`复制品1`在做出决定之前`复制品1`, `副本2`和`复制品3`复制品`来源`。如果您未能做到这一点，副本可能会从`网络客户端`申请日期为`来源`无法使用。

您应该知道，复制副本之间没有同步，即使它们共享同一个源，因此有些复制副本可能远远领先于其他复制副本。这意味着在某些情况下，上一个示例中概述的过程可能无法按预期工作。然而，在实践中，所有副本上的中继日志应该相对靠近。

让应用程序了解源位置的一种方法是为源服务器提供动态DNS条目。具有`绑定`你可以用`更新`动态更新DNS。
