MySQL GTID 主从复制与数据迁移
---
课程目标
- [ ] 理解基于 GTID 主从复制的优势
- [ ] 掌握基于 GTID 主从复制的搭建步骤
- [ ] 了解数据迁移基本概念
- [ ] 掌握数据库版本迁移(5.7 => 8.0)
课程目标逐词解释
GTID(Global Transaction Identifier,全局事务标识符):MySQL 5.6+ 引入的事务唯一标识机制,用一个全局唯一的 ID 来标记每个事务,取代传统基于 binlog 文件名+位置的复制方式。
优势(Advantage):好处、长处。
搭建步骤(Setup steps):从零开始配置 GTID 主从复制的具体操作流程。
数据迁移(Data Migration):将数据库的数据、结构从一个环境转移到另一个环境的过程。
版本迁移(Version Migration):将数据库从旧版本升级到新版本,如 MySQL 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 │ 事务序列号 │逐词解释
Global:全球的、全局的。表示这个 ID 在整个 MySQL 复制集群中都是唯一的。
Transaction:事务。数据库中一组不可分割的操作序列,要么全部成功,要么全部失败。
Identifier:标识符。用于唯一识别某个事物的编号。
GTID:Global Transaction Identifier 的缩写,即全局事务标识符。
source_id:来源标识。在 MySQL 中就是服务器的 server_uuid(全局唯一)。Source = 来源,ID = Identifier(标识符)。
transaction_id:事务序号。该服务器上事务的递增编号,从 1 开始。每执行一个事务(增、删、改),编号自动加 1。
server_uuid:服务器的唯一标识符,是一个 128 位的 UUID(Universally Unique Identifier,通用唯一标识符),在 MySQL 安装时自动生成,保存在 data/auto.cnf 文件中。UUID 格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(由 32 个十六进制数字和 4 个连字符组成)。
3E11FA47-71CA-11E1-9E33-C80AA9429562:这就是一个 server_uuid,由 5 组十六进制数字用连字符连接。
1-523:事务序号范围,表示从第 1 个事务到第 523 个事务。
事务标识符(Transaction Identifier):每执行一次事务操作(增、删、改),系统都会给其定义一个唯一编号(很长的字符串)。
GTID = 服务器ID + 事务ID:这个全局事务 ID 不仅仅在原始服务器上唯一,在所有存在主从关系的 MySQL 服务器上也是唯一的。
---
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 |
逐词逐行解释
定位方式(Positioning method):如何确定从哪个位置开始同步数据。
- 传统方式:使用
File + Position(文件名 + 位置偏移量)。例如mysql-bin.000123:456表示从mysql-bin.000123文件的第 456 字节处开始同步。
- GTID 方式:使用 GTID 标识。例如
xxx:1-523表示事务编号从 1 到 523。
主从切换(Master-Slave switchover / Failover):当主库故障时,将从库提升为新的主库。
- 传统方式:需要手动找到新主库的 binlog 位置,计算从库的位点差,容易出错。
- GTID 方式:从库自动计算需要同步哪些事务,
CHANGE MASTER TO配置更简单。
事务一致性(Transaction consistency):确保主从数据库中的事务执行结果一致。
- 传统方式:依赖人工判断执行到哪个位置。
- GTID 方式:自动跳过已经在从库执行过的事务,避免重复执行导致数据不一致。
并行复制(Parallel replication):从库同时执行多个事务,提高复制速度。
- 传统方式:配置复杂,通常只能按库(schema)级并行。
- GTID 方式:天然支持更细粒度的并行复制。
故障恢复(Disaster recovery):在系统故障后恢复正常运行。
- 传统方式:需要人工比对
position(位置),找出差异。
- GTID 方式:自动识别
retrieved_gtid_set(已获取的 GTID 集合)和executed_gtid_set(已执行的 GTID 集合),自动找出需要同步的事务。
retrieved_gtid_set:已获取的 GTID 集合,从服务器已经从主服务器下载的事务。
executed_gtid_set:已执行的 GTID 集合,从服务器已经执行完成的事务。
---
1.3 基于 GTID 复制详解
官网:https://dev.mysql.com/doc/refman/8.0/en/replication-gtids.html
逐词解释
事务(Transaction):增、删、改操作。在数据库中,一个事务是一组不可分割的操作,要么全部成功,要么全部失败。
事务标识符(Transaction Identifier):每执行一次事务操作(增、删、改),系统都会给其定义一个唯一编号(很长的字符串)。
GTID 是一个基于原始 MySQL 服务器生成的一个已经被成功执行的全局事务 ID。它由服务器 ID 以及事务 ID 组合而成。
- 原始 MySQL 服务器(Original MySQL server):产生这个事务的那台 MySQL 服务器,通常就是主库。
- 成功执行(Successfully executed):事务已经完成,没有报错。
GTID = 服务器ID + 事务ID
这个全局事务 ID 不仅仅在原始服务器上唯一,在所有存在主从关系的 MySQL 服务器上也是唯一的。
正是因为这样一个特性,使得 MySQL 的主从复制变得更加简单,以及数据库一致性更可靠:
- 一个 GTID 在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
- GTID 用来代替传统 AB 复制方法,不再使用
MASTER_LOG_FILE+MASTER_LOG_POS开启复制,而是使用MASTER_AUTO_POSITION=1的方式开始复制。
MASTER_AUTO_POSITION=1:告诉从服务器使用 GTID 自动定位功能,不需要手动指定 binlog 文件名和位置。Master = 主库,Auto = 自动,Position = 位置。
GTID 实现主从复制需要的条件
- master 主服务器:开启 binlog 二进制日志和指定唯一 server-id
- slave 从服务器:既要开启 relaylog 中继日志,也需要开启 binlog 二进制日志(获取 GTID 编号)和指定唯一 server-id
注意:传统复制中,从服务器可以不开启 binlog。但在 GTID 模式下,从服务器也必须开启 binlog,因为从服务器需要记录自己执行过的 GTID 信息。
GTID 的优势
- 更简单的实现故障转移,不用以前那样需要找位置点。
- 更简单的搭建主从复制。
- 比传统的 AB 复制更加安全。
- GTID 是连续的没有空洞的,保证数据的一致性,零丢失。
空洞(Gap / Hole):在事务序号中出现不连续的情况,比如 1、2、5(缺少 3、4)。GTID 保证事务序号连续,没有空洞。
---
1.4 GTID 工作原理(理解--背诵)
GTID:全局事务 ID 编号,server_uuid + 事务序号,单独 MySQL 服务器还是主从集群环境中,都是唯一的。
主库计算主库 GTID 集合和从库 GTID 集合的差集,主库推送差集 binlog 给从库。
详细流程
当从库设置完同步参数后,主库 A 的 GTID 集合记为集合 x,从库 B 的 GTID 集合记为 y。从库同步的逻辑如下:
① 从库 B 指定主库 A,基于主备协议建立连接(AB 服务器首先建立主从复制)。
- 主备协议(Master-Slave protocol):MySQL 主从复制使用的通信协议。
- 建立连接(Establish connection):从库和主库之间建立网络连接。
② 从库 B 把集合 y 发给主库 A。
- 集合 y:从库 B 已经执行过的 GTID 集合。
③ 主库 A 计算出集合 x 和集合 y 的差集,也就是集合 x 中存在,集合 y 中不存在的 GTID 集合。比如集合 x 是 1~100,集合 y 是 1~90,那么这个差集就是 91~100。这里会判断集合 x 是不是包含有集合 y 的所有 GTID,如果不是则说明主库 A 删除了从库 B 需要的 binlog,主库 A 直接返回错误。
- 差集(Difference / Set difference):两个集合中,一个有而另一个没有的元素。
- 差集就是 91~100:主库已经执行了 1~100,从库只执行了 1~90,所以需要同步 91~100。
- 返回错误:如果主库的 binlog 已经被清理,缺少从库需要的事务,主库会报错,提示从库需要重新做全量同步。
④ 主库 A 从自己的 binlog 文件里面,找到第一个不在集合 y 中的事务 GTID,也就是找到了 91。
⑤ 主库 A 从 GTID = 91 的事务开始,往后读 binlog 文件,按顺序取 binlog,然后发给 B。
⑥ 从库 B 的 IO 线程读取 binlog 文件生成 relay log,SQL 线程解析 relay log,然后执行 SQL 语句。
GTID 同步方案和位点同步方案的区别
- 位点同步方案:通过人工在从库上指定哪个位点,主库就发哪个位点,不做日志的完整性判断。Position = 位点(位置)。
- GTID 方案:通过主库来自动计算位点的,不需要人工去设置位点,对运维人员友好。
运维人员(Operations / Ops staff):负责系统维护、监控、故障处理的技术人员。Ops = Operations(运维)。
---
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(从) |
- 一主两从(One Master, Two Slaves):1 台主服务器 + 2 台从服务器的架构。
1.5.2 主机准备
① 配置 IP、主机名
② 配置 IP 与主机映射 => /etc/hosts
③ 关闭防火墙与 SELinux
④ 时间同步源设置
# 编辑 chrony 时间同步配置文件
# chrony = Chrony,一个网络时间协议(NTP)的实现,用于同步系统时间
# server = 指定时间服务器
# ntp1.aliyun.com:阿里云的 NTP 服务器
# iburst = initial burst(初始突发),快速同步时间
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命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
关键参数:
注意事项:
执行结果:
+------------------+--------------+
+------------------+--------------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+--------------+全量备份:
**关键参数:**
**注意事项:**
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
[client] socket=/tmp/mysql.sock user=root password=Aa123456.
[mysql] socket=/tmp/mysql.sock
**注意事项:**注意事项:
**启动服务:**
注意事项:
&5WvP.Kr+bo.
**注意事项:**
表结构解释:
│
▼
│
▼
│
▼
**参数解释:**
**实际执行:**
**注意事项:**注意事项:
**注意事项:**
[mysqld]
注意事项:
**注意事项:**
[mysqld]
注意事项:
**注意事项:**
注意事项:
**注意事项:**
**核心结果:**---
这类迁移可分为三种模式:
| 模式 | 说明 | 是否停机 |
|---|---|---|
| 离线迁移 | 停机后迁移 | 停机 |
| 在线迁移 | 不停机迁移 | 不停机 |
| 混合迁移 | 全量离线 + 增量在线 | 短暂停机 |
迁移要求一般有三点:
申请地址:https://free.aliyun.com/
操作步骤:
操作步骤:
操作步骤:
);
数据导入:
操作步骤:
数据导出:
操作步骤:
---
技能关键词解释:
关键词解释:
关键词解释:
个人职责:
关键词解释:
个人职责:
关键词解释: