08_主从架构与数据迁移实战
课程目标
- [ ] 理解基于 GTID 主从复制的优势
- [ ] 掌握基于 GTID 主从复制的搭建步骤
- [ ] 了解数据迁移基本概念
- [ ] 掌握数据库版本迁移(5.7 => 8.0)
---
一、基于GTID主从复制
1.1 什么是 GTID?
GTID(Global Transaction Identifier,全局事务标识符) 是 MySQL 5.6+ 引入的事务唯一标识机制,在 MySQL 8.0 中已成为默认且推荐的复制模式。
GTID 格式:source_id:transaction_id
示例: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-523
├─────────────┬─────────────┤
│ 服务器UUID │ 事务序列号 │注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
1.2 传统复制 vs GTID 复制
| 对比项 | 传统基于 binlog 位置 | 基于 GTID 复制 |
|---|---|---|
| 定位方式 | File + Position(如 mysql-bin.000123:456) | GTID(如 xxx:1-523) |
| 主从切换 | 需手动计算 binlog 位置,易出错 | 自动定位,CHANGE MASTER TO 更简单 |
| 事务一致性 | 依赖人工判断执行点 | 自动跳过已执行事务,避免重复 |
| 并行复制 | 配置复杂,依赖库级并行 | 天然支持并行 |
| 故障恢复 | 需人工比对 position | 自动识别 retrieved_gtid_set / executed_gtid_set |
1.3 基于全局事务标识符(GTID)复制
官网:https://dev.mysql.com/doc/refman/8.0/en/replication-gtids.html
事务:增、删、改操作
事务标识符:每执行一次事务操作(增、删、改),系统都会给其定义一个唯一编号(很长的字符串)。
GTID是一个基于原始MySQL服务器生成的一个已经被成功执行的全局事务ID。它由服务器ID以及事务ID组合而成。
GTID = 服务器ID + 事务ID
这个全局事务ID不仅仅在原始服务器上唯一,在所有存在主从关系的MySQL服务器上也是唯一的。
正是因为这样一个特性,使得MySQL的主从复制变得更加简单,以及数据库一致性更可靠。
- 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
- GTID用来代替传统AB复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
GTID实现主从复制需要:
- master主服务器:开启binlog二进制日志和指定唯一server-id
- slave从服务器:既要开启relaylog中继日志,也需要开启binlog二进制日志(获取GTID编号)和指定唯一server-id
GTID的优势
- 更简单的实现故障转移,不用以前那样在需要找位置点。
- 更简单的搭建主从复制。
- 比传统的AB复制更加安全。
- GTID 是连续的没有空洞的,保证数据的一致性,零丢失。
1.4 GTID工作原理(理解--背诵)
GTID:全局事务ID编号,server_uuid + 事务序号,单独MySQL服务器还是主从集群环境中,都是唯一的。
主库计算主库 GTID 集合和从库 GTID 的集合的差集,主库推送差集 binlog 给从库。
当从库设置完同步参数后,主库 A 的 GTID 集合记为集合 x,从库 B 的 GTID 集合记为 y。从库同步的逻辑如下:

- 从库 B 指定主库 A,基于主备协议建立连接(AB服务器首先建立主从复制)。
- 从库 B 把集合 y 发给主库 A。
- 主库 A 计算出集合 x 和集合 y 的差集,也就是集合 x 中存在,集合 y 中不存在的 GTID 集合。比如集合 x 是 1\~100,集合 y 是 1\~90,那么这个差集就是 91\~100。这里会判断集合 x 是不是包含有集合 y 的所有 GTID,如果不是则说明主库 A 删除了从库 B 需要的 binlog,主库 A 直接返回错误。
- 主库 A 从自己的 binlog 文件里面,找到第一个不在集合 y 中的事务 GTID,也就是找到了 91。
- 主库 A 从 GTID = 91 的事务开始,往后读 binlog 文件,按顺序取 binlog,然后发给 B。
- 从库 B 的 I/O 线程读取 binlog 文件生成 relay log,SQL 线程解析 relay log,然后执行 SQL 语句。
GTID 同步方案和位点同步的方案区别是:
- 位点同步方案是通过人工在从库上指定哪个位点,主库就发哪个位点,不做日志的完整性判断。
- 而 GTID 方案是通过主库来自动计算位点的,不需要人工去设置位点,对运维人员友好。
1.5 GTID的配置与实现
文档:https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-howto.html
1.5.1 环境说明
基于GTID的一主两从架构
| IP | 主机名 | 角色 |
|---|---|---|
| 192.168.50.213 | node1 | master(主) |
| 192.168.50.214 | node2 | slave(从) |
| 192.168.50.215 | node3 | slave(从) |

1.5.2 主机准备
① 配置IP、主机名
② 配置IP与主机映射 => /etc/hosts
③ 关闭防火墙与SELinux
④ 时间同步源设置
[root@node1 /root]# vi /etc/chrony.conf
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
server ntp6.aliyun.com iburst命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
关键参数:
| 参数 | 说明 | |
|---|---|---|
/etc/chrony.conf | 普通 | 配置文件路径,命令会读取这个文件里的配置。 |
注意事项:
master(1台)和slave(2台):安装mysql并进行初始化
master主机(1台)
slave主机(2台)
开启gtid,全局事务机制
[mysqld]
server-id=1
gtid_mode=on enforce_gtid_consistency=on log-replica-updates=1
**注意事项:**
[mysqld]
relay-log=/usr/local/mysql/data/relaylog
server-id=2
gtid_mode=on
enforce_gtid_consistency=on
log-replica-updates=1
read-only=on 注意事项:
**关键参数:**
| 参数 | 说明 |
|---|---|
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+--------------+
**关键参数:**
| 参数 | 说明 |
|---|---|
| **类型** | **说明** | **示例** |
|---|---|---|
| **同构迁移** | 同类型数据库版本升级 | MySQL 5.7 → 8.0 |
| **异构迁移** | 不同数据库之间迁移 | MySQL → DM8 / MySQL → Oracle |
| **云迁移** | 从本地机房IDC迁往云平台 | 自建机房 → 阿里云 / 华为云 |
| **阶段** | **核心目标** | **关键活动/工具** |
|---|---|---|
| **评估与准备** | 明确迁移范围、风险、方案与回滚计划。 | 源库分析、方案设计、备份验证。 |
| **迁移与同步** | 完成结构迁移 (Schema Migration)、全量数据迁移 (Full Load) 与持续的增量同步 (CDC / Incremental Sync)。 | 结构导出导入工具、CDC工具、数据校验。 |
| **切换与验证** | 实现业务切换 (Business Cut-over),并验证数据一致性与功能可用性。 | 应用连接切换、数据对比验证、回滚脚本。 |
同构迁移,通常又可以被称为是版本升级。
迁移的版本差不要过大,一些多为1个版本切换
常见的升级方案有
主从切换是推荐重点掌握的。

推荐采用「**全量(逻辑|物理)备份 + 实时同步 + 切换校验**」三步骤方案。
| **序号** | **主机名** | **IP地址** | **mysql版本** |
|---|---|---|---|
| 1 | node1 | 192.168.50.213 | mysql5.7 |
| 2 | node2 | 192.168.50.214 | mysql8.0.x |
mysql8-node2中安装mysql8
下载地址:https://dev.mysql.com/downloads/mysql/
https://downloads.mysql.com/archives/community/


说明
VERSION="9"
mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
[Unit]
After=network.target
After=syslog.target
[Service]
Type=forking
User=mysql
Group=mysql
PIDFile=/usr/local/mysql/data/mysqld.pid
TimeoutStartSec=300
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
PrivateTmp=true
WorkingDirectory=/usr/local/mysql
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mysqld
[Install]
WantedBy=multi-user.target
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
pid-file=/usr/local/mysql/mysqld.pid
port=3306
#log-error=/usr/local/mysql/error.log
[client]
socket=/tmp/mysql.sock
user=root
password=Aa123456.
[mysql]
socket=/tmp/mysql.sock
注意事项:
&5WvP.Kr+bo.
...
**命令拆解:**
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `-p` | 【核心】 | `-p` 的含义取决于当前命令,不能直接套用 Docker 端口映射解释。 |
**注意事项:**
│ ▼ │ ▼ │ ▼
备注:导出指定的数据库,而不是全库所有都导出,而指导出指定的业务数据库.
注意事项:
**命令拆解:**
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `-p` | 【核心】 | `-p` 的含义取决于当前命令,不能直接套用 Docker 端口映射解释。 |
**注意事项:**
检查数据库、数据表以及数据结构
检查数据量一致
其中包含:
修改表定义:或者临时放宽模式导入:
**命令拆解:**
| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `-p` | 【核心】 | `-p` 的含义取决于当前命令,不能直接套用 Docker 端口映射解释。 |
**注意事项:**
本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。