MySQL主从复制的配置方式

概念原理

主从复制(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';
相关推荐
7ioik2 小时前
Explain关键字?
android
前进的李工3 小时前
SQL聚合函数与分组查询详解
数据库·sql·mysql
Evan10244 小时前
MySQL 8.4.7版本下载&安装详细教程(Win11环境)
mysql
2301_800050995 小时前
mysql
数据库·笔记·mysql
liang_jy5 小时前
Android 事件分发机制(二)—— 点击事件透传
android·面试·源码
圆号本昊7 小时前
Flutter Android Live2D 2026 实战:模型加载 + 集成渲染 + 显示全流程 + 10 个核心坑( OpenGL )
android·flutter·live2d
lkbhua莱克瓦247 小时前
基础-函数
开发语言·数据库·笔记·sql·mysql·函数
今天有个Bug8 小时前
【计算机毕业设计】流浪动物救助平台 - SpringBoot+Vue
sql·mysql·spring·vue·毕业设计·课程设计