概述
主从复制是把主数据库的DDL(数据定义语言)和DML(数据操纵语言)操作通过二进制日志传到从库,在从库重新执行这些日志,让从库和主库数据同步 。MySQL支持一台主库向多台从库复制,从库也能作为其他从服务器的主库,实现链状复制。
主从复制优点
- 主库故障时,可快速切换到从库继续提供服务。
- 实现读写分离,减轻主库访问压力。
- 可在从库执行备份,避免影响主库服务。
MySQL主从复制原理步骤
- 主库记录:主库(Master)在事务提交时,将数据变更记录到二进制日志文件(Binlog) 。
- 从库读取写入:从库(Slave)的IO线程读取主库的二进制日志文件内容,写入到从库的中继日志(Relay Log)。
- 从库重放:从库的SQL线程重放中继日志中的事件,将变更应用到自身数据。
搭建
服务器准备
主库IP为192.168.200.200 ,从库IP为192.168.200.201 ,需进行以下网络相关操作:
- 开放端口(推荐):
- 执行
firewall-cmd --zone=public --add-port=3306/tcp -permanent,永久开放3306端口(MySQL默认端口) 。 - 执行
firewall-cmd -reload,重新加载防火墙规则使配置生效。
- 执行
- 关闭防火墙(不推荐,有安全风险):
- 执行
systemctl stop firewalld,停止防火墙服务。 - 执行
systemctl disable firewalld,禁止防火墙开机自启。
- 执行
主库配置
- 修改配置文件:编辑
/etc/my.cnf,添加或修改以下配置项:
# MySQL服务ID,在集群中需唯一,取值1 - 2³² - 1 ,默认为1 。
server-id=1
# 设置读写模式,0代表读写,1代表只读。
read-only=0
# (可选)指定不需要同步的数据库,如mysql系统库。
binlog-ignore-db=mysql
# (可选)指定需要同步的数据库,如db01
binlog-do-db=db01
-
重启MySQL服务:执行
systemctl restart mysqld,使配置生效。 -
创建账号并授权
- 登录MySQL,执行
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';,创建itcast用户,允许从任意主机连接,设置密码为Root@123456。 - 执行
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';,为itcast用户授予主从复制权限。
- 查看二进制日志坐标
执行
show master status;,可获取二进制日志相关信息:
file:起始推送日志文件。position:起始推送日志位置。binlog_ignore_db:指定不同步的数据库。 这些信息后续配置从库时会用到。
从库配置
从库配置前两步与主库类似,不同的是要设置与主库不同的server-id,并且read-only一般设置为1表示只读
- 从库设置主库配置
- MySQL 8.0.23及之后版本:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx', SOURCE_LOG_POS=xxx; - MySQL 8.0.23之前版本:
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_USER='xxx', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=xxx; - 相关参数含义
| 参数名 | 含义 | 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 |
- 从库开启同步及查看状态操作
- 开启同步
- MySQL 8.0.22及之后版本:执行
start replica;。 - MySQL 8.0.22之前版本:执行
start slave;。
- MySQL 8.0.22及之后版本:执行
- 查看主从同步状态
- MySQL 8.0.22及之后版本:执行
show replica status;。 - MySQL 8.0.22之前版本:执行
show slave status;。
- MySQL 8.0.22及之后版本:执行
正常情况下,Replica_IO_Running和Replica_SQL_Running (8.0.22之前是Slave_IO_Running和Slave_SQL_Running )的值都应为Yes ,表示主从同步正常运行。