MYSQL支持單向異步復制復制過程中一個服務器充當主服務器而一個或多個其它服務器充當從服務器主服務器將更新寫入二進制日志文件並維護日志文件的一個索引以跟蹤日志循環當一個從服務器連接到主服務器時它通知主服務器從服務器在日志中讀取的最後一次成功更新的位置從服務器接收從那時起發生的任何更新然後封鎖並等待主服務器通知下一次更新
在實際項目中兩台分布於異地的主機上安裝有MYSQL數據庫兩台服務器互為主備客戶要求當其中一台機器出現故障時另外一台能夠接管服務器上的應用這就需要兩台數據庫的數據要實時保持一致在這裡使用MYSQL的同步功能實現雙機的同步復制
以下是操作實例
數據庫同步設置
主機操作系統RedHat Enterprise Linux
數據庫版本mysql Ver Distrib
前提MYSQL數據庫正常啟動
假設兩台主機地址分別為
ServA
ServB
配置同步賬號
在ServA上增加一個ServB可以登錄的帳號
Mysql>GRANT all privileges ON ** TO tongbu@ IDENTIFIED BY ;
在ServB上增加一個ServA可以登錄的帳號
Mysql>GRANT all privileges ON ** TO tongbu@ IDENTIFIED BY ;
配置數據庫參數
以root用戶登錄ServA修改ServA的f文件
vi /etc/f
在[mysqld]的配置項中增加如下配置
defaultcharacterset=utf
logbin=mysqlbin
relaylog=relaybin
relaylogindex=relaybinindex
serverid=
masterhost=
masteruser=tongbu
masterpassword=
masterport=
masterconnectretry=
binlogdodb=umsdb
replicatedodb=umsdb
replicateignoretable=umsdbboco_tb_menu
replicateignoretable=umsdbboco_tb_connect_log
replicateignoretable=umsdbboco_tb_data_stat
replicateignoretable=umsdbboco_tb_log_record
replicateignoretable=umsdbboco_tb_workorder_record
以root用戶登錄ServB修改ServB的f文件
vi /etc/f
在[mysqld]的配置項中增加如下配置
defaultcharacterset=utf
logbin=mysqlbin
relaylog=relaybin
relaylogindex=relaybinindex
serverid=
masterhost=
masteruser=tongbu
masterpassword=
masterport=
masterconnectretry=
binlogdodb=umsdb
replicatedodb=umsdb
replicateignoretable=umsdbboco_tb_menu
replicateignoretable=umsdbboco_tb_connect_log
replicateignoretable=umsdbboco_tb_data_stat
replicateignoretable=umsdbboco_tb_log_record
replicateignoretable=umsdbboco_tb_workorder_record
手工執行數據庫同步
假設以ServA為主服務器在ServB上重啟mysql
service mysqld restart
在ServB上用root用戶登錄mysql執行
Mysql> stop slave;
Mysql> load data from master;
Mysql> start slave;
在ServA上重啟mysql
service mysqld restart
查看數據庫同步狀態
在mysql命令提示符下執行
Mysql> show slave status\G
將顯示同步進程的狀態如下所示兩行藍色字體為slave進程狀態如果都為yes表示正常;紅色字體表示同步錯誤指示如果有問題會有錯誤提示
*************************** row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:
Master_User: tongbu
Master_Port:
Connect_Retry:
Master_Log_File: localhostbin
Read_Master_Log_Pos:
Relay_Log_File: localhostrelaybin
Relay_Log_Pos:
Relay_Master_Log_File: localhostbin
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: bakumsdb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table: umsdbboco_tb_connect_logumsdbboco_tb_menuumsdbboco_tb_workorder_recordumsdbboco_tb_data_statumsdbboco_tb_log_record
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
數據庫同步測試
配置完數據庫後進行測試首先在網絡正常情況下測試在ServA上進行數據庫操作和在ServB上進行數據庫操作數據都能夠同步過去
拔掉ServB主機上的網線然後在ServA上做一些數據庫操作之後再恢復ServB的網絡環境但是在ServB上卻看不到同步的數據通過命令show slave status\G查看發現Slave_IO_Running的狀態是No這種狀態持續很長一段時間數據才能同步到ServB上去這是什麼問題呢?同步延遲不會這麼大吧後來通過網上查找相關資料找到一個同步延遲相關的參數
slavenettimeout=seconds
參數含義當slave從主數據庫讀取log數據失敗後等待多久重新建立連接並獲取數據
於是在配置文件中增加該參數設置為秒
slavenettimeout=
重啟MYSQL數據庫後測試該問題解決
數據庫同步失效的解決
當數據同步進程失效後首先手工檢查slave主機當前備份的數據庫日志文件在master主機上是否存在在slave主機上運行
mysql> show slave status\G
一般獲得如下的信息
*************************** row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:
Master_User: tongbu
Master_Port:
Connect_Retry:
Master_Log_File: mysqlbin
Read_Master_Log_Pos:
Relay_Log_File: localhostrelaybin
Relay_Log_Pos:
Relay_Master_Log_File: mysqlbin
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: bak
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
其中Master_Log_File描述的是master主機上的日志文件
在master上檢查當前的數據庫列表
mysql> show master logs;
得到的日志列表如下
+++
| Log_name | File_size |
+++
| localhostbin | |
| localhostbin | |
+++
如果slave主機上使用的的Master_Log_File對應的文件在master的日志列表中存在在slave主機上開啟從屬服務器線程後可以自動同步
mysql> start slave;
如果master主機上的日志文件已經不存在則需要首先從master主機上恢復全部數據再開啟同步機制
在slave主機上運行
mysql> stop slave;
在master主機上運行
mysql> stop slave;
在slave主機上運行
mysql> load data from master;
mysql> reset master;
mysql> start slave;
在master主機上運行
mysql> reset slave;
mysql>start slave;
注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存儲引擎的數據庫上有效
From:http://tw.wingwit.com/Article/program/MySQL/201311/29380.html