### 17.5.4 复制故障排除

[](<>)

如果您已按照说明进行操作，但您的复制设置不起作用，那么首先要做的是*检查错误日志中的消息*.许多用户在遇到问题后没有及时执行此操作而浪费了时间。

如果您无法从错误日志中看出问题所在，请尝试以下技术：

-   通过发出[`显示主状态`](show-master-status.html)陈述。默认情况下启用二进制日志记录。如果启用了二进制日志记录，`位置`是非零的。如果未启用二进制日志记录，请验证您没有使用任何禁用二进制日志记录的设置运行源，例如[`--skip-log-bin`](replication-options-binary-log.html#option_mysqld_log-bin)选项。

-   验证[`server_id`](replication-options.html#sysvar_server_id)系统变量在源和副本上都在启动时设置，并且 ID 值在每台服务器上都是唯一的。

-   验证副本是否正在运行。采用[`显示副本状态`](show-replica-status.html)检查是否`Replica_IO_Running`和`Replica_SQL_Running`价值观都是`是的`.如果不是，请验证启动副本服务器时使用的选项。例如，[`--skip-slave-启动`](replication-options-replica.html#option_mysqld_skip-slave-start)命令行选项，或者从 MySQL 8.0.24 开始，[`skip_slave_start`](replication-options-replica.html#sysvar_skip_slave_start)系统变量，防止复制线程启动，直到您发出[`开始复制`](start-replica.html)陈述。

-   如果副本正在运行，请检查它是否与源建立了连接。采用[`显示进程列表`](show-processlist.html), 找到 I/O (receiver) 和 SQL (applier) 线程并检查它们`状态`列以查看它们显示的内容。看[第 17.2.3 节，“复制线程”](replication-implementation-details.html).如果接收者线程状态说`连接到主控`，请检查以下内容：

    -   验证源上复制用户的权限。

    -   检查源的主机名是否正确，并且您使用正确的端口连接到源。用于复制的端口与用于客户端网络通信的端口相同（默认为`3306`）。对于主机名，确保名称解析为正确的 IP 地址。

    -   检查配置文件是否[`跳过网络`](server-system-variables.html#sysvar_skip_networking)已在源或副本上启用系统变量以禁用网络。如果是这样，请评论该设置或将其删除。

    -   如果源具有防火墙或 IP 过滤配置，请确保用于 MySQL 的网络端口未被过滤。

    -   检查您是否可以使用`平`要么`跟踪路由`/`示踪剂`到达主机。

-   如果副本之前正在运行但已停止，原因通常是在源上成功的某些语句在副本上失败。如果您对源进行了适当的快照，并且从未在复制线程之外修改副本上的数据，则永远不会发生这种情况。如果副本意外停止，则说明这是一个错误，或者您遇到了中所述的已知复制限制之一[第 17.5.1 节，“复制功能和问题”](replication-features.html).如果它是一个错误，请参阅[第 17.5.5 节，“如何报告复制错误或问题”](replication-bugs.html)，有关如何报告的说明。

-   如果在源上成功的语句拒绝在副本上运行，如果通过删除副本的数据库并从源复制新快照来执行完整的数据库重新同步不可行，请尝试以下过程：

    1.  确定副本上受影响的表是否与源表不同。尝试了解这是如何发生的。然后使副本的表与源表相同并运行[`开始复制`](start-replica.html).

    2.  如果前面的步骤不起作用或不适用，请尝试了解手动进行更新（如果需要）是否安全，然后忽略源中的下一条语句。

    3.  如果您决定副本可以跳过源中的下一条语句，请发出以下语句：

        ```
        mysql> SET GLOBAL sql_slave_skip_counter = N;
        mysql> START SLAVE;

        Or from MySQL 8.0.26:
        mysql> SET GLOBAL sql_replica_skip_counter = N;
        mysql> START REPLICA;
        ```

        的价值*`ñ`*如果源中的下一条语句不使用，则应为 1`自动递增`要么[`LAST_INSERT_ID()`](information-functions.html#function_last-insert-id).否则，该值应为 2。为使用 2 的语句使用值的原因自动递增`要么`LAST_INSERT_ID()[`是它们在源的二进制日志中记录了两个事件。`](information-functions.html#function_last-insert-id)也可以看看

        设置全局 sql[\_奴隶\_跳过\_反声明.](https://dev.mysql.com/doc/refman/5.6/en/set-global-sql-slave-skip-counter.html)如果您确定副本开始时与源完全同步，并且没有人更新复制线程之外涉及的表，那么可能差异是错误的结果。

    4.  如果您正在运行最新版本的 MySQL，请报告问题。如果您运行的是旧版本，请尝试升级到最新的生产版本以确定问题是否仍然存在。
