MySQL GTID 主从复制与数据迁移

---

课程目标

课程目标逐词解释

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:456GTID(如 xxx:1-523
主从切换需手动计算 binlog 位置,易出错自动定位,CHANGE MASTER TO 更简单
事务一致性依赖人工判断执行点自动跳过已执行事务,避免重复
并行复制配置复杂,依赖库级并行天然支持并行
故障恢复需人工比对 position自动识别 retrieved_gtid_set / executed_gtid_set

逐词逐行解释

定位方式(Positioning method):如何确定从哪个位置开始同步数据。

主从切换(Master-Slave switchover / Failover):当主库故障时,将从库提升为新的主库。

事务一致性(Transaction consistency):确保主从数据库中的事务执行结果一致。

并行复制(Parallel replication):从库同时执行多个事务,提高复制速度。

故障恢复(Disaster recovery):在系统故障后恢复正常运行。

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 组合而成。

GTID = 服务器ID + 事务ID

这个全局事务 ID 不仅仅在原始服务器上唯一,在所有存在主从关系的 MySQL 服务器上也是唯一的。

正是因为这样一个特性,使得 MySQL 的主从复制变得更加简单,以及数据库一致性更可靠:

MASTER_AUTO_POSITION=1:告诉从服务器使用 GTID 自动定位功能,不需要手动指定 binlog 文件名和位置。Master = 主库,Auto = 自动,Position = 位置。

GTID 实现主从复制需要的条件

注意:传统复制中,从服务器可以不开启 binlog。但在 GTID 模式下,从服务器也必须开启 binlog,因为从服务器需要记录自己执行过的 GTID 信息。

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 服务器首先建立主从复制)。

② 从库 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 的 IO 线程读取 binlog 文件生成 relay log,SQL 线程解析 relay log,然后执行 SQL 语句。

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.213node1master(主)
192.168.50.214node2slave(从)
192.168.50.215node3slave(从)

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/

操作步骤:

操作步骤:

操作步骤:

);

数据导入:

操作步骤:

数据导出:

操作步骤:

---

技能关键词解释:

关键词解释:

关键词解释:

个人职责:

关键词解释:

个人职责:

关键词解释: