MySQL 主从复制(Replication)从零到精通:完整实战指南(含原理、配置)


后端不背锅
原创
发布时间: 2025-11-03 09:52:39 | 阅读数 0收藏数 0评论数 0
封面
本文简明介绍了使用 Docker 部署 MySQL 主从复制环境的核心步骤,包括容器运行、数据挂载、主从配置文件设置、复制用户创建及权限授权。通过 CHANGE MASTER TO 命令配置从库连接主库,并使用 START slave 启动同步。同时说明了如何查看复制状态、停止及重置复制,帮助开发者快速搭建高可用、可扩展的 MySQL 主从架构。
1

概述及原理

什么是主从复制?

主从复制(Master-Slave Replication)是 MySQL 提供的一种高可用性机制,主要用于实现数据冗余和读写分离。通过将写操作集中在主库、读操作分散到从库,可以有效减轻数据库的负载压力,提升系统的整体性能和访问速度。

  1. 主库(Master):负责处理所有的写操作(如 INSERT、UPDATE、DELETE)。这些操作会记录到主库的二进制日志(Binary Log,简称 binlog)中。
  2. 从库(Slave):主要用于处理读操作(如 SELECT),从而实现读写分离。

实现原理:

当主库执行事务并提交时,相关数据变更会被写入 binlog。从库通过一个 I/O 线程连接到主库,持续读取主库的 binlog 内容,并将其写入本地的中继日志(Relay Log)文件中。随后,从库的 SQL 线程会读取 Relay Log 中的事件,并在本地重放(Replay)这些操作,从而实现与主库数据的一致性。


2

查看docker版本

查看是否安装docker,未安装请查看docker安装教程。

docker --version


使用docker拉取镜像

docker pull mysql:8.0.35


查看本地已下载的镜像

docker images
3

搭建主库

使用 Docker 命令运行 MySQL 服务(主库示例)

docker run -d \
--name mysql-master1 \
-p 3307:3306 \
-v /usr/local/mysql/master1/conf:/etc/mysql/conf.d \
-v /usr/local/mysql/master1/data:/var/lib/mysql \
-v /usr/local/mysql/master1/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:8.0.35

参数说明(通俗易懂):

  1. -d:让容器在后台运行。
  2. --name mysql-master1:给容器起个名字,叫 mysql-master1,方便后续管理。
  3. -p 3307:3306:把宿主机(你的电脑)的 3307 端口 映射到容器内部的 3306 端口(MySQL 默认端口)。
  4. → 之后你可以用 localhost:3307 连接这个 MySQL 实例。
  5. -v 宿主机路径:容器路径挂载目录,实现数据持久化和配置外置(详见下方说明)。
  6. -e MYSQL_ROOT_PASSWORD=1234:设置 MySQL 的 root 用户密码为 1234必须设置,否则容器无法启动)。
  7. mysql:8.0.35:指定要运行的镜像名称和版本。

🔧 关于 -v 挂载的通俗解释:

Docker 容器默认是“用完就扔”的,一旦删除,里面的数据和配置就没了。

通过 -v 挂载,我们把容器里重要的东西“存到你电脑上”,实现:

  1. /usr/local/mysql/master1/conf:/etc/mysql/conf.d
  2. → 你电脑上的 conf 文件夹,当作 MySQL 的配置目录。
  3. → 你可以在里面放 .cnf 文件(比如开启 binlog、设置 server-id),MySQL 启动时会自动读取。
  4. /usr/local/mysql/master1/data:/var/lib/mysql
  5. → 数据库存储的数据(数据库、表、记录等)都保存在你电脑的 data 文件夹里。
  6. → 即使容器删了,数据也不会丢!
  7. /usr/local/mysql/master1/log:/var/log/mysql
  8. → MySQL 的日志(如错误日志)会写到你电脑的 log 文件夹中。
  9. → 出问题时,直接在电脑上查看日志,不用进容器。

进入 MySQL 容器并连接数据库

docker exec -it mysql-master1 mysql -uroot -p
4

创建主库配置文件

// 创建my.cnf文件
vim /usr/local/mysql/master1/conf/my.cnf


// 以下内容写入文件
[mysqld] # 下面是 MySQL 服务的配置
server-id=1 # 给这台 MySQL 起个唯一编号(主库用 1)
read-only=0 # 允许写数据(0 = 可读可写,1= 只读,主库必须能写)
binlog-format=ROW # 记录数据变更的方式:按“行”记录,
log-bin=mysql-bin # 开启 binlog(主从复制必须开!日志文件叫 mysql-bin.xxx)
5

搭建从库

// 运行
docker run -d \
> --name mysql-salve \
> -p 3307:3306 \
> -v /usr/local/mysql/salve/conf:/etc/mysql/conf.d \
> -v /usr/local/mysql/salve/data:/var/lib/mysql \
> -v /usr/local/mysql/salve/log:/var/log/mysql \
> -e MYSQL_ROOT_PASSWORD=1234 \
> mysql:8.0.35

// 进入mysql容器
docker exec it mysql-salve mysql -uroot -p
6

创建从库文件

// 创建从库的配置文件
vim /usr/loca/mysql/salve/conf/my.cnf

// 写入以下内容
[mysqld]
server-id=2 # mysql服务唯一编号,不能和主库一样(主库是1,所以从库设成2)
read-only=1 # 设为只读,防止有人误操作直接改从库的数据
relay-log=mysql-relay-bin # 开启中继日志,用来临时存主库传过来的同步操作
7

创建用户

// 创建一个用户 用户名为hml %:表示任意主机都可以连接,密码是8888
create user 'hml'@'%' IDENTIFIED BY '8888';

// 给刚刚创建的用户复制从库的权限
GRANT REPLICATION SLAVE ON *.* TO 'hml'@'%';

// 修改用户密码认证方式
ALTER USER 'hml'@'%' IDENTIFIED WITH mysql_native_password BY '8888';

// 重新加载
FLUSH PRIVILEGES;

// 查看当前主库binglog文件名和位置,用户配置从库开始同步的位置
show master status;
8

从库配置

// 设置主库配置
CHANGE MASTER TO
MASTER_HOST='117.72.102.85',
MASTER_PORT=3307,
MASTER_USER='hml',
MASTER_PASSWORD='8888',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=687;

// 开启同步操作
start slave;
9

查看主从状态

// 查看从库状态,检查主从复制是否正常运行
// 主要观察两个字段
// Slave_IO_running:YES
// Slave_SQL_running:YES
show slave status\G;

// 停止主从同步
STOP REPLICA;

// 重置主从配置(清除所有主从关系)
RESET REPLICA ALL;


10

添加数据

// 创建数据库
create database test;

// 切换到test
use test;

// 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

// 插入内容
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');

// 查询用户表
select * from users;

// 切换到从库终端
// 列出数据库
show databases;

//使用test数据库
use test;

// 查询用户表
select * from users;
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报