假設a、b兩臺服務器作了mysql雙主。mysql
有一表是tab是這樣的sql
create table tab(id int primary key auto_increment,name varchar(20));數據庫
而後服務器
若是是mysql主從的話,a是主,那麼a機ide
reset master;網站
而後b機spa
stop slave;日誌
reset slave;orm
start slave;rem
若是在a機reset master以後,b機stop slave以前,有新數據插入、刪除等操做,當b機start slave後,b機不會掉數據,那些新數據仍是會被同步過來的。
b機爲何要stop slave;reset slave;start slave; ?
由於reset master以後,到b機show slave status\G雖然仍是顯示同步,但你能夠到a機show master status;就會發現與b機show slave status\G顯示的Master_Log_File、Relay_Master_Log_File不是指向a機show master status顯示的日誌文件,由於reset master以後,a機的binlog日誌從XXX.000001開始,以前的日誌都被刪除了。指向的日誌不是a機的日誌,b機固然是不可能同步了。即便在a機插入一條新記錄,b機的Master_Log_File、Relay_Master_Log_File仍是沒有指向新的日誌,重啓mysql也無效。
錯誤提示:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'could not find next log'
只有stop slave;reset slave;start slave;才能從新指向新的日誌。在b機執行這幾個命令以前,插入到a機的數據,在運行這幾條命令以後,會同步回來的,因此不用擔憂數據丟失。
可是mysql雙主卻會由於一些特殊狀況形成數據出問題還會影響同步。
假設前面的表tab,有數據
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
由於雙主同步,因此a機和b機數據是一致的
a機
reset master;
而後b機
stop slave;
reset slave;
start slave;
在a機reset master以後,b機stop slave以前,有新數據分別插入到a機和b機,這時問題就來了
在a機
insert into tab(name) values('d');
select * from tab;
獲得
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
b機
select * from tab;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
前面說了緣由,我就再也不說了。
而後在b機
insert into tab(name) values('e');
select * from tab;
獲得
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | e |
這時a機的表tab,id 是4 ,name是d,b機的表tab,id是4,name是e,表的id是主鍵,這種狀況下,執行 stop slave;reset slave;start slave;也是會報錯的。
Last_Error: Error 'Duplicate entry '4' for key 'PRIMARY'' on query. Default database: ''. Query: 'insert into test.tab(name) values('d')'
緣由就是表的id是主鍵,b機的id已經有4了,這樣a機的
id name
| 4 | d |
同步不過來,就有這種錯誤了,只能人工把數據同步後,再從新change master......
總結:要reset master ,就要禁止用戶增刪改。若是是爲網站提供數據庫服務的,就要關了網站,防止增刪改操做,再reset吧。想把reset master作成腳本,在計劃任務中運行?要三思纔好