一.环境
服务器a:192.168.0.10
服务器b:192.168.0.21
Mysql版本:8.0.33
System OS:CentOS Linux release 7.9.2009 (Core)
二.创建同步用户
连接服务器a和服务器b上的mysql,分别建立一个同步用户:
mysql>create user slave@'%' identified by '123456';
mysql>GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%'WITH GRANT OPTION;
//刷新
mysql>flush privileges;
三.配置/etc/my.cnf
服务器a下的 [mysqld] ,注意是[mysqld],而不是[mysql]
#主从集群-主
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
服务器b下的 [mysqld] ,注意是[mysqld],而不是[mysql]
#主从集群-从1
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
然后分别重启服务器a和服务器b的mysql
systemctl restart mysqld.service
四.主从配置
1.修改主从配置录服务器a的Mysql数据库,执行下面SQL,记录下结果中File和Position的值
show master status;
注:上面SQL的作用是查看Master的状态,执行完此SQL后不要再执行任何操作
2.登录服务器b的Mysql数据库,执行下面SQL
#执行前先停下slave
stop slave;
change master to
master_host='192.168.0.10',master_user='slave',master_password='123456',
master_log_file='binlog.000008',master_log_pos=592;
#执行后启动slave
start slave;
#输出会很乱
show slave status;
#这样就竖着输出,不会乱
show slave status\G;
**两个yes则表示成功配置主从复制,Connection和No都是配置有问题
五.测试主从复制
我们分别用Navicat连接了主从的mysql,然后我现在往主机添加一个数据库,刷新一下备机,ok成功,主从复制配置完成
六.如果同步不了,如何排错?
如果主从数据库同步不了,就从库执行下 show slave status\G;如果是Slave_IO_Running: No,那么,很可能是主从库UUID重复了,或者是防火墙端口没开通,(这些上面都有讲到);
如果是 Slave_SQL_Running: No,那么我们可以通过跳过错误和手动同步来解决。
Slave_SQL_Running: No 问题分析
1.程序可能在slave上进行了写操作
2.也可能是slave机器重启后,事务回滚造成的.
备机上每写一次,主机master的pos都会变一次,有时候同步没成功,就会导致主从机pos值不一样,这时候有两种解决方法,一种是跳过这个错误,一种是手动同步pos值
解决办法一:跳过这个错误,
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;就是跳过一次的意思
解决办法:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
解决办法二:手动同步pos值
进入master
到主服务器上查看主机状态:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| binlog.000008 | 2844 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
然后进到slave
首先停掉Slave服务: stop slave;
然后到slave服务器上执行手动同步:
mysql>change master to
master_host='192.168.0.10',master_user='slave',master_password='123456',
master_log_file='binlog.000008',master_log_pos=2844;
再打开Slave服务: start slave;
然后发现又是两个yes了,搞定!
下次整个mysql双主双写或双主单写吧