mysql雙主使用reset master清除日誌要當心

假設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作成腳本,在計劃任務中運行?要三思纔好j_0057.gif

相關文章
相關標籤/搜索