MySQL GTID 主从复制与数据迁移
一、基于 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 │ 事务序列号 │- source_id:MySQL 服务器的 server_uuid(全局唯一)
- transaction_id:该服务器上事务的递增序号(从 1 开始)
- GTID = 服务器ID + 事务ID,在整个主从集群中都是唯一的
1.2 传统复制 vs GTID 复制
| 对比项 | 传统基于 binlog 位置 | 基于 GTID 复制 |
|---|---|---|
| 定位方式 | File + Position | GTID |
| 主从切换 | 需手动计算位置,易出错 | 自动定位,更简单 |
| 事务一致性 | 依赖人工判断 | 自动跳过已执行事务 |
| 并行复制 | 配置复杂 | 天然支持并行 |
| 故障恢复 | 需人工比对 position | 自动识别 GTID 集合 |
1.3 GTID 核心特性
- 一个 GTID 在一个服务器上只执行一次,避免重复执行
- 使用
MASTER_AUTO_POSITION=1代替传统的MASTER_LOG_FILE + MASTER_LOG_POS
- master:开启 binlog + 唯一 server-id
- slave:开启 relaylog + 开启 binlog(获取 GTID)+ 唯一 server-id
GTID 的优势:
- 故障转移更简单
- 搭建主从复制更简单
- 比传统 AB 复制更安全
- GTID 连续无空洞,保证数据一致性
1.4 GTID 工作原理(背诵)
核心:主库计算 GTID 差集,推送差集 binlog 给从库。
流程:
① 从库 B 指定主库 A,建立连接
② 从库 B 把自己的 GTID 集合 y 发给主库 A
③ 主库 A 计算差集(x 中有但 y 中没有的 GTID),如 x=1~100,y=1~90,差集=91~100
④ 主库 A 找到第一个不在 y 中的事务 GTID(91)
⑤ 从 GTID=91 开始按顺序取 binlog 发给 B
⑥ 从库 IO 线程生成 relay log,SQL 线程解析并执行
GTID vs 位点同步区别: 位点同步需人工指定位置;GTID 由主库自动计算,对运维更友好。
1.5 GTID 配置与实现
1.5.1 环境(一主两从)
| IP | 主机名 | 角色 |
|---|---|---|
| 192.168.50.213 | node1 | master |
| 192.168.50.214 | node2 | slave |
| 192.168.50.215 | node3 | slave |
1.5.2 主机准备
# 时间同步
vi /etc/chrony.conf
# 添加阿里云 NTP 服务器
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
# 其他准备:配置IP/主机名、/etc/hosts、关闭防火墙和SELinux、安装rsync命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
关键参数:
**注意事项:**
注意事项:
| 模式 | 说明 | 是否停机 |
|---|---|---|
| 离线迁移 | 停机后迁移 | 停机 |
| 在线迁移 | 不停机迁移 | 不停机 |
| 混合迁移 | 全量离线 + 增量在线 | 短暂停机 |
**相关特性:**
**案例:创建表并插入数据**
);职责:
职责: