08_主从架构与数据迁移实战

一、基于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 │  事务序列号  │

注意事项:

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

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的优势

1.4 GTID工作原理(理解--背诵)

GTID:全局事务ID编号,server_uuid + 事务序号,单独MySQL服务器还是主从集群环境中,都是唯一的。

主库计算主库 GTID 集合和从库 GTID 的集合的差集,主库推送差集 binlog 给从库。

当从库设置完同步参数后,主库 A 的 GTID 集合记为集合 x,从库 B 的 GTID 集合记为 y。从库同步的逻辑如下:

image

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

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个版本切换





常见的升级方案有


主从切换是推荐重点掌握的。

![](/assets/feishu-images/3ba967b3544cea7d2a07c839.png)

推荐采用「**全量(逻辑|物理)备份 + 实时同步 + 切换校验**」三步骤方案。


| **序号** | **主机名** | **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/


![](/assets/feishu-images/0f429192cea32deacb968c1c.png)

![](/assets/feishu-images/a3dafe438b790f68e68d4b31.png)

说明
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 端口映射解释。 |

**注意事项:**