我的 MySQL 复制设置是通过互联网进行的。Master 在公共 IP 上。
如果我停止 master 中的 mysql 服务,slave 中会立即抛出一条错误消息。当我启动服务时,slave 立即连接到 master 并且复制进行得很好。
但是,如果从公共 IP 禁用该端口,则不会在从属日志中抛出任何错误并显示为连接成功,但数据不会从主控复制到从属。如果端口为公共 IP 启用,则显示为连接成功并且数据未从主服务器复制到从服务器。
在我重新启动从站之前,数据不会从主站复制到从站。一旦我重新启动奴隶,一切都会好起来的。
我能知道,没有被复制的原因是什么吗?
当这种行为发生时,有什么办法可以从奴隶那里知道主人的身份。
当主端口被禁用时,还有任何选项可以停止从站。
请帮我解决这个问题。
我正在使用 MySQL 5.0.24 版。
基本问题源于从站的 IO 线程。有时,它有装傻的坏习惯,没有正确地检查或 ping master。
MySQL 5.5 的半同步复制允许您让主服务器超时并降级回异步复制。运行半同步复制的从站现在应该有一个更敏感的 IO 线程。
关于您的具体情况,您使用的是 MySQL 5.0.24 ??? 那是一个很旧的版本。有两个错误报告(Bug1和Bug2)对此进行了讨论。
我才恍然大悟,你之前问过这个问题,而 DTest 回答了这个问题。在信用到期时给予信用,错误报告来自他的回答。
当从从访问中禁用公共 IP 时,很高兴收到通知。这样,您就可以
STOP SLAVE;
提前在奴隶上运行。当这种行为发生时,您还询问是否有一种方法可以从奴隶那里了解主人的状态。
这是一个典型的
SHOW SLAVE STATUS\G
请注意以下事项:
Master_Log_File
最后将其最新 SQL 复制到中继日志的日志位置Relay_Master_Log_File
从中继日志中最后执行 SQL 的日志位置如果这些值都没有移动,则可能意味着所有 SQL 都已处理,或者从服务器当前正在处理来自
Exec_Master_Log_Pos
Master Log位置的 SQL 线程中的 SQL 语句Relay_Master_Log_File
。现在,看看
Relay_Log_Space
。此数字表示所有中继日志的所有文件大小的总和。如果Slave_IO_Running
是并且Relay_Log_Space
没有改变,那么通过运行去检查 masterSHOW MASTER STATUS;
。它应该像这样:如果 Master 的 (File,Position)
SHOW MASTER STATUS;
超出了 Slave 的 (Master_Log_File,Read_Master_Log_Pos)SHOW SLAVE STATUS\G
,那么 Slave 上的 IO Thread 就意图和目的而言是死的,即使 Slave_IO_Running 是 Yes。