![如何在故障转移期间将 MySQL 副本提升为主副本](https://linux22.com/image/1194377/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB%E6%9C%9F%E9%97%B4%E5%B0%86%20MySQL%20%E5%89%AF%E6%9C%AC%E6%8F%90%E5%8D%87%E4%B8%BA%E4%B8%BB%E5%89%AF%E6%9C%AC.png)
在测试环境中,我停止了健康的 MySQL 主服务器来模拟故障,并尝试将副本服务器提升为主服务器。
两台服务器:
- 在 Ubuntu kinetic 上安装 mysql-server 8.0.32-0ubuntu0.22.10.2 运行。
- 配置了 GTID
- 除 server-id 外,具有完全相同的 MySQL 配置
继官方文档, 我已经:
禁用所有负载均衡器上发生故障的主服务器
等待主服务器完成所有事务:
源已将所有 binlog 发送到副本;正在等待更多更新
将主服务器设置为超级 R/O
作为预防措施,从发生故障的主服务器转储所有 InnoDB 数据库
停止副本的 IO_THREAD
等待副本完成所有事务:
Replica_SQL_Running_State:副本已读取所有中继日志;正在等待更多更新
停止了副本的 SQL_THREAD
重置副本的 GTID 执行历史记录和二进制日志
但是,现在出现故障的主服务器和新的主服务器之间存在差异:
- 主服务器状态失败:
+---------------+----------+--------------+------------------+---------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+---------------------------------------------+
| binlog.000073 | 197 | | | c219365c-bd04-11ed-b1e2-525400003001:1-4620 |
+---------------+----------+--------------+------------------+---------------------------------------------+
- 新的主要服务器状态:
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 157 | | | |
+---------------+----------+--------------+------------------+-------------------+
我们可以看到位置不同,并且新的主节点没有“Executed_Gtid_Set”。要么是我漏掉了什么,要么是文档不完整。
有什么建议吗?
答案1
事实证明,问题在于官方文档:
On the replica Replica 1 being promoted to become the source, issue STOP REPLICA and RESET MASTER.
应改为:
On the replica Replica 1 being promoted to become the source, issue STOP REPLICA and RESET REPLICA ALL.
我从头重新创建了两个 MySQL 服务器,并应用了第一篇文章中的 7 个步骤,并将第 8 个步骤替换为:
- 使用“RESET REPLICA ALL”重置副本;
在切换之前的主服务器上:
+---------------+----------+--------------+------------------+---------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+---------------------------------------------+
| binlog.000010 | 1380513 | | | a4228b68-e5b8-11ed-ac40-525400003001:1-1615 |
+---------------+----------+--------------+------------------+---------------------------------------------+
在切换后的新主节点(以前的副本)上:
+---------------+----------+--------------+------------------+-----------------------------------------------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-----------------------------------------------------------------------------------------+
| binlog.000010 | 6841 | | | 61ab9e32-e5b9-11ed-b4aa-525400003002:1-511,
a4228b68-e5b8-11ed-ac40-525400003001:1-1615 |
+---------------+----------+--------------+------------------+-----------------------------------------------------------------------------------------+
看上去不错,除了位置可能有问题也可能没有问题。