mysql單向自動同步 原

mysql自動同步

以下教程均使用mysql自帶的自動同步功能

全庫單向自動同步

本例把192.168.3.45上名稱爲ewater_main的數據庫自動同步到192.168.3.68的ewater_main數據庫,前者被稱爲主庫(master),後者稱爲從庫(slave)

注意同步是單向(從192.168.3.45到192.168.3.68)。且是全庫(全部的表)。

 

首先用navicat,分別在master和slave都建一個用於同步的用戶,用戶密碼都是repl,然後允許主機先設爲%(需要考慮安全性可以設具體ip)

 

在master的主機也就是192.168.3.45上操作,打開mysql的命令行

 

輸入:

grant replication slave on *.* to 'repl'@'192.168.3.68' identified by 'repl';

其中192.168.3.68是slave的ip,第一個repl是用於同步用戶的用戶名,第二個repl是同步用戶的密碼

 

再輸入:

flush privileges;

 

結果如圖

 

然後修改master的my.ini文件

PS:注意,以下提到的在my.ini裏面的配置項,有些已經存在文件,有些不存在,因此在修改前必須先搜索一次確認是否已存在, 否則多個同名配置項後者會把之前的覆蓋

 

找到server-id項,並修改,可以任意改一個,但不要是1,本例設爲107

 

然後再設置配置項log-bin,值設爲一個絕對路徑,此值用於存儲二進制日誌文件。注意,例如此例中配置爲D:\MysqlLogBin\log,意思是日誌文件都放在D:\MysqlLogBin文件夾下,且日誌文件都以log開頭

 

配置效果如下

 

設置binlog-do-db,值爲要同步的數據庫名,如果備份多個數據庫,重複設置這個選項即可

設置log-slave-updates=1,這個參數一定要加上,否則不會給更新(可以理解爲sql的update)的記錄些到二進制文件

設置slave-skip-errors=1,意思是跳過錯誤,繼續執行復制操作

 

其他可選配置:

binlog-ignore-db=xxx,意思是不需要備份的數據庫名,如果備份多個數據庫,重複設置這 個選項即可

 

配置效果如下:

 

重啓master的mysql

 

在命令行輸入:

show master status;

查看作爲master的狀態

其中binlog-do-db就是剛纔配置的binlog-do-db,而File和Position要記着,後面配置從庫(slave)要用到

 

然後開始配置slave

修改my.ini

 

配置server-id,可配置任意值,但不能是默認值1,也不能跟master的相同,本例配爲109

效果如下:

 

配置replicate-do-db,意思是從庫被同步的數據庫,效果如下

 

重啓mysql

 

打開mysql的命令行

 

開始在slave配置master的配置

 

輸入:stop slave;

 

輸入:(注意:以下的換行在命令行輸入時真的要回車換行,有些行有逗號也真的要輸入)

change master to

master_host='192.168.3.45',

master_user='repl',

master_password='repl',

master_log_file='log.000004',

master_log_pos=2910;

 

其中master_host是master的ip,master_user和master_password是master庫用於同步的用戶和密碼,master_log_file和master_log_pos都是master的信息(剛纔有說,也如下圖)

 

輸入時類似下圖

 

輸入:

start slave;

 

重啓數據庫

 

到此配置完畢

在此可以用命令

show slave status\G;

看看作爲slave的配置和狀態,其中Slave_IO_Running和Slave_SQL_Running值應爲Yes

 

然後開始測試

 

打開navicat連接master的ewater_main庫,在ew_companydemo表添加一條記錄

 

再打開slave的ewater_main庫,打開ew_companydemo表,應該可以看到

 

master加的

slave同一個表 刷新能看到

 

到此同步配置完成

 

設置只同步指定的表

本例假設只同步ewater_main庫的ew_companydemo表,可使用配置項replicate-wild-do-table,如果要設置多個表可添加多行

PS:注意之前如果配置了全庫同步也就是replicate-do-db需要屏蔽,假設如果配置同時有replicate-do-db和replicate-do-db那兩條都會生效

 

另外,如果要設置不同步哪個表,可用配置項replicate-wild-ignore-table,格式類似

 

設置同步的主從庫名稱不同

本例假設把master的ewater_main庫同步到slave的ewater_db2,可用配置項replicate-rewrite-db

應配置爲replicate-rewrite-db = ewater_main -> ewater_db2,其中->左邊是master的庫,右邊是同步到的slave的庫

 

注意:如果還有設置只同步具體表,可以與replicate-wild-do-table同時使用,但是注意配置的庫名稱應該是slave的庫名,例如在以上配置基礎上增加只同步ewater_db2庫的ew_companydemo表,可配置爲

 

同步出錯調試技巧

當發現同步失效,很可能是某次同步過程中出錯,導致後面的同步失敗

 

查看同步失敗異常信息,可以在slave執行命令 show slave status\G;

然後根據錯誤信息進行修改,錯誤原因通常是因爲兩個庫數據不同而造成slave執行master的數據庫操作失敗

 

以下是一些常見錯誤

 

 

master新增記錄的主鍵在slave有重複

例如同步某表,在master中主鍵值爲110,而slave已經存在主鍵爲110的此行

解決方法可以在slave刪除主鍵爲110的這行

 

master刪除記錄的主鍵在slave沒有

例如同步某表,在master中主鍵值爲110,而slave已經沒有主鍵爲110的行

解決方法可以在slave增加主鍵爲110的這行

 

萬能解決方案

瞭解自動同步原理的可知,slave是執行master的日誌文件實現同步,那當執行到某行出錯,可以重新設置同步的行(position)來跳過出錯的行以解決

 

具體方法是在master查詢日誌文件最新的position

 

然後在slave重新change master to XXX(具體命令上面有寫),其中position設爲最新的即可

 

 

自動同步原理

master庫會把所有數據庫操作寫到日誌文件(因此master配置中有bin-log的配置)

 

slave會讀取master的日誌文件且在slave在操作一次,以實現同步

 

由於是在slave重複執行一次master的sql,因此,當slave的數據與master不同,就有可能會出錯

例如經典delete錯誤:假設slave沒有主鍵=13的行,但是master有且delete了主鍵爲13的行,那在slave delete時就會找不到行,就會出錯

 

slave可設置從master的哪個log文件的哪行(position)開始同步

也因此slave有change master to xxxx的操作

 

 

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