假设a、b两台服务器做了mysql双主。

有一表是tab是这样的

create table tab(id int primary key auto_increment,name varchar(20));

然后

如果是mysql主从的话,a是主,那么a机

reset master;

然后b机

stop slave;

reset slave;

start slave;

如果在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做成脚本,在计划任务中运行?要三思才好