如何才能配置MySQL同步伺服器?

MySQL同步機制基於master把所有對資料庫的更新、刪除 等)都記錄在二進位制日誌裡。因此,想要啟用同步機制,在master就必須啟用二進位制日誌。每個slave接受來自master上在二進位制日誌中記錄的更新操作,因此在slave上執行了這個操作的一個拷貝。應該非常重要地意識到,二進位制日誌只是從啟用二進位制日誌開始的時刻才記錄更新操作的。所有的slave必須在啟用二進位制日誌時把master上已經存在的資料拷貝過來。如果運行同步時slave上的資料和master上啟用二進位制日誌時的資料不一致的話,那麼slave同步就會失敗。把master上的資料拷貝過來的方法之一實在slave上執行 LOAD DATA FROM MASTER 語句。不過要注意,LOAD DATA FROM MASTER 是從MySQL 4.0.0之後才開始可以用的,而且只支援master上的 MyISAM 型別表。同樣地,這個操作需要一個全域性的讀鎖,這樣的話傳送日誌到slave的時候在master上就不會有更新操作了。當實現了自由鎖表熱備份時(在MySQL 5.0中),全域性讀鎖就沒必要了。由於有這些限制,因此我們建議只在master上相關資料比較小的時候才執行 LOAD DATA FROM MASTER 語句,或者在master上允許一個長時間的讀鎖。由於每個系統之間 LOAD DATA FROM MASTER 的速度各不一樣,一個比較好的衡量規則是每秒能拷貝1MB資料。這只是的粗略的估計,不過master和slave都是奔騰700MHz的機器且用100MBit/s網路連線時就能達到這個速度了。slave上已經完整拷貝master資料後,就可以連線到master上然後等待處理更新了。如果master當機或者slave連線斷開,slave會定期嘗試連線到master上直到能重連並且等待更新。重試的時間間隔由 --master-connect-retry 選項來控制,它的預設值是60秒。每個slave都記錄了它關閉時的日誌位置。msater是不知道有多少個slave連線上來或者哪個slave從什麼時候開始更新。

MySQL同步功能由3個執行緒(master上1個,slave上2個)來實現。執行 START SLAVE 語句後,slave就建立一個I/O執行緒。I/O執行緒連線到master上,並請求master傳送二進位制日誌中的語句。master建立一個執行緒來把日誌的內容傳送到slave上。這個執行緒在master上執行 SHOW PROCESSLIST 語句後的結果中的 Binlog Dump 執行緒便是。slave上的I/O執行緒讀取master的 Binlog Dump 執行緒傳送的語句,並且把它們拷貝到其資料目錄下的中繼日誌(relay logs)中。第三個是SQL執行緒,salve用它來讀取中繼日誌,然後執行它們來更新資料。如上所述,每個mster/slave上都有3個執行緒。每個master上有多個執行緒,它為每個slave連線都建立一個執行緒,每個slave只有I/O和SQL執行緒。在MySQL 4.0.2以前,同步只需2個執行緒(master和slave各一個)。slave上的I/O和SQL執行緒合併成一個了,它不使用中繼日誌。slave上使用2個執行緒的優點是,把讀日誌和執行分開成2個獨立的任務。執行任務如果慢的話,讀日誌任務不會跟著慢下來。例如,如果slave停止了一段時間,那麼I/O執行緒可以在slave啟動後很快地從master上讀取全部日誌,儘管SQL執行緒可能落後I/O執行緒好幾的小時。如果slave在SQL執行緒沒全部執行完就停止了,但I/O執行緒卻已經把所有的更新日誌都讀取並且儲存在本地的中繼日誌中了,因此在slave再次啟動後就會繼續執行它們了。這就允許在master上清除二進位制日誌,因為slave已經無需去master讀取更新日誌了。執行 SHOW PROCESSLIST 語句就會告訴我們所關心的master和slave上發生的情況。

下面我們來具體配置

1. 在主伺服器上為從伺服器建立一個使用者:

grant replication slave on *.* to '使用者名稱'@'主機' identified by '密碼'; (在MySQL 4.0.2以前,用 FILE 許可權來代替 REPLICATION SLAVE)

如果打算在slave上執行 LOAD TABLE FROM MASTER 或 LOAD DATA FROM MASTER 語句,那麼必須給該帳戶授予附加許可權:

授予全域性 SUPER 和 RELOAD 許可權。

授予對想要載入的所有表上的 SELECT 許可權。在master上任何沒有 SELECT 許可權的表都會被 LOAD DATA FROM MASTER 略過。

2. 編輯主伺服器的配置檔案:/etc/my.cnf

server-id = 1

log-bin

binlog-do-db=需要備份的資料庫名,如果備份多個數據庫,重複設定這個選項即可

binlog-ignore-db=不需要備份的資料庫苦命,如果備份多個數據庫,重複設定這個選項即可

3. 編輯從伺服器的配置檔案:/etc/my.cnf

server-id=2 (配置多個從伺服器時依次設定id號)

master-host=主機

master-user=使用者名稱

master-password=密碼

master-port=埠

replicate-do-db=需要備份的資料庫名,如果備份多個數據庫,重複設定這個選項即可

記得先手動同步一下主從伺服器中要備份的資料庫,然後重啟主,從伺服器。

要驗證主從設定是否已經成功,可以登入從伺服器輸入如下命令:

mysql> show slave statusG

得到的列表會有類似下面的資料:

Slave_IO_State: Waiting for master to send event

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果後面兩個選項不全是Yes,那就說明你前面某個步驟配置錯了。

如果你的設定是正確的,嘗試在主伺服器上插入若干條記錄,然後你再轉到從伺服器,會發現相應的新記錄已經自動同步過來了。

如果你的主從伺服器已經配置好了,那麼你在應用程式中,只要保證所有的insert/delete/update操作是在主伺服器上進行的,那麼相應的資料變化會自動同步到從伺服器上,這樣,我們就可以把select操作分擔到多臺從資料庫上,從而降低伺服器的載荷。

如果你想使用複製資料檔案的方式來備份資料庫,只要在從伺服器上的mysql命令列先鍵入slave stop;然後複製資料庫檔案,複製好了,再在mysql命令列鍵入slave start;啟動從伺服器,這樣就即備份了資料有保證了資料完整性,而且整個過程中主伺服器的mysql無需停止。

-----------------------------------------------------------------------------------

提示:如果修改了主伺服器的配置,記得刪除從伺服器上的master.info檔案。否則從伺服器使用的還是老配置,可能會導致錯誤。

-----------------------------------------------------------------------------------

注意:關於要複製多個數據庫時,binlog-do-db和replicate-do-db選項的設定,如果要備份多個數據庫,只要重複設定相應選項就可以了。

比如:

binlog-do-db=a

binlog-do-db=b

replicate-do-db=a

replicate-do-db=b

-----------------------------------------------------------------------------------

補充:

在從伺服器上使用show slave status

Slave_IO_Running,為No,則說明IO_THREAD沒有啟動,請執行slave start [IO_THREAD]

Slave_SQL_Running為No則複製出錯,檢視Last_error欄位排除錯誤後執行slave start [SQL_THREAD]

檢視Slave_IO_State欄位

空 //複製沒有啟動

Connecting to master//沒有連線上master

Waiting for master to send event//已經連上

補充:可以使用LOAD DATA FROM MASTER語句來建立slave。但有約束條件:

資料表要全部是MyISAM表,必須有SUPER許可權,master的複製使用者必須具備RELOAD和SUPER許可權。

在master端執行RESET MASTER清除已有的日誌變更,

此時slave端會因為找不到master日誌無法啟動IO_THREAD,請清空data目錄下

relay-log.info,hosname-relay-bin*等檔案重新啟動mysql

中繼日誌檔案預設的檔案為hostname-relay-bin.nnn和hostname-relay-bin.index。可用從伺服器的--

relay-log和--relay-log-index選項修改。在從伺服器中還有一個relay-log.info中繼資訊檔案,可用

--relay-log-info-file啟動選項修改檔名。

雙機互備則是兩個mysql同時配置為master及slave

主伺服器上的相關命令:

show master status

show slave hosts

show logs

show binlog events

purge logs to 'log_name'

purge logs before 'date'

reset master(老版本flush master)

set sql_log_bin=

從伺服器上的相關命令:

slave start

slave stop

SLAVE STOP IO_THREAD //此執行緒把master段的日誌寫到本地

SLAVE start IO_THREAD

SLAVE STOP SQL_THREAD //此執行緒把寫到本地的日誌應用於資料庫

SLAVE start SQL_THREAD

reset slave

SET GLOBAL SQL_SLAVE_SKIP_COUNTER

load data from master

show slave status(SUPER,REPLICATION CLIENT)

CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= //動態改變master資訊

PURGE MASTER [before 'date'] 刪除master端已同步過的日誌

相關問題答案