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 status 用於提供有關從屬服務器線程的關鍵參數的信息數據庫
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_Statespa
SHOW PROCESSLIST輸出的State字段的拷貝。SHOW PROCESSLIST用於從屬I/O線程。若是線程正在試圖鏈接到主服務器,正在等待來自主服務器的時間或正在鏈接到主服務器等,本語句會通知您線程
Master_User日誌
被用於鏈接主服務器的當前用戶。server
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,由於從屬服務 器不知道主服務器正在作什麼,也不能有把握地說落後多少。
2、正常狀態的信息 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.1.1.1 Master_User: rep_user Master_Port: 3306 Connect_Retry: 10 Master_Log_File: binlog.000026 Read_Master_Log_Pos: 446 Relay_Log_File: relay.000008 Relay_Log_Pos: 589 Relay_Master_Log_File: binlog.000026 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: 446 Relay_Log_Space: 878 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 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2211 1 row in set (0.00 sec) 狀態解釋: 1.Slave_IO_State: Waiting for master to send event 這裏顯示了當前slave I/O線程的狀態。狀態信息和使用show processlist顯示的內容同樣。 slave I/O線程的狀態,有如下幾種: 1) waiting for master update 這是connecting to master狀態以前的狀態 2) connecting to master I/O線程正嘗試鏈接到master 3) checking master version 在與master創建鏈接後,會出現該狀態。該狀態出現的時間很是短暫。 4) registering slave on master 在與master創建鏈接後,會出現該狀態。該狀態出現的時間很是短暫。 5) requesting binlog dump 在與master創建鏈接後,會出現該狀態。該狀態出現的時間很是短暫。在這個狀態下,I/O線程向master發送請求,請求binlog,位置從指定的binglog 名字和binglog的position位置開始。 6) waiting to reconnect after a failed binlog dump request 若是由於鏈接斷開,致使binglog的請求失敗,I/O線程會進入睡眠狀態。而後按期嘗試重連。嘗試重連的時間間隔,可使用命令"change master to master_connect_trt=X;"改變。 7) reconnecting after a failed binglog dump request I/O進程正在嘗試鏈接master 8) waiting for master to send event 說明,已經成功鏈接到master,正等待二進制日誌時間的到達。若是master 空閒,這個狀態會持續很長時間。若是等待的時間超過了slave_net_timeout(單位是秒)的值,會出現鏈接超時。在這種狀態下,I/O線程會 人爲鏈接失敗,並開始嘗試重連 9) queueing master event to the relay log 此時,I/O線程已經讀取了一個event,並複製到了relay log 中。這樣SQL 線程能夠執行此event 10) waiting to reconnect after a failed master event read 讀取時出現的錯誤(由於鏈接斷開)。在嘗試重連以前,I/O線程進入sleep狀態,sleep的時間是master_connect_try的值(默認是60秒) 11) reconnecting after a failed master event read I/O線程正嘗試重連master。若是鏈接創建,狀態會變成"waiting for master to send event" 12) waiting for the slave sql thread to free enough relay log space 這是由於設置了relay_log_space_limit,而且relay log的大小已經整張到了最大值。I/O線程正在等待SQL線程經過刪除一些relay log,來釋放relay log的空間。 13) waiting for slave mutex on exit I/O線程中止時會出現的狀態,出現的時間很是短。 2. Master_Host: 10.1.8.62 Master_User: rep_user Master_Port: 3306 這3條信息,顯示了slave鏈接master時,使用的master的主機---master_host、鏈接master用的用戶---master_user、鏈接master的端口---master_port。 3. Connect_Retry: 10 鏈接中斷後,從新嘗試鏈接的時間間隔。默認值是60秒。 4. Master_Log_File: binlog.000026 Read_Master_Log_Pos: 446 這兩條信息,顯示了與master相關的日誌的信息。master_log_file:當前I/O線程正在讀取的master 二進制日誌的文件名;read_master_log_pos:當前I/O線程正在讀取的二進制日誌的位置 5. Relay_Log_File: relay.000008 Relay_Log_Pos: 589 Relay_Master_Log_File: binlog.000026 這3條信息,顯示了與relay log相關的信息。relay_log_file:當前SQL線程正在讀取並執行的relay log的文件名;relay_log_pos:當前SQL線程正在讀取並執行的relay log文件的位置;relay_master_log_file:master 二進制日誌的文件名。該文件包含當前SQL執行的事物 6. Slave_IO_Running: Yes Slave_SQL_Running: Yes 顯示了當前I/O線程和SQL線程的狀態 7. Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: 這部分顯示的是關於複製DB和table的信息。 8. Last_Errno: 0 Last_Error: laster_errno和laster_error是 Last_SQL_Errno和Last_SQL_Error的同義詞。 9. Skip_Counter: 0 系統參數sql_slave_skip_counter的值。sql_slave_skip_counter:slave應該跳過的事件數 10. Exec_Master_Log_Pos: 446 sql線程當前執行的事件,在master 二進制日誌中的position 11. Relay_Log_Space: 878 全部存在relay log的大小 12. Seconds_Behind_Master: 0 這個值是時間戳的差值。是slave當前的時間戳和master記錄該事件時的時間戳的差值 13. Replicate_Ignore_Server_Ids: slave當前會跳過的事件號 14. Master_Server_Id: 2211 master的server-id;若是master和slave的server-id相同,在啓動slave時,會報錯