5、主从复制
复制的基本原理
MySQL 主从复制通过 三个主要过程 实现数据的同步,涉及主服务器上的一个线程和从服务器上的两个线程。
| 角色 | 过程 | 线程 | 作用 |
|---|---|---|---|
| 主服务器 | 记录与发送 | Binlog Dump 线程 | 将所有数据库更新操作写入 Binary Log,并将其传输给从服务器,这些记录过程叫做二进制日志事件。 |
| 从服务器 | 接收与写入 | I/O 线程 | 连接主服务器,接收 Binary Log 中的更新操作,并将其复制写入到本地的 Relay Log(中继日志) 文件中。 |
| 从服务器 | 执行与同步 | SQL 线程 | 读取 Relay Log 中的更新操作,并在从服务器上依次执行这些操作「异步串行」,最终实现主从数据同步。 |
关键点总结
- 主服务器:负责生成 Binary Log 和发送日志(通过 Binlog Dump 线程)。
- 从服务器:负责接收日志(通过 I/O 线程写入 Relay Log)和应用日志(通过 SQL 线程执行 Relay Log)。
SHOW PROCESSLIST可用于查看主服务器上的 Binlog Dump 线程状态。SHOW SLAVE STATUS可用于查看从服务器上的 I/O 线程状态。

复制的基本原则
- 每个slave只有一个master
- 每个slave只能有一个唯一的服务器ID
- 每个master可以有多个salve
- 网络上会有延时
一主一从常见配置
mysql版本一致且后台以服务运行
主从都配置在[mysqld]结点下,都是小写
主机(windows)修改my.ini配置文件
# [必须]服务器唯一ID
server_id=1
# [必须]启用二进制文件
log-bin=E:/a_work/a_tools/PhpStudy2018/PHPTutorial/MySQL/mysqlbin
# [可选]启用错误日志,这条配置暂时不能配置,导致mysql启动失败
log-err=E:/a_work/a_tools/PhpStudy2018/PHPTutorial/MySQL/mysqlerr
# [可选]根目录
basedir=E:/a_work/a_tools/PhpStudy2018/PHPTutorial/MySQL/
# [可选]临时目录
tmpdir=E:/a_work/a_tools/PhpStudy2018/PHPTutorial/MySQL/
# [可选]数据库目录
datadir=E:/a_work/a_tools/PhpStudy2018/PHPTutorial/MySQL/data/
# [可选]是否开启只读(0 : 否 1 : 是)
read-only=0
# [可选]忽略复制的数据库
binlog-ignore-db=mysql
# [可选]设置需要复制的数据库
binlog-do-db=riven
从机(linux)修改my.cnf配置文件
server-id=2 #[必须]主服务器唯一ID
log-bin=mysql-bin #[必须]启用二进制文件
因修改过配置文件,主机、从机都需要重启后台mysql服务
window
net stop mysql
linux
service mysql restart
主从机都关闭防火墙
window手动关闭
service iptables stop # 关闭虚拟机linux防火墙
在Windows主机上建立帐户并授权slave
授权
# 示例
GRANT REPLICATION SLAVE ON *.*
TO '主机账号'@'从机ip'
IDENTIFIED BY '主机密码';
# 实例
GRANT REPLICATION SLAVE ON *.*
TO '192.168.31.101'@'192.168.31.103'
IDENTIFIED BY 'root';
刷新mysql状态
FLUSH PRIVILEGES;
刷新binlog日志
flush logs;
查询master的状态
记录下File(二进制文件)、Position(磁盘位置) 的值
注意:执行完此步骤后不要再操作主服务器,防止主服务器状态值变化
show master status;
+-------------+---------+------------+----------------+-----------------+
|File |Position |Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|
+-------------+---------+------------+----------------+-----------------+
|binlog.000048|993674618| | | |
+-------------+---------+------------+----------------+-----------------+
- File:
- 表示主服务器当前正在使用的 Binary Log 文件名。
- 在主从复制中,它指明了从服务器将从哪个 binlog 文件开始复制。
- 它是
CHANGE MASTER TO语句的一个参数。
- Position:
- 表示下一个将被记录事件的 起始位置(偏移量)。
- 其值通常与当前 binlog 文件的大小相同。
- 在主从复制中,它指明了从服务器将从该 binlog 文件的哪个位置开始复制。
- 它是
CHANGE MASTER TO语句的一个参数。
- Binlog_Do_DB 和 Binlog_Ignore_DB:
- 是主服务器用于 过滤 写入 Binary Log 文件内容的选项。
- 默认值为空,表示主服务器不对写入 binlog 的操作进行任何过滤。
注: 若主机MySQL高于5.6,从机MySQL版本低于5.6
需要设置以下参数,因MySQL5.6以下版本没有此参数,所以得禁用
binlog_checksum = none # 禁用该参数
在Linux从机上配置需要复制的主机
配置从机
指定主服务器信息
# 实例
CHANGE MASTER TO MASTER_HOST='192.168.31.101', # 主机ip
MASTER_USER='root', # 主机账号
MASTER_PASSWORD='root', # 主机密码
MASTER_LOG_FILE='mysql-bin.000021', # 二进制文件
MASTER_LOG_POS=612; # 偏移量
启动从服务器复制功能
start slave;
查询是否配置成功
show slave status \G
下面两个参数都是Yes,则说明主从配置成功!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主机新建库、新建表、insert记录,从机复制
停止从服务复制功能
# 关闭从服务
stop slave;
# 重置从服务
reset slave;