top
Loading...
6.3.復制實施細節
6.3. 復制實施細節
6.3.1. 復制主線程狀態
6.3.2. 復制從I/O線程狀態
6.3.3. 復制從SQL線程狀態
6.3.4. 復制傳遞和狀態文件

MySQL使用3個線程來執行復制功能(其中1個在主服務器上,另兩個在從服務器上。當發出START SLAVE時,從服務器創建一個I/O線程,以連接主服務器并讓它發送記錄在其二進制日志中的語句。主服務器創建一個線程將二進制日志中的內容發送到從服務器。該線程可以識別為主服務器上SHOW PROCESSLIST的輸出中的Binlog Dump線程。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容并將該數據拷貝到從服務器數據目錄中的本地文件中,即中繼日志。第3個線程是SQL線程,是從服務器創建用于讀取中繼日志并執行日志中包含的更新。

在前面的描述中,每個從服務器有3個線程。有多個從服務器的主服務器創建為每個當前連接的從服務器創建一個線程;每個從服務器有自己的I/OSQL線程。

這樣讀取和執行語句被分成兩個獨立的任務。如果語句執行較慢則語句讀取任務沒有慢下來。例如,如果從服務器有一段時間沒有運行了,當從服務器啟動時,其I/O線程可以很快地從主服務器索取所有二進制日志內容,即使SQL線程遠遠滯后。如果從服務器在SQL線程執行完所有索取的語句前停止,I/O 線程至少已經索取了所有內容,以便語句的安全拷貝保存到本地從服務器的中繼日志中,供從服務器下次啟動時執行。這樣允許清空主服務器上的二進制日志,因為不再需要等候從服務器來索取其內容。

SHOW PROCESSLIST語句可以提供在主服務器上和從服務器上發生的關于復制的信息。

下面的例子說明了這3個線程在SHOW PROCESSLIST中的顯示。

在主服務器上,SHOW PROCESSLIST的輸出看上去應為:

mysql> SHOW PROCESSLISTG
*************************** 1. row ***************************
     Id: 2
   User: root
   Host: localhost:32931
     db: NULL
Command: Binlog Dump
   Time: 94
  State: Has sent all binlog to slave; waiting for binlog to
         be updated
   Info: NULL

這兒,線程2是一個連接從服務器的復制線程。該信息表示所有主要更新已經被發送到從服務器,主服務器正等待更多的更新出現。

在從服務器上,SHOW PROCESSLIST的輸出看上去應為:

mysql> SHOW PROCESSLISTG
*************************** 1. row ***************************
     Id: 10
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 11
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 11
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 11
  State: Has read all relay log; waiting for the slave I/O
         thread to update it
   Info: NULL

該信息表示線程10是同主服務器通信的I/O線程,線程11是處理保存在中繼日志中的更新的SQL線程。SHOW PROCESSLIST運行時,兩個線程均空閑,等待其它更新。

請注意Time列的值可以顯示從服務器比主服務器滯后多長時間。參見6.9節,“復制FAQ”。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/replication.html
北斗有巢氏 有巢氏北斗