MySQL主從複製之單向主從

前言:知其然,知其所以然,我一直認爲,知其所以然有助於記憶,所以先來介紹一下原理,免得我們只會配置主從,卻不知道其原理所在。

單向主從複製原理:主庫將外界SQL事件記錄到自身的binlog日誌中,從庫請求主庫的binlog日誌並將其寫入中繼日誌,而後從庫重做中繼日誌中的SQL事件,說的通俗點,就是從庫去看看主庫都幹了些啥,然後照着樣子自己也幹一遍,用這樣的方式來保證自己的數據和主庫一致,OK,此處只是簡單說明,需要詳細瞭解的朋友可以自行查閱相關資料。廢話不多說,這就開搞吧!

一、實踐環境:windows平臺,兩數據庫,一作爲主,一作爲從(均爲MySQL5.7版本):

          A:192.168.1.1  (主庫)

          B:192.168.1.2  (從庫)

二、準備工作:


  (1)  開啓binlog(主從均需要):開始說到,主從同步需要使用到binlog日誌,但是默認是未開啓的,所以我們先要開啓MySQL的日誌,編輯MySQL的配置文件my.ini(linux下叫my.cnf)添加一行:

log-bin=mysql-bin  #開啓binlog


(2)server-id(主從均需要):這個玩意兒是用來判定是否接收binlog的,爲正整數,要求主庫比從庫大,怎麼才爲大?數值小的爲大,比如從庫爲2,那主庫應該爲1,如果配置成一樣會如何?從庫會丟棄binlog,從而沒有數據!這個也是修改配置文件,默認爲1,從庫的話修改爲2就好了。


(3)replicate_do_db(從庫或需要):這個在從庫配置,注意,不是必須的,該項未配置時,默認爲所有庫,當你有針對性的同步某一個庫時,你可指定該屬性,如:

replicate_do_db=test   # 同步test庫


三、在主庫創建同步賬戶並授權:同步賬戶是用於控制誰能連接主庫並進行同步的。語法格式如下:

create user 'repl'@'%' identified by '123';     #創建賬戶,repl爲用戶名,123爲密碼,%表示允許所有網段的主機可使用該賬戶,也可以指定某一具體ip,或者某一網段

grant replication slave on *.* to 'repl'@'%';  #對該用戶進行授權

flush privileges; #刷新權限


四、重啓主庫服務,查看主庫狀態:第三步做完,就可以重啓主庫服務了,重啓完成後,查看其狀態:

show master status;

image.png

注意:記錄紅框的兩處,從庫配置的時候需要用到!


五、停止對主庫一切寫入操作,備份主庫數據還原到從庫:在配置從庫複製前,需要保持主庫和從庫的數據一致!


六、重啓從庫服務,配置並啓動主從:

從庫完成重啓後,進行如下配置:

mysql> change master to

    -> master_host='192.168.1.1', #主庫IP地址

    -> master_user='repl',   #同步賬戶名

    -> master_password='bvt',  #同步賬戶密碼

    -> master_log_file='mysql-bin.000002',  #主庫二進制日誌文件名稱,與上圖紅框處保持一致

    -> master_log_pos=47434368;  #主庫二進制日誌的pos,與上圖紅框處保持一致

然後執行:

start slave;  #啓動主從複製


七、查看從庫狀態,關注兩個YES

show slave status\G;

image.png

image.png

Slave_IO_Running: Yes                                     //此處必須是yes

Slave_SQL_Running: Yes                                    //此處必須是yes

這處值爲Yes則表示成功了


八、問題排查:有時候配置了,但是卻沒有看到兩個Yes,此時多半是因爲從庫的master_log_pos和主庫不一致了,查詢主庫的binlog文件的Position然後重新配置一遍就可以了,爲了一遍成功,在配置的時候,保持主庫沒有寫入操作是非常重要的,有的也採用鎖表操作,這個根據情況而定,怎麼方便就怎麼辦就OK了!


九、結語

本文根據俺的經驗所寫,難免有不足之處,若發現了不當之處,敬請斧正。另外,關於主從配置中,是否要修改日誌記錄格式,此處不做說明,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章