熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MYSQL數據庫主主同步實戰

2022-06-13   來源: MySQL 

  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
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.