【Mysql】主从复制
文章目录
- 【Mysql】主从复制
- 1. 概述
- 2. 原理
- 3. 搭建
- 3.1 准备工作
- 3.2 主库配置
- 3.3 从库配置
1. 概述
主从复制是指主数据库的 DDL
和 DML
操作通过二进制日志传到从库服务器中,然后再从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
Mysql主从复制的优点:
- 主库出现问题,可以快速切换到从库提供服务。
- 实现读写分离,降低主库的访问压力。
- 可以在从库中执行备份,以避免备份期间主库不能写入的问题。
2. 原理
Mysql主从复制的核心就是 二进制日志
,具体过程如下:
由图可知,复制分成三步:
- Master 主库在事务提交时,会把数据变更记录在二进制日志文件
Binlog
中。 - 从库读取主库的二进制日志文件
Binlog
,写入到从库的中继日志Relay log
。 - 从库重做中继日志
Relay log
中的事件,将改变反映它自己的数据。
3. 搭建
3.1 准备工作
准备至少两台mysql数据库,可以使用 docker
在同一台虚拟机上安装两个mysql数据库。参考文档: 点击查看
如果服务安装在不同的虚拟机上,要注意开放对应的端口。
3.2 主库配置
1)首先修改主库的配置文件,找到你的数据库配置文件 my.cnf
:
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=1
#是否只读,1 代表只读, 0 代表读写
read-only=0
#忽略的数据, 指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
2)重启mysql服务器
docker restart mysql
3)创建远程连接账号并授权
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#为 'itcast'@'%' 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
4)通过指令,查看二进制日志坐标:
show master status ;
- File:从哪个日志文件开始推送日志文件
- position:从哪个位置开始推送日志
- binlog_ignore_db:指定不需要同步的数据库
3.3 从库配置
1)修改从库的配置文件 my.cnf
:
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1
2)重启mysql
docker restart mysql-slave
3)登录mysql,设置主库配置:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.101.65', SOURCE_USER='itcast',
SOURCE_PASSWORD='123456', SOURCE_LOG_FILE='binlog.000121',
SOURCE_LOG_POS=663;
上述是8.0.23中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:
CHANGE MASTER TO MASTER_HOST='192.168.101.65', MASTER_USER='itcast',
MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000121',
MASTER_LOG_POS=663;
参数名 | 含义 | 8.0.23之前 |
---|---|---|
SOURCE_HOST | 主库IP地址 | MASTER_HOST |
SOURCE_USER | 连接主库的用户名 | MASTER_USER |
SOURCE_PASSWORD | 连接主库的密码 | MASTER_PASSWORD |
SOURCE_LOG_FILE | binlog日志文件名 | MASTER_LOG_FILE |
SOURCE_LOG_POS | binlog日志文件位置 | MASTER_LOG_POS |
4)开启同步操作
#8.0.22之后
start replica ;
#8.0.22之前
start slave ;
5)查看主从同步状态:
#8.0.22之后
show replica status \G;
#8.0.22之前
show slave status \G;
至此,主从复制搭建完成,可以在主库中创建数据库再查看从库是否也创建了数据库来测试是否搭建成功。