MySQL同步功能由3個線程(master上1個,slave上2個)來實現。執行 DE>START SLAVEDE> 語句後,slave就建立一個I/O線程。I/O線程鏈接到master上,並請求master發送二進制日誌中的語句。master建立一個線程來把日誌的內容發送到slave上。這個線程在master上執行 DE>SHOW PROCESSLISTDE> 語句後的結果中的 DE>Binlog DumpDE> 線程即是。slave上的I/O線程讀取master的 DE>Binlog DumpDE> 線程發送的語句,而且把它們拷貝到其數據目錄下的中繼日誌(relay logs)中。第三個是SQL線程,salve用它來讀取中繼日誌,而後執行它們來更新數據。mysql
如上所述,每一個master/slave上都有3個線程。每一個master上有多個線程,它爲每一個slave鏈接都建立一個線程,每一個slave只有I/O和SQL線程。sql
show slave master 用於提供有關從屬服務器線程的關鍵參數的信息數據庫
MySQL> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.2.40
Master_User: photorepl
Master_Port: 4331
Connect_Retry: 60
Master_Log_File: mysql-bin.005502
Read_Master_Log_Pos: 64401238
Relay_Log_File: mysqld-relay-bin.015418
Relay_Log_Pos: 13456757
Relay_Master_Log_File: mysql-bin.005152
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table: photo.%
Replicate_Wild_Ignore_Table: mysql.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 13456620
Relay_Log_Space: 36764898503
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: 249904
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××服務器
SHOW SLAVE STATUS會返回如下字段:網絡
Slave_IO_State.net
SHOW PROCESSLIST輸出的State字段的拷貝。SHOW PROCESSLIST用於從屬I/O線程。若是線程正在試圖鏈接到主服務器,正在等待來自主服務器的時間或正在鏈接到主服務器等,本語句會通知您線程
Master_User日誌
被用於鏈接主服務器的當前用戶。接口
Master_Port事件
當前的主服務器接口。
Connect_Retry
--master-connect-retry選項的當前值
Master_Log_File
I/O線程當前正在讀取的主服務器二進制日誌文件的名稱。
Read_Master_Log_Pos
在當前的主服務器二進制日誌中,I/O線程已經讀取的位置。
Relay_Log_File
SQL線程當前正在讀取和執行的中繼日誌文件的名稱。
Relay_Log_Pos
在當前的中繼日誌中,SQL線程已讀取和執行的位置。
Relay_Master_Log_File
由SQL線程執行的包含多數近期事件的主服務器二進制日誌文件的名稱。
Slave_IO_Running
I/O線程是否被啓動併成功地鏈接到主服務器上。
Slave_SQL_Running
SQL線程是否被啓動。
Replicate_Do_DB,Replicate_Ignore_DB
使用--replicate-do-db和--replicate-ignore-db選項指定的數據庫清單。
Replicate_Do_Table,Replicate_Ignore_Table,Replicate_Wild_Do_Table,Replicate_Wild_Ignore_Table
使用--replicate-do-table,--replicate-ignore-table,--replicate-wild-do-table和--replicate-wild-ignore_table選項指定的表清單。
Last_Errno,Last_Error
被多數最近被執行的查詢返回的錯誤數量和錯誤消息。錯誤數量爲0而且消息爲空字符串意味着「沒有錯誤」。若是Last_Error值不是空值,它也會在從屬服務器的錯誤日誌中做爲消息顯示。
舉例說明:
Last_Errno: 1051
Last_Error: error 'Unknown table 'z'' on query 'drop table z'
該消息指示,表z曾經存在於在主服務器中並已被取消了,可是它沒有在從屬服務器中存在過,所以對於從屬服務器,DROP TABLE失敗。(舉例說明,在設置複製時,若是您忘記了把此表拷貝到從屬服務器中,則這有可能發生。)
Skip_Counter
最近被使用的用於SQL_SLAVE_SKIP_COUNTER的值。
Exec_Master_Log_Pos
來自主服務器的二進制日誌的由SQL線程執行的上一個時間的位置(Relay_Master_Log_File)。在主服務器的二進制日誌中的(Relay_Master_Log_File,Exec_Master_Log_Pos)對應於在中繼日誌中的(Relay_Log_File,Relay_Log_Pos)。
Relay_Log_Space
全部原有的中繼日誌結合起來的總大小。
Until_Condition,Until_Log_File,Until_Log_Pos
在START SLAVE語句的UNTIL子句中指定的值。
Until_Condition具備如下值:
若是沒有指定UNTIL子句,則沒有值
若是從屬服務器正在讀取,直到達到主服務器的二進制日誌的給定位置爲止,則值爲Master
若是從屬服務器正在讀取,直到達到其中繼日誌的給定位置爲止,則值爲Relay
Until_Log_File和Until_Log_Pos用於指示日誌文件名和位置值。日誌文件名和位置值定義了SQL線程在哪一個點停止執行。
Master_SSL_Allowed,Master_SSL_CA_File,Master_SSL_CA_Path,Master_SSL_Cert,Master_SSL_Cipher,Master_SSL_Key
這些字段顯示了被從屬服務器使用的參數。這些參數用於鏈接主服務器。
Master_SSL_Allowed具備如下值:
若是容許對主服務器進行SSL鏈接,則值爲Yes
若是不容許對主服務器進行SSL鏈接,則值爲No
若是容許SSL鏈接,可是從屬服務器沒有讓SSL支持被啓用,則值爲Ignored。
與SSL有關的字段的值對應於--master-ca,--master-capath,--master-cert,--master-cipher和--master-key選項的值。
Seconds_Behind_Master
本字段是從屬服務器「落後」多少的一個指示。當從屬SQL線程正在運行時(處理更新),本字段爲在主服務器上由此線程執行的最近的一個事件的時間標記開始,已通過的秒數。當此線程被從屬服務器I/O線程遇上,並進入閒置狀態,等待來自I/O線程的更多的事件時,本字段爲零。總之,本字段測量從屬服務器SQL線程和從屬服務器I/O線程之間的時間差距,單位以秒計。
若是主服務器和從屬服務器之間的網絡鏈接較快,則從屬服務器I/O線程會很是接近主服務器,因此本字段可以十分近似地指示,從屬服務器SQL線程比主服務器落後多少。若是網絡較慢,則這種指示不許確;從屬SQL線程常常會遇上讀取速度較慢地從屬服務器I/O線程,所以,Seconds_Behind_Master常常顯示值爲0。即便I/O線程落後於主服務器時,也是如此。換句話說,本列只對速度快的網絡有用。
即便主服務器和從屬服務器不具備相同的時鐘,時間差計算也會起做用(當從屬服務器I/O線程啓動時,計算時間差。並假定今後時之後,時間差保持不變)。若是從屬SQL線程不運行,或者若是從屬服務器I/O線程不運行或未與主服務器鏈接,則Seconds_Behind_Master爲NULL(意義爲「未知」)。舉例說明,若是在從新鏈接以前,從屬服務器I/O線程休眠了master-connect-retry秒,則顯示NULL,由於從屬服務器不知道主服務器正在作什麼,也不能有把握地說落後多少。