由于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就好了。
领取专属 10元无门槛券
私享最新 技术干货