文章目录
- 主从复制
- 一、概述
- 二、原理
- 三、 搭建主从复制结构
- 3.1 服务器准备
- 3.2 主库配置
- 3.3 从库配置
主从复制
一、概述
主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),使得从库和主库的数据保持同步。
从库当中把主库的二进制日志文件同步过来并执行了,name这个时候从库的数据和主库的数据也就同步保持一致了,这个过程就称为主从复制。
MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制
主库一般称为Master, 从库一般称为Slave
优点
-
主库出现问题,可以快速切换到从库提供服务
-
实现读写分离,降低主库的访问压力
增删改的请求操作主库,查询的请求操作从库
-
可以在从库中执行备份,以避免备份期间影响主库服务
在数据备份的时候,需要加一个全局锁,避免数据不一致的情况发生
添加全局锁后,其他客户端是不能执行增删改操作的(但是可以查询),显然会影响业务
但是现在有了从库之后,直接在从库进行数据备份,但是主库还是可以使用的,等从库备份完成后,再将二进制文件同步到从库,又使得主库从库数据一致。
下面这篇文章介绍了执行备份时加全局锁和不加全局锁的情况:
MySQL — 锁_我爱布朗熊的博客
二、原理
主库当中的数据是怎么同步到从库之中的?
主库当中一旦发生增删改等相关操作以及执行DDL语句的时候,它会将所有的数据变更写入到一份日志 - Binlog日志(二进制日志)
在此二进制日志当中,记录了主库所有的数据变更。(比如主库执行了一个insert,他就会记录在Binlog日志当中)
从库里面涉及到两组线程
- IOThread
会发起一个请求来连接master数据库,然后读取master数据库当中的binlog日志。
当读取日志并返回后,IOThread会将Binlog日志写入到Slave自身的一份日志,这份日志叫做中继日志 Relay Log
- SQLThread
上面的步骤完成后就该SQLThread线程出现了,主要负责读取中继日志当中的数据,把中继日志当中所记录的数据变化再反映到自身数据库的数据变化,从而保证了主从数据是一致的。
可在下面的这篇文章中补充二进制日志知识
MySQL — 日志、错误日志、二进制日志、查询日志、慢查询日志
总结
① Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
② 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。
③slave重做中继日志中的事件,将改变反映它自己的数据。
三、 搭建主从复制结构
我没有两台服务器,只能学习理论了。
3.1 服务器准备
直接将防火墙关掉就好
3.2 主库配置
主库既可以读,又可以写
-
修改my.ini文件
binlog-ignore-db:表示在同步的时候忽略哪个数据库
binlog-do-db:指定同步哪个数据库
#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
- 登录MySQL,创建远程连接账号,并授予主从复制权限
这个账户就是将来从库链接主库时的账号和密码
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务。 %表示该用户可以在任意主机上访问该服务器
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
#为 'itcast'@'%' 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
- 查看二进制日志坐标
show master status;
file : 从哪个日志文件开始推送日志文件
position : 从哪个位置开始推送日志
binlog_ignore_db : 指定不需要同步的数据库
3.3 从库配置
-
修改配置文件my.ini
从库是只读,仅仅代表对普通用户是只读的,如果具有管理员的权限也是可以读写的,如果想让超级管理员也只读,需要再增加一条 super-read-only=1
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1
- 重启MySQL服务
systemctl restart mysqld
-
登录MySQL,设置主库配置
SOURCE_HOST:主机地址
SOURCE_USER:对应服务器哪个用户
SOURCE_PASSWORD:密码
SOURCE_PASSWORD:从哪个二进制日志文件开始同步
SOURCE_LOG_POS:从这份日志的哪个位置开始同步
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.200.200',
SOURCE_USER='itcast',
SOURCE_PASSWORD='Root@123456',
SOURCE_LOG_FILE='binlog.000004',
SOURCE_LOG_POS=663;
上述是8.0.23中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:
知识参数名不同而已
CHANGE MASTER TO
MASTER_HOST='192.168.200.200',
MASTER_USER='itcast',
MASTER_PASSWORD='Root@123456',
MASTER_LOG_FILE='binlog.000004',
MASTER_LOG_POS=663;
- 开启同步操作
start replica; #8.0.22之后
start slave; # 8.0.22之前
- 查看主从同步状态
show replica status ; #8.0.22之后
show slave status ; #8.0.22之前
如果查询出来的数据比较乱,没有按照行展示,可以在操作命令之后加\G
show replica status\G ; #8.0.22之后
show slave status\G ; #8.0.22之前
如果下面红框的都是Yes,说明主从复制正常
IOThread用来读取二进制日志并将内容写入到中继日志的
SQLThread用来读取中继日志,并把数据反映到自身变化的