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

本文简明介绍了使用 Docker 部署 MySQL 主从复制环境的核心步骤,包括容器运行、数据挂载、主从配置文件设置、复制用户创建及权限授权。通过 CHANGE MASTER TO 命令配置从库连接主库,并使用 START slave 启动同步。同时说明了如何查看复制状态、停止及重置复制,帮助开发者快速搭建高可用、可扩展的 MySQL 主从架构。
1
概述及原理

什么是主从复制?
主从复制(Master-Slave Replication)是 MySQL 提供的一种高可用性机制,主要用于实现数据冗余和读写分离。通过将写操作集中在主库、读操作分散到从库,可以有效减轻数据库的负载压力,提升系统的整体性能和访问速度。
- 主库(Master):负责处理所有的写操作(如 INSERT、UPDATE、DELETE)。这些操作会记录到主库的二进制日志(Binary Log,简称 binlog)中。
- 从库(Slave):主要用于处理读操作(如 SELECT),从而实现读写分离。
实现原理:
当主库执行事务并提交时,相关数据变更会被写入 binlog。从库通过一个 I/O 线程连接到主库,持续读取主库的 binlog 内容,并将其写入本地的中继日志(Relay Log)文件中。随后,从库的 SQL 线程会读取 Relay Log 中的事件,并在本地重放(Replay)这些操作,从而实现与主库数据的一致性。
2
查看docker版本







12345
查看是否安装docker,未安装请查看docker安装教程。
docker --version
使用docker拉取镜像
docker pull mysql:8.0.35
查看本地已下载的镜像
docker images
3
搭建主库




12
使用 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
参数说明(通俗易懂):
-d:让容器在后台运行。--name mysql-master1:给容器起个名字,叫mysql-master1,方便后续管理。-p 3307:3306:把宿主机(你的电脑)的 3307 端口 映射到容器内部的 3306 端口(MySQL 默认端口)。- → 之后你可以用
localhost:3307连接这个 MySQL 实例。 -v 宿主机路径:容器路径:挂载目录,实现数据持久化和配置外置(详见下方说明)。-e MYSQL_ROOT_PASSWORD=1234:设置 MySQL 的 root 用户密码为1234(必须设置,否则容器无法启动)。mysql:8.0.35:指定要运行的镜像名称和版本。
🔧 关于 -v 挂载的通俗解释:
Docker 容器默认是“用完就扔”的,一旦删除,里面的数据和配置就没了。
通过 -v 挂载,我们把容器里重要的东西“存到你电脑上”,实现:
/usr/local/mysql/master1/conf:/etc/mysql/conf.d- → 你电脑上的
conf文件夹,当作 MySQL 的配置目录。 - → 你可以在里面放
.cnf文件(比如开启 binlog、设置 server-id),MySQL 启动时会自动读取。 /usr/local/mysql/master1/data:/var/lib/mysql- → 数据库存储的数据(数据库、表、记录等)都保存在你电脑的
data文件夹里。 - → 即使容器删了,数据也不会丢!
/usr/local/mysql/master1/log:/var/log/mysql- → MySQL 的日志(如错误日志)会写到你电脑的
log文件夹中。 - → 出问题时,直接在电脑上查看日志,不用进容器。
进入 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
搭建从库




12
// 运行
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
创建用户






1234
// 创建一个用户 用户名为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
从库配置




12
// 设置主库配置
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
添加数据





123
// 创建数据库
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
qq空间
微博
复制链接
分享 更多相关项目
猜你喜欢
评论/提问(已发布 0 条)
0