概念原理
主从复制(Master-Slave Replication)
主从复制是一种常见的高可用、读写分离和数据备份方案。它通过将主库(Master)上的数据变更同步到一个或多个从库(Slave)来实现数据冗余和负载均衡。
复制模式
行模式:只记录哪个数据被修改,修改成什么样,数据一致性高,兼容所有 SQL,但是binlog 体积大
语句模式:将执行的 SQL 语句 记录下来,binlog 体积小,但是某些非确定性函数(如 NOW(), RAND(), UUID())在主从上结果可能不同,导致数据不一致
配置过程
一、环境准备
- 主库(Master) :IP 为
192.168.1.10 - 从库(Slave) :IP 为
192.168.1.11 - 两台服务器都安装了相同版本的 MySQL(本文基于Mysql8.0 )
二、主库配置
2.1修改配置文件
找到my.ini配置文件
位置:手动配置在bin目录下,自动安装的(使用msi按照)在C:\ProgramData\MySQL\MySQL Server 中
ProgramData为隐藏文件夹

增加/修改如下配置
ini
[mysqld]
# 唯一服务器 ID
server-id = 1
# 开启 binlog(必须)
log-bin="MYSQL-bin"
log-error="MYSQL.err"
# 启用 GTID 模式
gtid_mode = ON
enforce_gtid_consistency = ON
# 推荐设置(MySQL 8 默认已开启)
binlog_format = ROW
# 可选:指定需要同步的数据库(如不指定则同步全部)
# binlog_do_db = your_db_name
注意事项:
(1)所有配置都在[mysqld] 这个标签下面,配置文件应该已经有[mysqld] ,不需要另外写
(2)log-bin和log-error配置先找找配置文件中有没有,没有再配置
(3)下面同步部分的配置,要现在原来配置文件中先查找是否已经配置项,有就修改,没有就添加
配置文件改错会导致无法启动

2.2重启服务
配置完成之后重启服务,通过服务中直接停止再启动,或者cmd命令行(管理员模式)
2.3创建用于复制的用户
执行下面脚本,创建一个用于用户复制的账号 (用户名:copyer,密码:12345678按需修改)
SQL
-- 创建用户(如不存在)
CREATE USER 'copyer'@'%' IDENTIFIED WITH IDENTIFIED BY '12345678';
#早期版本使用mysql_native_password认证方式
# CREATE USER 'copyer'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
-- 授权
GRANT REPLICATION SLAVE ON *.* TO 'copyer'@'%';
-- 刷新
FLUSH PRIVILEGES;
-- 验证
SELECT user, host, plugin FROM mysql.user WHERE user = 'copyer';
三、从库配置
3.1 修改配置文件信息
修改配置文件,在从库电脑上配置mysql配置文件,内如如下,方法和注意事项同主库
Ini
[mysqld]
server-id = 2 # 必须与主库不同,且在整个复制拓扑中唯一
# 启用 GTID
gtid_mode = ON
enforce_gtid_consistency = ON
# 推荐设置
binlog_format = ROW
log-bin = mysql-bin # 从库也建议开启 binlog,便于级联复制或切换为主库
3.2重启服务
配置完成之后重启服务,主库和从库配置完成都要重启服务,通过服务中直接停止再启动,或者cmd命令行(管理员模式)
3.3 创建同步通道
执行一下脚本创建通道channel_line1用于同步,配置中的信息都是主库的ip和端口,然后启动同步通道
SQL
-- 1. 停止通道(不存在就不需要执行这一步)
# STOP SLAVE FOR CHANNEL 'channel_line1';
-- 彻底清除该通道的所有复制信息(包括 GTID 状态)
-- RESET SLAVE ALL FOR CHANNEL 'channel_line1';
-- 为主库A配置通道,并只同步 line1_db
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_PORT=3306,
MASTER_USER='copyer',
MASTER_PASSWORD='12345678',
SOURCE_AUTO_POSITION=1 # GTID自动定位
FOR CHANNEL 'channel_line1';
-- 3. 启动通道
START SLAVE FOR CHANNEL 'channel_line1';
四、同步
配置完成之后,只要对应的数据库有变化,会自动同步
该功能只能实现配置之后的数据同步,配置之前如果已经有数据了,需要手动进行一次同步
补充
额外的配置
1.指定同步的数据库或表
如果不指定,就是所有数据库表都同步,指定了之后只会同步指定的数据库表
Ini
[mysqld]
# 同步库表(根据不同数据库配置)
# 数据库名
replicate-wild-do-table = xxdatabse
# 数据库名.表名
replicate-wild-do-table = xxdatabse.xxtable
2.过滤指定库
使用replicate-ignore-db过滤不需要同步的数据库
Ini
[mysqld]
# 过滤配置
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = performance_schema
replicate-ignore-db = information_schema
补充脚本
查看通道状态
SQL
SHOW SLAVE STATUS FOR CHANNEL 'channel_line1';
通道重启
SQL
-- 1. 停止通道(不存在就不需要执行这一步)
STOP SLAVE FOR CHANNEL 'channel_line1';
-- 2. 启动通道
START SLAVE FOR CHANNEL 'channel_line1';