前言

  通常,为了简化逻辑,master会设置为只读,正常只通过slave进行读写。 若要两边都写,为了避免自增id冲突,一般会设置奇偶错开,即一台的自增ID均为奇数,另一台均为偶数。

基本原理

 首先,slave开启log_bin二进制日志,这里面记录了数据的修改日志,这是同步的基础。

   然后,master配置slave的连接信息,监听slave的修改日志message。

   最后,slave一旦有修改,立即向master发送通知,然后master接收到log_bin日志,进行相关数据操作。实现数据同步。

   master-master和master-slave的区别只是互为master和slave。仅此而已。

    

具体操作

1.两台相同版本的mysql服务器。为了简便,我是在win下复制两份mysql在同一台机器上执行。一台端口3307 m1,另一台3308 m2。(这里是slave同步master的数据,和前言刚好相反)

2.修改m1,m2配置文件my.ini,在linux下当然是my.conf。配置如下

m1

[mysqld]
port = 3307server-id = 1log_bin = E:/np/mysql32_2/log_bin/mysql_log_bin #开启log_bin
binlog_do_db = a #开启log_bin的数据库

m2

[mysqld]
port = 3308server-id = 2log_bin = E:/np/mysql32_2/log_bin/mysql_log_bin #开启log_bin
binlog_do_db = a #开启log_bin的数据库

 注:其实如果是master-slave模式,m2配置里面的log_bin和binlog_do_db都不需要。这里我们配置的是master-master。

 

3.启动两个数据库,首先配置m1为m2的master

进入m1>显示master的状态

show master status

输出结果如下:

mysql_log_bin.000007	796	a		

证明主库已经做好准备。

进入m2>绑定master为m1,其中master_log_file为上述master的File值mysql_log_bin.000007

change master to master_host='localhost',master_user='root',master_password='123456',master_port=3308,master_log_pos=0,master_log_file='mysql_log_bin.000007'

m2>继续执行,查看绑定的结果

show slave status

可以看到Slave_IO_Running | Slave_SQL_Running两个值都是NO,证明还没启动同步

m2>继续执行,启动同步

start slave;  

可以看到Slave_IO_Running | Slave_SQL_Running两个值都是YES,启动成功。

 

至此,我们已经配置好了mysql主从同步。接下来,如法炮制,在m1上绑定m2为master。就完成了互为主备的mysql同步。

 

关闭或者取消同步

暂时关闭, 暂时不向master同步数据

stop slave

彻底取消向master的同步

 stop slave;
 change master to master_host=' '; --注意里面是一个空格,而不是什么都木有。

 

测试

随意更改两个库的表数据,能同步,证明配置成功。

注意问题

1.我发现重启数据库,该配置仍然生效而且不用start slave。同步自动开启了,估计是把配置信息持久化了。

2.未开始同步之前,必须保持两个库的数据完全一致,不然会导致不一致的表的数据无法同步。

3.出现2的问题,,手动把数据改成一致,然后再更改数据,同步立马回复正常。