MySQL 5.5 Master/Slave 配置

season0891發表於2012-08-08
在MySQL5.5版本中,引入了半同步複製模式(Semi-synchronous Replication)能夠成功避免上述資料丟失的隱患。在這種模式下:master會等到binlog成功傳送並寫入至少一個slave的delay log之後才會提交,否則一直等待,直到timeout(預設10s)。當出現timeout的時候,master會自動切換半同步為非同步,直到至少有一個slave成功收到併傳送Acknowledge,master會再切換回半同步模式。結合這個新功能,我們可以做到,在允許損失一定的事務吞吐量的前提下來保證同步資料的絕對安全,因為當你設定timeout為一個足夠大的值的情況下,任何提交的資料都會安全抵達slave。  

         半同步模式其實是作為MySQL5.5的一個plugin實現的,master和slave使用不同的plugin。預設情況下沒有安裝該plugin,官方提供的MySQL Server RPM包預設安裝後,會在/usr/lib(64)/mysql/plugin/下面找到該外掛。安裝完外掛之後,還需要手動設定系統引數以開啟半同步複製模式。


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

 

Master 伺服器:

 

vi my.cnf
  [mysqld]
  log-bin=NEW_NAME
  server-id=1     #配一個唯一的ID編號,1至32。

#設定要進行或不要進行主從複製的資料庫名,同時也要在 Slave 上設定。

  binlog-do-db=資料庫名

  binlog-ignore-db=資料庫名

 

安裝外掛

 

mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';

  刪除外掛是:uninstall plugin PLUGIN_NAME;

mysql>show status;

Rpl_semi_sync_master_clients       0      ##表示有多少slave設定了半同步模式。

Rpl_semi_sync_master_no_tx         0      ##表示沒有成功接收slave回執的提交次數

Rpl_semi_sync_master_status        OFF    ##表示當前是非同步模式還是半同步模式,設成ON狀態,set global rpl_semi_sync_master_enabled=1;

  mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, 預設是 10s)

 

 mysql> grant replication slave on *.* to NEW_NAME@Slave伺服器IP identified by '**';

 mysql> flush tables with read lock;
 mysql> show master status;   #記下現在的日誌檔案位置。
     顯示: saturn-bin.002  106

 


 


Slave伺服器:

 

vi my.cnf
 [mysqld]
 server-id=2     #也是要唯一。

#設定要進行或不要進行主從複製的資料庫名,同時也要在 Master 上設定。

 replicate-do-db=資料庫名

 replicate-ignore-db=資料庫名

 

安裝外掛

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
mysql> change master to master_host='Master伺服器IP',master_user='授權使用者(不可以是root)',master_password='',master_log_file='saturn-bin.002',master_log_pos=106;

 

設定rpl_semi_sync_slave_enabled =ON,重啟才生效 mysql>slave stop;slave start  


檢查設定沒有問題後,Master伺服器:mysql> unlock tables;

 

mysql>show master status \G  #檢視Master狀態

mysql>show slave status \G   #檢視Slave狀態

 

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


問題處理記錄:


1、Slave伺服器當機,導致Slave伺服器啟動後 show slave status \G 後提示錯誤

       Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event'


解決:

     Master: show master status \G    #記錄 Master 以下資訊

                  File: mysql-MasterSlave.000006
                  Position: 174367


     Slave: slave stop;

                  reset slave;

                  change master to master_host='192.168.1.126',master_user='USER',master_password='PW',master_log_file='mysql-MasterSlave.000006',master_log_pos=174367;


     提示:從 Mysql 5.5 開始 Mysql 加入半同步複製,取消了 load data from master 之類的用法,MySQL Slave/Master例項在異常終止恢復之後,MySQL Slave可以處理未完成的或丟棄Master寫如log失敗資料,從而重新從master上獲取源資料,同樣,Master 例項重啟不會使 Slave 丟失資料。

 

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


Master 同步執行緒狀態


以下列出了master的 Binlog Dump 執行緒 State 欄位中最常見的幾種狀態。如果在master上沒有 Binlog Dump 執行緒,那麼同步就沒有在執行。也就是說,沒有slave連線上來。
Sending binlog event to slave
    事件是由二進位制日誌構成,一個事件通常由更新語句加上其他資訊。執行緒讀取到一個事件並正傳送到slave上。
Finished reading one binlog; switching to next binlog
    讀取完了一個二進位制日誌,正切換到下一個。
Has sent all binlog to slave; waiting for binlog to be updated
    已經讀取完全部未完成更新日誌,並且全部都傳送到slave了。它處於空閒狀態,正等待在master上執行新的更新操作以在二進位制日誌中產生新的事件,然後讀取它們。
Waiting to finalize termination
    當前執行緒停止了,這個時間很短。
   
Slave的執行緒狀態
以下列出了slave的I/O執行緒 State 欄位中最常見的幾種狀態。從MySQL 4.1.1開始,這個狀態在執行 SHOW SLAVE STATUS 語句結果的 Slave_IO_State 欄位也會出現。這意味著可以只執行 SHOW SLAVE STATUS 語句就能瞭解到更多的資訊。
Connecting to master
    該執行緒證嘗試連線到master上。
Checking master version
    確定連線到master後出現的一個短暫的狀態。
Registering slave on master
    確定連線到master後出現的一個短暫的狀態。
Requesting binlog dump
    確定連線到master後出現的一個短暫的狀態。該執行緒向master傳送一個請求,告訴它要請求的二進位制檔案以及開始位置。
Waiting to reconnect after a failed binlog dump request
    如果二進位制日誌轉儲(binary log dump)請求失敗了(由於連線斷開),該執行緒在休眠時進入這個狀態,並定期重連。重連的時間間隔由 --master-connect-retry 選項來指定。
Reconnecting after a failed binlog dump request
    該執行緒正嘗試重連到master。
Waiting for master to send event
    已經連線到master,正等待它傳送二進位制日誌。如果master閒置時,這個狀態可能會持續較長時間,如果它等待超過 slave_read_timeout 秒,就會發生超時。這時,它就會考慮斷開連線,然後嘗試重連。
Queueing master event to the relay log
    已經讀取到一個事件,正把它複製到中繼日誌中以備SQL執行緒處理。
Waiting to reconnect after a failed master event read
    讀日誌時發生錯誤(由於連線斷開)。該執行緒在重連之前休眠 master-connect-retry 秒。
Reconnecting after a failed master event read
    正嘗試重連到master。當連線確定後,狀態就變成 Waiting for master to send event。
Waiting for the slave SQL thread to free enough relay log space
    relay_log_space_limit 的值非零,中繼日誌的大小總和超過這個值了。I/O執行緒等待SQL執行緒先處理中繼日誌然後刪除它們以釋放足夠的空間。
Waiting for slave mutex on exit
    當前執行緒停止了,這個時間很短。
Reading event from the relay log
    從中繼日誌裡讀到一個事件以備執行。
Has read all relay log; waiting for the slave I/O thread to update it
    已經處理完中繼日誌中的全部事件了,正等待I/O執行緒寫入更新的日誌。
Waiting for slave mutex on exit
    當前執行緒停止了,這個時間很短。

 

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

 

附 Last_SQL_Errno 錯誤程式碼說明:

 

1005:建立表失敗
1006:建立資料庫失敗
1007:資料庫已存在,建立資料庫失敗
1008:資料庫不存在,刪除資料庫失敗
1009:不能刪除資料庫檔案導致刪除資料庫失敗
1010:不能刪除資料目錄導致刪除資料庫失敗
1011:刪除資料庫檔案失敗
1012:不能讀取系統表中的記錄
1020:記錄已被其他使用者修改
1021:硬碟剩餘空間不足,請加大硬碟可用空間
1022:關鍵字重複,更改記錄失敗
1023:關閉時發生錯誤
1024:讀檔案錯誤
1025:更改名字時發生錯誤
1026:寫檔案錯誤
1032:記錄不存在
1036:資料表是隻讀的,不能對它進行修改
1037:系統記憶體不足,請重啟資料庫或重啟伺服器
1038:用於排序的記憶體不足,請增大排序緩衝區
1040:已到達資料庫的最大連線數,請加大資料庫可用連線數
1041:系統記憶體不足
1042:無效的主機名
1043:無效連線
1044:當前使用者沒有訪問資料庫的許可權
1045:不能連線資料庫,使用者名稱或密碼錯誤
1048:欄位不能為空
1049:資料庫不存在
1050:資料表已存在
1051:資料表不存在
1054:欄位不存在
1065:無效的SQL語句,SQL語句為空
1081:不能建立Socket連線
1114:資料表已滿,不能容納任何記錄
1116:開啟的資料表太多
1129:資料庫出現異常,請重啟資料庫
1130:連線資料庫失敗,沒有連線資料庫的許可權
1133:資料庫使用者不存在
1141:當前使用者無權訪問資料庫
1142:當前使用者無權訪問資料表
1143:當前使用者無權訪問資料表中的欄位
1146:資料表不存在
1147:未定義使用者對資料表的訪問許可權
1149:SQL語句語法錯誤
1158:網路錯誤,出現讀錯誤,請檢查網路連線狀況
1159:網路錯誤,讀超時,請檢查網路連線狀況
1160:網路錯誤,出現寫錯誤,請檢查網路連線狀況
1161:網路錯誤,寫超時,請檢查網路連線狀況
1062:欄位值重複,入庫失敗
1169:欄位值重複,更新記錄失敗
1177:開啟資料表失敗
1180:提交事務失敗
1181:回滾事務失敗
1203:當前使用者和資料庫建立的連線已到達資料庫的最大連線數,請增大可用的資料庫連線數或重啟資料庫
1205:加鎖超時
1211:當前使用者沒有建立使用者的許可權
1216:外來鍵約束檢查失敗,更新子表記錄失敗
1217:外來鍵約束檢查失敗,刪除或修改主表記錄失敗
1226:當前使用者使用的資源已超過所允許的資源,請重啟資料庫或重啟伺服器
1227:許可權不足,您無權進行此操作
1235:MySQL版本過低,不具有本功能

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-740328/,如需轉載,請註明出處,否則將追究法律責任。

相關文章