MySQL中的seconds_behind_master的理解
通过show slave status查看到的Seconds_Behind_Master,从字面上来看,他是slave落后master的秒数,一般情况下,也确实这样,我们可以通过Seconds_Behind_Master数字查看slave是否落后于master,但是在一些环境中,他确会让我们产生幻觉。
在http://dev.mysql.com/doc/refman/5.5/en/show-slave-status.html中,对Seconds_Behind_Master的有一句话阐述如下:
In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O thread.
很清晰的表明,该值是SQL thread I/O thread.之间的差值。
当在很快的网络连接情况下,I/O thread. 能很快的从master的binlog中同步sql到slave的relay-log里,这样,这个值就能基本确定的slave落后master的秒数
当网络环境特别糟糕的情况下,这个值确会让我们产生幻觉,I/O thread同步很慢,每次同步过来,SQL thread就能立即执行,这样,我们看到的Seconds_Behind_Master是0,而真正的,slave已经落后master很多很多。这时业务部门的同志们就会抱怨slave与master数据不对,而你看到的Seconds_Behind_Master确为0,你就会非常的郁闷了。
其实这个时候,我们看下master,与slave就能很好的确定这期间的原因。
mysql> show master statusG
*************************** 1. row ***************************
File: ******-bin.001291
Position: 896711460
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
mysql> show slave statusG
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.69.6.163
Master_User: replica
Master_Port: 3801
Connect_Retry: 60
Master_Log_File: *****-bin.001211
Read_Master_Log_Pos: 278633662
Relay_Log_File: *****-relay-bin.002323
Relay_Log_Pos: 161735853
Relay_Master_Log_File: *******-bin.001211
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 278633662
Relay_Log_Space: 161735853
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
很明显,slave已经落后master 好多了。
暂停复制
你可以在从机上用STOP SLAVE语句来停止复制,用START SLAVE来开始复制。 用STOP SLAVE来停止从机执行二进制日志:
slave> STOP SLAVE;
当停止执行时,从机不再通过IO线程从主机读取二进制日志并且不再通过SQL线程处理中继日志中还没执行的事件。你可以指定线程的类型来独立地停止IO或者SQL线程。
例如: slave> STOP SLAVE IO_THREAD;
如果你想在从机上执行备份或者其他任务,仅仅只处理来自主机的事件,停止SQL线程会是有效的。
IO线程会继续从主机读取变化,但这些变化不会马上被应用,这样当你再次开始从机操作的时候从机就能轻易地赶上进度。 停止IO线程会让中继日志里的语句执行到中继日志停止接收新事件的那个点为止。
当你想要让从机赶上从主机来的事件时,当你想在从机上做管理但要确保你已经在指定的点有最新的更新时,可用停止IO线程的选项。这种方法同样也能用来停止从机上的事件执行,同时你在主机上做管理确保复制再次启动的时候不会有大量积压的事件要执行。
要再次开始执行复制,用START SLAVE语句:
slave> START SLAVE;
如果必要,你可以分别独立启动IO线程和SQL线程。