抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

一、主数据库配置

1.开启GTID模式

修改配置文件,一般位于/ect/my.cnf

1
2
3
4
[mysqld]
server-id=1 # 确保id唯一
gtid_mode=on # 开启gtid
enforce-gtid-consistency=true

2.创建专用账号

请务必修改脚本中用户名master和密码Asdf1234@为自己的,避免造成安全隐患。

1
2
3
create user 'master'@'%' identified by 'Asdf1234@';
grant replication slave on *.* to 'master'@'%';
flush privileges;

3.重启mysql

二、从数据库配置

1.开启GTID模式

修改配置文件,一般位于/ect/my.cnf

1
2
3
4
[mysqld]
server-id=2 # 确保id唯一
gtid_mode=on # 开启gtid
enforce-gtid-consistency=true

2.重启mysql

3.配置主从同步

开启主从同步之前,请务必保证从库内容与主库一致,避免后续可能造成错误

1
2
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_PORT=3306, MASTER_USER='master', MASTER_PASSWORD='Asdf1234@',master_auto_position = 1;
start slave;

4.查看状态

1
show slave status;

5.开启只读模式

一般从库最好开启只读模式,避免误操作从库与主库发生冲突,导致主从无法正常同步

请注意只读权限对超管账号无效

  • 开启set global read_only=1;
  • 查看show global variables like "%read_only%";

三、测试

若主库已有数据,建立主从关系后从库不会同步旧数据,请手动将旧数据迁移至从库

此时在主库中执行建库建表插入数据等操作,从库将会实时同步。

四、F&Q

1.配置主从失败

请确保master启动了binlog,在mysql8中默认启动,若之前关闭过,可在配置文件中开启log-bin=mysql-bin

2.开启从失败

当建立主从关系后,请勿直接操作从库,避免造成错误,例如在主键唯一的表中,手动在从库添加了一条数据,这时主库中也添加了相同主键的数据,同步时将产生错误,并且会导致后续主库中有操作,从库不再同步。

若出现此情况,可通过重置日志。

1
2
stop slave;
reset slave;

重新开启

1
2
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_PORT=3306, MASTER_USER='master', MASTER_PASSWORD='Asdf1234@',master_auto_position = 1;
start slave;

3.无法主从同步

通过show slave status;查看状态,可在Last_Error发现错误信息例如

1
2
3
Coordinator stopped because there were error(s) in the worker(s). 
The most recent failure being: Worker 1 failed executing transaction 'dbb607d1-b56e-11ec-852f-02420a000094:3' at master log binlog.000005, end_log_pos 842.
See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.

根据提示查看错误日志

1
select * from performance_schema.replication_applier_status_by_worker
1
2
Worker 1 failed executing transaction 'dbb607d1-b56e-11ec-852f-02420a000094:3' at master log binlog.000005, end_log_pos 842; 
Error 'Can't create database 'test'; database exists' on query. Default database: 'test'. Query: 'CREATE DATABASE `test`'

可发现在同步CREATE DATABASE test语句时发生错误,原因因为重新开启主从之前,test表已存在,因此手动删除再开启即可。理论上主从的错误都可通过此方式排查解决。

评论