什么是主从复制
将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,在从库中对主库复制过来的二进制日志进行重执行,从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
MySQL主从复制的优点:
主库出现问题,可以快速切换到从库并由从库提供服务。
实现读写分离,降低主库的访问压力。
可在从库中执行备份,避免备份期间对主库服务的影响。
主从复制原理
复制过程如下:
1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。(对于日志文件的介绍,大家可以参考我另一篇学习手记《MySQL日志学习手记》)
2. 从库通过iothread线程读取主库中的Binlog日志文件,写入到从库的中继日志Relay Log文件中。
3. slave通过sqlthread线程,读取Relay Log文件中的事件,将改变反映它自己的数据。
实施步骤
第一台服务器10.168.5.183(主)
第二台服务器10.168.5.189(从)
主库配置
一:修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=1
#是否只读,1 代表只读, 0 代表读写
read-only=0
#忽略的数据, 指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
修改完配置文件后,重启mysql服务,systemctl restart mysqld
二:为数据库创建主从复制的账号,并授予相应的复制权限
CREATE USER 'replica_usr'@'%' IDENTIFIED WITH mysql_native_password BY 'Test@123456' ;
GRANT REPLICATION SLAVE ON *.* TO 'replica_usr'@'%';
如下所示,成功创建具有复制权限的用户
然后,通过如下指令,查看从库是从哪个binlog文件、哪个位置开始复制
show master status ;
字段含义说明:
file : 从哪个日志文件开始推送日志文件
position : 从哪个位置开始推送日志
binlog_ignore_db : 指定不需要同步的数据库
以上,完成主库的配置
从库配置
一:修改配置文件 /etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1
修改完配置文件后,重启mysql服务,systemctl restart mysqld
二:登录从数据库,并与主库建立连接
上述是8.0.23中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:
CHANGE MASTER TO MASTER_HOST='', MASTER_USER='', MASTER_PASSWORD='', MASTER_LOG_FILE='', MASTER_LOG_POS=;
各参数的意义如下说明:
三:开启同步
start replica ; #8.0.22之后
start slave ; #8.0.22之前
四:查看同步状态
show replica status ; #8.0.22之后
show slave status ; #8.0.22之前
如下图红色框框所示,如果出现两个YES,表示已经成功连接到主库,并能够从主库进行同步
验证
在主库上进行数据库的创建,数据表的创建,插入数据等。
至此,我们完成了Mysql主从同步的设置。
避坑指南:
在启动备库的时候,出现如下错误提示
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
原因:从数据库读取日志文件位置问题,没有与主数据的位置相对应;
解决方式:
1:刷新主数据库的状态
flush logs;
2:备库上停止slave,然后更改从库读取日志文件的位置,再重新启动slave即可。