假设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......
在mysql的配置文件中,添加这两个参数
auto-increment-offset=1 #主备配置不一样的参数值,主为1,备为2
auto-increment-increment=2 #主备都为2
可以使自动增加的ID,插入到主的数据为ID值为奇数,插入到备的数据为ID值为偶数,那么就不会出现ID冲突了。
总结:要reset master ,就要禁止用户增删改。若是是为网站提供数据库服务的,就要关了网站,防止增删改操做,再reset吧。想把reset master作成脚本,在计划任务中运行?要三思才好