文章

MySQL主从复制

MySQL主从复制是将来自一个MySQL数据库实例(Master)的数据复制到一个或者多个MySQL数据库实例(Slave)。主从复制是MySQL的核心功能,使用主从复制可以完成MySQL的数据同步,备份,高可用,迁移等工作。整个MySQL主从复制操作主要由3个线程完成。一个线程(dump线程)在Master节点上,SQL线程和 I/O线程在 Salve 节点上。Slave节点执行 change master to 连接上 Master 节点,连接上Master 节点后,发送Binlog 的位点信息。_两个数据库怎么做主从复制

MySQL主从复制

文章信息

  • 原文链接:https://jiayq.blog.csdn.net/article/details/146117935
  • 发布时间:2025-03-08 16:13:16
  • 阅读量:1
  • 分类:mysql专栏收录该内容, 订阅专栏
  • 标签:#mysql, #数据库, #主从复制, #Master-Slave, #Master, #Slave

摘要

文章浏览阅读1.3k次,点赞33次,收藏30次。MySQL主从复制是将来自一个MySQL数据库实例(Master)的数据复制到一个或者多个MySQL数据库实例(Slave)。主从复制是MySQL的核心功能,使用主从复制可以完成MySQL的数据同步,备份,高可用,迁移等工作。整个MySQL主从复制操作主要由3个线程完成。一个线程(dump线程)在Master节点上,SQL线程和 I/O线程在 Salve 节点上。Slave节点执行 change master to 连接上 Master 节点,连接上Master 节点后,发送Binlog 的位点信息。_两个数据库怎么做主从复制


MySQL主从复制

  • 介绍
  • 主从复制的搭建
  • 数据库准备
  • 开启 Binlog
  • 创建主从复制的用户
  • 查看位点信息
  • Slave 连接
  • 开启主从复制

MySQL主从复制:https://blog.csdn.net/a18792721831/article/details/146117935
MySQL Binlog:https://blog.csdn.net/a18792721831/article/details/146606305
MySQL General Log:https://blog.csdn.net/a18792721831/article/details/146607343
MySQL Slow Log:https://blog.csdn.net/a18792721831/article/details/147166971
MySQL Error Log:https://blog.csdn.net/a18792721831/article/details/147167038
MySQL Redo Log: https://blog.csdn.net/a18792721831/article/details/149862528
MySQL Undo Log: https://blog.csdn.net/a18792721831/article/details/149880355

介绍

MySQL主从复制是将来自一个MySQL数据库实例(Master)的数据复制到一个或者多个MySQL数据库实例(Slave)。

主从复制是MySQL的核心功能,使用主从复制可以完成MySQL的数据同步,备份,高可用,迁移等工作。

整个MySQL主从复制操作主要由3个线程完成。一个线程(dump线程)在Master节点上,SQL线程和 I/O线程在 Salve 节点上。

image-20250307165146334

主从复制的过程大致如下:

  1. Slave节点执行 change master to 连接上 Master 节点,连接上Master 节点后,发送Binlog 的位点信息。
  2. Slave 节点的 I/O 线程和 Master 节点的 dump 线程建立连接。
  3. Slave 节点的 I/O 线程向 Master 节点发起 Binlog 的请求。
  4. Master 节点的 dump 线程根据 Slave 节点的请求,将本地 Binlog 以 events 的方式发送给 Slave 节点的 I/O 线程。
  5. Slave 节点的 SQL 线程应用 RelayLog ,并且把应用过的日志记录到 relay-log.info 中,在默认情况下,已经应用过的 RelayLog 会自动被清理掉。

主从复制的搭建

尝试手动搭建一下主从复制

数据库准备

创建数据库需要挂载的目录

image-20250307180302239

创建mysql配置文件my.cnf

master

1
2
[mysqld]
server_id=100

slave

1
2
[mysqld]
server_id=101

需要保证 my.cnf 的文件权限是 644,权限过大,mysql会忽略配置文件

首先使用docker 启动两个mysql实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker run \
--name master \
-e MYSQL_ROOT_PASSWORD=master \
-v /data/mysql/master/log:/var/log/mysql \
-v /data/mysql/master/data:/var/lib/mysql \
-v /data/mysql/master/conf:/etc/mysql/conf.d \
-p 3106:3306 \
-d \
mysql:8.0 



docker run \
--name slave \
-e MYSQL_ROOT_PASSWORD=slave \
-v /data/mysql/slave/log:/var/log/mysql \
-v /data/mysql/slave/data:/var/lib/mysql \
-v /data/mysql/slave/conf:/etc/mysql/conf.d \
-p 3107:3306 \
-d \
mysql:8.0 

image-20250307174511180

不要使用最新的,坑多~

使用客户端进行连接

image-20250307183748731

开启 Binlog

增加目录

image-20250308092110936

在配置文件中配置binlog的目录

image-20250308150342582

修改启动命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker run \
--name master \
-e MYSQL_ROOT_PASSWORD=master \
-v /data/mysql/master/log:/var/log/mysql \
-v /data/mysql/master/data:/var/lib/mysql \
-v /data/mysql/master/conf:/etc/mysql/conf.d \
-v /data/mysql/master/binlog:/var/lib/mysql-bin \
-p 3106:3306 \
-d \
mysql:8.0 



docker run \
--name slave \
-e MYSQL_ROOT_PASSWORD=slave \
-v /data/mysql/slave/log:/var/log/mysql \
-v /data/mysql/slave/data:/var/lib/mysql \
-v /data/mysql/slave/conf:/etc/mysql/conf.d \
-v /data/mysql/slave/binlog:/var/lib/mysql-bin \
-p 3107:3306 \
-d \
mysql:8.0 

重启

记得使用 chmod -R 777 ./* 进行授权,否则会出现 Permission denied 的异常,导致docker 容器启动失败

my.cnf 必须是 644

image-20250308132624590

创建主从复制的用户

在Master节点上创建用户,授予 replication slave 权限。

1
2
3
4
5
6
7
8
-- 创建用户
create user 'rep'@'%' identified by 'mspswd';
-- 授权
grant replication slave on *.* to 'rep'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 验证
SHOW GRANTS FOR 'rep'@'%';

image-20250308132657550

image-20250308151013657

查看位点信息

在Master 节点上查看开始同步的位点信息。执行 show master status 命令,查看开始同步的位点信息:

image-20250308151050292

Slave 连接

在Slave节点初始化 Slave节点,并连接到Master

1
2
3
4
5
6
7
change master to
master_host='',
master_port=,
master_user='',
master_password='',
master_log_file='',
master_log_pos=;

image-20250308151240319

开启主从复制

Slave节点执行 start slave 开启同步复制,并使用 show slave status查看同步状态。

image-20250308155052413

查看同步状态

image-20250308160056037

发现有报错,使用 replication user 连不上 master

image-20250308140839448

解决方案一:

在master执行:

1
2
3
4
5
-- 修改复制用户的认证方式
ALTER USER 'rep'@'%' 
IDENTIFIED WITH mysql_native_password BY 'mspswd';
-- 刷新权限
FLUSH PRIVILEGES;

但是该方案不生效,因为在 8.0 中, mysql_native_password 是被禁用的

image-20250308141943706

需要启用该插件,Master启用即可

启用插件:

首先修改配置文件(配置文件不生效是因为权限过大,必须是644):

image-20250308142211570

使用

1
2
3
SELECT plugin_name, plugin_status, plugin_type 
FROM information_schema.plugins 
WHERE plugin_name = 'mysql_native_password';

验证是否生效

image-20250308160233386

Slave 节点执行 start slave 命令开启同步复制,并使用 show slave status 命令查看同步状态。

需要重点关注Slave_IO_RunningSlave_SQL_Running,其中 Slave_IO_Running 表示 Slave 节点是否能够正常从Master节点同步数据;Slave_SQL_Running表示回放RelayLog 文件中的 Binlog 时是否正常。

image-20250308160717577

Slave_IO_Running=YESSlave_SQL_Running=YES 表示成功的建立了主从复制。

Master节点的位点

image-20250308161006896

Slave的同步位点

image-20250308161034351

本文由作者按照 CC BY 4.0 进行授权