簡介
一個伺服器上執行過的sql語句在别的伺服器上也重複執行一遍,這樣隻要兩個資料庫的初态是一樣的,那麼它們就能一直同步。
當然這種複制和重複都是mysql自動實作的,我們隻需要配置即可。
對于一個mysql伺服器, 一般有兩個線程來負責複制和被複制。當開啟複制之後。
1. 作為主伺服器Master, 會把自己的每一次改動都記錄到 二進制日志 Binarylog 中。 (從伺服器會負責來讀取這個log, 然後在自己那裡再執行一遍。)
2. 作為從伺服器Slave, 會用master上的賬号登陸到 master上, 讀取master的Binarylog, 寫入到自己的中繼日志 Relaylog, 然後自己的sql線程會負責讀取這個中繼日志,并執行一遍。 到這裡主伺服器上的更改就同步到從伺服器上了。
配置過程
伺服器資訊
示例:
主伺服器IP: 192.168.1.221 資料庫賬号: root/123456 資料庫名: healthcare
從伺服器IP: 192.168.1.209 資料庫賬号: root/123456 資料庫名: healthcare
主伺服器(master)配置
首先要保證從伺服器對主伺服器資料庫的通路,即開啟MySQL的遠端通路。
修改master的資料庫配置檔案,預設配置檔案在 /etc/my.cnf,打開之後在[mysqld]之後加入以下條目:
# 啟用二進制日志 Enable binary log
log_bin = mysql-bin
#伺服器唯一ID,預設是1,一般取IP最後一段
server-id = 111
#指定索引檔案
log-bin-index=mysql-bin.index
#控制何時将日志寫入硬碟,0由作業系統決定;1事務結束時
sync_binlog=1
#bin-log日志檔案格式,設定為MIXED可以防止主鍵重複。
binlog_format=mixed
#需要同步的資料庫名 多個庫以逗号分隔
binlog-do-db = healthcare
#不需要同步的資料庫名
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
#若涉及及同步函數或者存儲過程需要配置,否則主備會産生異常不能同步
log_bin_trust_function_creators=TRUE
修改my.cnf後重新開機mysql服務.
#service mysql restart
建立同步賬号:
mysql> grant replication slave on *.* to [email protected] identified by '123456';
mysql> flush privileges;
mysql> show master status;

記錄一下file(檔案名)和position(位置).
從伺服器(slave)配置
修改slave的資料庫配置檔案,預設配置檔案在 /etc/my.cnf,打開之後在[mysqld]之後加入以下條目:
log-bin=mysql-bin
server-id=17
relay-log-index = slave-relay-bin.index
relay-log = slave-relay-bin
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
配置後重新開機mysql服務
#service mysql restart
配置連接配接主庫
#mysql -uroot -p123456
mysql>
change master to master_host='172.16.0.10',master_user='slave',master_password='fbtslave20190220', master_log_file='mysql-bin.000003',master_log_pos=120;
開始同步:
mysql> start slave;
檢視狀态:
mysql> show slave status\G;
正常狀态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果Slave_IO_Running一直處于連接配接中,查詢原因可以從:網絡不通,密碼不對,position不對查找.
測試是否同步
這裡主要是測試一下主伺服器修改一條記錄後,看看主從伺服器的資料是否已經同步
主伺服器:
#mysq -uroot -p123456
Mysql>select id,mobile,real_name from tb_member where id = 9;
從伺服器:
#mysq -uroot -p123456
Mysql>select id,mobile,real_name from tb_member where id = 9;
主伺服器:
Mysql> update tb_member set real_name = 'demo_456' where id = 9;
Mysql>select id,mobile,real_name from tb_member where id = 9;
從伺服器:
Mysql>select id,mobile,real_name from tb_member where id = 9;