mysql主從複製配置

一.mysql主從備份(複製)的基本原理
mysql支持單向、異步複製,複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。mysql複製基於主服務器在二進制日誌中跟蹤所有對數據庫的更改(更新、刪除等等)。因此,要進行復制,必須在主服務器上啓用二進制日誌。每個從服務器從主服務器接收主服務器已經記錄到其二進制日誌的保存的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,並在本機上執行相同的更新。然後封鎖並等待主服務器通知新的更新。從服務器執行備份不會干擾主服務器,在備份過程中主服務器可以繼續處理更新。
  
二.mysql主從備份配置方法
在進行mysql主從備份時,最好確保主從服務器的版本兼容。從服務器至少與主服務器版本相同或更高。
  
主機(master)配置:
1.修改mysql配置文件my.cnf
在[mysqld]標籤下添加以下幾行
[plain] view plaincopy
  1. log-bin #開啓二進制日誌  
  2. server-id=id #主服務器id號  
  3. binlog-do-db=db_nameA #指定對db_nameA記錄二進制日誌  
  4. binlog-ignore-db=db_namB #指定不對db_namB記錄二進制日誌  
注意:
log-bin,server-id是配置文件中必須添加的內容。此時主服務器默認對所有數據庫進行備份。如果需要特殊指明只對某個數據庫進行備份或不備份,則可以加入binlog-do-db和binlog-ignore-db選項。有關(log-bin的詳細說明見附錄1)

在測試主機上,我們實際添加入如下內容:
[plain] view plaincopy
  1. log-bin  
  2. server-id=1  
  3. binlog-do-db=test  

2.爲從服務器添加mysql賬戶並配置權限
在主服務器上,必須爲從服務器創建一個用來連接主服務器的用戶,並設置replication slave權限。所用具體命令如下:
  1. grant replication slave  
  2. on *.*  
  3. to '帳號' @ '從服務器IP' identified by '密碼';  
在測試機上,我們實際執行:
  1. grant replication slave  
  2. on *.*  
  3. to 'replication'@'%' identified by 'sosotest';  
這時在mysql庫的user表中使用
  1. select * from user where user = 'replication' \G;  
可以看到Repl_slave_priv項對就的值爲Y。
3.導出主服務器數據
導出主服務器數據,以備之後將其導入從服務器,使主從服務器的初始狀態保持一致。

在測試機上,我們實際執行:
  1. mysqldump test > test.bak  

4.記錄File 及Position 項的值
  重啓mysql,使用show master status\G;查看主服務器狀態,記錄File 及Position 項的值,以便之後對從服務器進行配置。
  
在測試機上,我們實際執行時看到的結果如下:
*************************** 1. row ***************************
File: simba-bin.000008
Position: 79
Binlog_Do_DB: test
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

其中File爲imba-bin.000008;Position爲79。

至此主服務器配置完畢

從機(slave)配置:
1.修改mysql配置文件my.cnf
在[mysqld]標籤下添加以下面一行:
[plain] view plaincopy
  1. server-id=id #從機id  
實際中,我們添加:
[plain] view plaincopy
  1. server-id=2  

2.導入主機數據庫
在測試機上,我們實際執行:
mysql test < test.bak

3.重啓mysql數據庫並設置相關參數
  1. change master to  
  2. master_host = '10.1.146.133',  
  3. master_user = 'replication',  
  4. master_password = 'sosotest',  
  5. master_log_file = 'darkstar-bin.000008',  
  6. master_log_pos = 79;  
  7. slave start;  
4.檢查數據庫查看相關參數
  使用show slave status \G;查看相關參數是否正確。
  在實際執行時,我們在從機上看到的結果如下(只摘取了部分輸出):
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.146.133
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: darkstar-bin.000006
Read_Master_Log_Pos: 79
Relay_Log_File: simba-relay-bin.000003
Relay_Log_Pos: 171
Relay_Master_Log_File: darkstar-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……

對部分參數的解釋:
Slave_IO_State: Waiting for master to send event 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上參數說聽slave正常運行,正等待主服務器發來的消息。此時若用netstate命令可以看到從機與主機間已經建立了一條邊接。

特別需要注意的兩個參數是:
Master_Log_File和Read_Master_Log_Pos。Master_Log_File代表主機上用於主備同步的日誌文件名,Read_Master_Log_Pos代表上一次成功同步到的日誌文件中的位置。
如果這兩項與先前在主服務器上看到的File及Position的值不相符,則無法正確進行同步。


三.主從備份的實現細節
mysql使用3個線程來執行復制功能(其中1個在主服務器上,另兩個在從服務器上)。當發出start slave時,從服務器創建一個I/O線程,以連接主服務器並讓它發送記錄在其二進制日誌中的語句。主服務器創建一個線程將二進制日誌中的內容發送到從服務器。該線程可以即爲主服務器上show processlist輸出中的Binlog Dump線程。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容並將該數據拷貝到從服務器數據目錄中的本地文件中,即中繼日誌。第3個線程是sql線程,由從服務器創建,用於讀取中繼日誌並執行日誌中包含的更新。在從服務器上,讀取和執行更新語句被分成兩個獨立的任務。當從服務器啓動時,其I/O線程可以很快地從主服務器索取所有二進制日誌內容。


1.複製線程狀態
  通過show slave status\G和show master status可以查看複製線程狀態。常見的線程狀態有:
(1)主服務器Binlog Dump線程
Has sent all binlog to slave; waiting for binlog to be updated
線程已經從二進制日誌讀取所有主要的更新並已經發送到了從服務器。線程現在正空閒,等待由主服務器上新的更新導致的出現在二進制日誌中的新事件。

(2)從服務器I/O線程狀態
Waiting for master to send event
線程已經連接上主服務器,正等待二進制日誌事件到達。如果主服務器正空閒,會持續較長的時間。如果等待持續slave_read_timeout秒,則發生超時。此時,線程認爲連接被中斷並企圖重新連接。

(3)從服務器SQL線程狀態
Reading event from the relay log
線程已經從中繼日誌讀取一個事件,可以對事件進行處理了。
Has read all relay log; waiting for the slave I/O thread to update it
線程已經處理了中繼日誌文件中的所有事件,現在正等待I/O線程將新事件寫入中繼日誌。

2.複製過程中使用的傳遞和狀態文件
  默認情況,中繼日誌使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務器主機名,nnnnnn是序列號。中繼日誌與二進制日誌的格式相同,並且可以用mysqlbinlog讀取。
  從服務器在data目錄中另外創建兩個小文件。這些狀態文件默認名爲主master.info和relay-log.info。狀態文件保存在硬盤上,從服務器關閉時不會丟失。下次從服務器啓動時,讀取這些文件以確定它已經從主服務器讀取了多少二進制日誌,以及處理自己的中繼日誌的程度。


附錄1
關於log_bin日誌 
  my.conf 文件中的[mysqld]標籤下的log_bin指定日誌文件,如果不提供文件名,mysql將自己產生缺省文件名。mysql會在文件名後面自動添加數字引,每次啓動服務時,都會重新生成一個新的二進制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定記錄的數據庫;使用binlog-ignore-db可以指定不記錄的數據庫。注意的是:binlog-do-db和binlog-ignore-db一次只指定一個數據庫,指定多個數據庫需要多個語句。而且,MySQL會將所有的數據庫名稱改成小寫,在指定數據庫時必須全部使用小寫名字,否則不會起作用。
  以後對數據庫每做的一次操作,都會在binlog中有所記錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章