Windows下MySql主主复制

由于mysql数据库的单数据库性能有限,单个数据库在操作时压力大,导致性能下降,主从复制时,当主库出现问题时,严重影响应用程序的使用,主主同步可以有效地实现双重切换。

首先准备好两个mysql数据库。这里准备了两台mysql数据库,主从数据库1(master-slave)端口是3306,主从数据库2(master-slave)是3307。

Ø主从数据库1的my.ini配置文件如下

[mysqld]

port = 3306

#任意自然数n,只要保证两台MySQL主机不重复就可以了。

server-id=1

#开启二进制日志

log-bin=mysql-bin

#步进值auto_imcrement。一般有n台主MySQL就填n

auto_increment_increment=2

#起始值。一般填第n台主MySQL。此时为第一台主MySQL

auto_increment_offset=1

#忽略mysql库【我一般都不写】

#binlog-ignore=mysql

#忽略information_schema库【我一般都不写】

#binlog-ignore=information_schema

#要同步的数据库,默认所有库

replicate-do-db=test1

#指定mysql的binlog日志记录哪个db

binlog-do-db=test1

在主从数据库1添加一个mysql主从复制需要的账号

#添加账号授权

grant replicationslave,reload,super on *.* to slave12@'localhost' identified by 'slave12';

#刷新配置

flush privileges;

Ø查看主从数据库1的status

在主从数据库1的连接库下面,输入show master status,运行查看主数据库的状态,如下

配置主从数据库2的my.ini配置文件

[mysqld]

port = 3307

#任意自然数n,只要保证两台MySQL主机不重复就可以了。

server-id=12

#开启二进制日志

log-bin=mysql-bin

#步进值auto_imcrement。一般有n台主MySQL就填n

auto_increment_increment=2

#起始值。一般填第n台主MySQL。此时为第一台主MySQL

auto_increment_offset=2

#忽略mysql库【我一般都不写】

#binlog-ignore=mysql

#忽略information_schema库【我一般都不写】

#binlog-ignore=information_schema

#要同步的数据库,默认所有库

replicate-do-db=test1

#指定mysql的binlog日志记录哪个db

binlog-do-db=test1

在主从数据库2添加一个mysql主从复制需要的账号

#添加账号授权

grant replicationslave,reload,super on *.* to slave1@'localhost' identified by 'slave1';

#刷新配置

flush privileges;

Ø查看主从数据库2的status

在主从数据库2的连接库下面,输入show master status,运行查看主数据库的状态,如下

配置主从数据库1从主从数据库2同步

在主从数据库1里面,配置同步主数据库2的日志文件,配置参数由主数据库2提供,配置输入

#停止主从同步

stop slave;

#修改主服务配置信息

CHANGE MASTER TO

#主从数据库2的地址

MASTER_HOST='localhost',

#主从数据库2的端口

MASTER_PORT=3307,

#主从数据库2配置的同步账号

MASTER_USER='slave1',

#主从数据库2配置的同步密码

MASTER_PASSWORD='slave1',

#主从数据库2的日志文件,主服务执行show master status的file参数

MASTER_LOG_FILE='mysql-bin.000003',

#主从数据库2的日志站点,主服务执行show master status的position参数

MASTER_LOG_POS=442;

#启动主从同步

start slave;

其中:当从来没有启动主从复制时,可以不执行stop slave,否则必须执行,才能配置。配置完成之后,必须启动主从同步。

检查主从数据库1配置是否正常

在主从数据库1下,执行SHOWSLAVE STATUS查看配置状态,只有当Slave_Io_Running和Slave_SQL_Running都为Yes时,才算配置成功。

配置主从数据库2从主从数据库1同步

在主从数据库2里面,配置同步主数据库1的日志文件,配置参数由主数据库1提供,配置输入

#停止主从同步

stop slave;

#修改主服务配置信息

CHANGE MASTER TO

#主从数据库1的地址

MASTER_HOST='localhost',

#主从数据库1的端口

MASTER_PORT=3306,

#主从数据库1配置的同步账号

MASTER_USER='slave12',

#主从数据库1配置的同步密码

MASTER_PASSWORD='slave12',

#主从数据库1的日志文件,主服务执行show master status的file参数

MASTER_LOG_FILE='mysql-bin.000005',

#主从数据库1的日志站点,主服务执行show master status的position参数

MASTER_LOG_POS=120;

#启动主从同步

start slave;

其中:当从来没有启动主从复制时,可以不执行stop slave,否则必须执行,才能配置。配置完成之后,必须启动主从同步。

检查主从数据库2配置是否正常

在主从数据库2下,执行SHOWSLAVE STATUS查看配置状态,只有当Slave_Io_Running和Slave_SQL_Running都为Yes时,才算配置成功。

验证主从数据库1和主从数据库2的主主同步

在主从数据库1加入新增一张userinfo表,并插入数据加入两条数据,执行查看两个库的情况

#在主从数据库1插入数据

insert into userinfo(id,name,age) values(1,'张三',18);

insert into userinfo(id,name,age) values(2,'张三3306',18);

insert into userinfo(id,name,age) values(3,'李四3306',19);

#查看主从数据库的userinfo的信息

select * from userinfo;

在主从数据库2加入的userinfo加入两条数据,执行查看两个库的情况

#在主从数据库2插入数据

insert intouserinfo(id,name,age) values(4,'张三3307',18);

insert intouserinfo(id,name,age) values(5,'李四3307',19);

#查看主从数据库的userinfo的信息

select * from userinfo;

综上测试可以看到,无论两个数据库哪一个发生变化时,另外一个都会受到影响。

注意事项:在配置主主复制时,下面情况将导致无法配置成功

1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。

2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示,可根据错误提示进行更正。

3、Slave_IO_Running、Slave_SQL_Running不全为YES时,大多数问题都是数据不统一导致。

常见出错点:

1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQLdb中没有tab1,那肯定不能成功。

2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更。在配置CHANGE MASTER时还是用到之前的POS。

3、stopslave后,数据变更,再start slave。出错。

终极更正法:重新执行一遍CHANGE MASTER就好了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181203G1135K00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券