MySQL 8.0 在 Docker 中主从配置过程经常会出现一些意想不到的问题,现将这些问题简单进行收集,并逐一罗列。
1. 主从节点的 server_id 配置重复
问题描述:主从节点的 server_id 必须唯一,否则会导致复制失败。
举例说明:如果主节点和从节点都配置了 server_id=1,从节点会报错无法连接到主节点。需要确保主节点和从节点的 server_id 不同,例如主节点为 101,从节点为 102。
2. 二进制日志(binlog)未开启
问题描述:主节点必须开启二进制日志,否则从节点无法获取变更信息。
举例说明:如果主节点的配置文件中没有 log_bin=mysql-bin,从节点在执行 CHANGE MASTER TO 命令时会报错,提示无法找到二进制日志文件。
3. 复制用户权限不足
问题描述:从节点需要一个具有 REPLICATION SLAVE 权限的用户来连接主节点。
举例说明:如果在主节点上创建的复制用户没有足够的权限,从节点会报错无法连接。需要确保执行了类似以下命令:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
4. 主节点的二进制日志文件名和位置错误
问题描述:从节点需要正确的二进制日志文件名和位置来开始复制。
举例说明:如果从节点的 CHANGE MASTER TO 命令中使用的 MASTER_LOG_FILE 和 MASTER_LOG_POS 不正确,复制将无法正常启动。需要在主节点上执行 SHOW MASTER STATUS; 并记录正确的值。
5. 网络连接问题
问题描述:从节点无法连接到主节点,可能是由于网络配置错误。
举例说明:如果主节点和从节点不在同一个 Docker 网络中,或者主节点的 IP 地址配置错误,从节点会报错无法连接。确保主节点和从节点可以互相通信,例如使用 --network 参数将它们加入同一个 Docker 网络。
6. 主从节点的时区不一致
问题描述:主从节点的时区设置不一致可能导致时间相关的数据不一致。
举例说明:如果主节点的时区是 UTC,而从节点的时区是 Asia/Shanghai,可能会导致时间戳字段的数据不一致。需要在启动容器时通过环境变量设置一致的时区,例如 -e TZ="Asia/Shanghai"。
7. 主节点的 binlog_format 设置不正确
问题描述:主节点的二进制日志格式(binlog_format)会影响复制的性能和兼容性。
举例说明:如果主节点的 binlog_format 设置为 ROW,而从节点需要 STATEMENT 格式,可能会导致复制异常。建议使用 MIXED 格式以兼顾性能和兼容性。
8. 从节点的 read_only 设置问题
问题描述:从节点通常设置为只读模式,以防止数据被意外修改。
举例说明:如果从节点没有设置 read_only=1,可能会导致数据被意外修改,影响数据一致性。需要在从节点的配置文件中添加该设置。
9. 主从节点的字符集不一致
问题描述:主从节点的字符集设置不一致可能导致数据乱码。
举例说明:如果主节点的字符集是 utf8mb4,而从节点的字符集是 utf8,可能会导致插入包含特殊字符的数据时出现乱码。需要确保主从节点的字符集设置一致。
10. 从节点的复制延迟
问题描述:从节点的复制可能滞后于主节点,导致数据不一致。
举例说明:如果主节点的负载很高,或者网络延迟较大,从节点可能会出现复制延迟。可以通过执行 SHOW SLAVE STATUS\G; 查看 Seconds_Behind_Master 的值来监控延迟情况。如果延迟较大,需要优化网络或主节点的性能。
以上问题在实际配置过程中较为常见,需要仔细检查配置文件和执行的命令,确保每一步都正确无误。如果存在疏漏,欢迎各位看官随时拍砖。