MySQL5.7配置Pseudo-GTID完整步骤

 更新时间:2026年03月17日 08:25:27   作者:学亮编程手记  
本文主要介绍了MySQL5.7配置Pseudo-GTID完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、Pseudo-GTID 原理解析

在开始配置之前,先简单理解 Pseudo-GTID 的工作原理:

  1. 定期注入唯一标记:在 MySQL 的 binlog 中定期插入一个全局唯一的 SQL 语句
  2. 作为定位锚点:这些标记成为 binlog 中的"坐标点",Orchestrator 可以通过它们快速定位数据同步位置
  3. 无需开启 GTID:在传统复制模式下,也能实现类似 GTID 的自动定位能力

二、配置步骤详解

2.1 第一步:创建元数据库(所有节点)

首先在每个 MySQL 实例上创建用于存放伪 GTID 相关对象的数据库:

-- 登录 MySQL(所有节点:192.168.56.80、61、60)
mysql -uroot -p

-- 创建 meta 数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS meta;

2.2 第二步:创建 Pseudo-GTID 事件(所有节点)

这是最核心的步骤,需要创建一个定时事件来定期注入伪 GTID 标记:

-- 切换到 meta 数据库
USE meta;

-- 确保事件调度器已开启
SET GLOBAL event_scheduler = ON;

-- 创建伪 GTID 注入事件
DELIMITER $$

CREATE EVENT IF NOT EXISTS create_pseudo_gtid_event
ON SCHEDULE EVERY 10 SECOND
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
ENABLED
COMMENT 'Inject Pseudo-GTID markers for Orchestrator'
DO
BEGIN
    DECLARE lock_result INT;
    
    -- 获取锁,确保同一时间只有一个会话执行注入
    SELECT GET_LOCK('pseudo_gtid_lock', 0) INTO lock_result;
    
    IF lock_result = 1 THEN
        -- 执行一个会产生 binlog 事件的语句
        -- DROP VIEW 即使视图不存在也会记录 binlog
        DROP VIEW IF EXISTS `meta`.`pseudo_gtid_view`;
        
        -- 释放锁
        DO RELEASE_LOCK('pseudo_gtid_lock');
    END IF;
END$$

DELIMITER ;

2.3 第三步:验证事件创建成功

-- 查看事件是否创建成功
SHOW EVENTS FROM meta\G

-- 查看事件调度器状态(应为 ON)
SHOW VARIABLES LIKE 'event_scheduler';

-- 查看事件的具体定义
SELECT 
    EVENT_NAME,
    STATUS,
    STARTS,
    INTERVAL_VALUE,
    INTERVAL_FIELD,
    EXECUTE_AT
FROM information_schema.EVENTS 
WHERE EVENT_SCHEMA = 'meta';

2.4 第四步:配置 MySQL 持久化

为了确保重启后配置依然有效,需要将相关配置写入 my.cnf:

# 编辑 MySQL 配置文件
vim /etc/my.cnf

# 添加以下配置
[mysqld]
# 确保事件调度器开机自启
event_scheduler = ON

# 可选:优化 binlog 格式
binlog_format = ROW  # 推荐使用 ROW 格式
binlog_rows_query_log_events = ON  # 记录原始 SQL,便于调试

重启 MySQL 使配置生效:

systemctl restart mysqld

# 验证重启后事件调度器状态
mysql -e "SHOW VARIABLES LIKE 'event_scheduler';"

2.5 第五步:验证 Pseudo-GTID 是否正常工作

方法一:直接查看 binlog 内容

# 找到最新的 binlog 文件
mysql -e "SHOW MASTER STATUS\G"

# 查看 binlog 中的 Pseudo-GTID 标记
mysqlbinlog /var/lib/mysql/mysql-bin.000001 | grep -A 3 -B 3 "DROP VIEW" | head -20

你应该能看到类似这样的输出:

# at 12345678
#230101 10:00:00 server id 1113306  end_log_pos 12345689  Query thread_id=123 exec_time=0 error_code=0
SET TIMESTAMP=1704070800/*!*/;
DROP VIEW IF EXISTS `meta`.`pseudo_gtid_view`/*!*/;

方法二:通过 Orchestrator 验证

# 使用 orchestrator-client 查看集群拓扑
orchestrator-client -c topology -i 192.168.56.80:3306

# 在 Orchestrator 日志中查看伪 GTID 相关信息
tail -f /var/log/orchestrator.log | grep -i pseudo

三、高级配置选项

3.1 多语句 Pseudo-GTID 模式

如果希望 Pseudo-GTID 标记更明显,可以使用复合语句:

DELIMITER $$

CREATE EVENT IF NOT EXISTS create_pseudo_gtid_event_advanced
ON SCHEDULE EVERY 10 SECOND
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
ENABLED
DO
BEGIN
    DECLARE lock_result INT;
    DECLARE pseudo_gtid_value VARCHAR(50);
    
    -- 生成一个唯一值
    SET pseudo_gtid_value = CONCAT('pseudo_gtid_', UNIX_TIMESTAMP(), '_', RAND());
    
    SELECT GET_LOCK('pseudo_gtid_lock', 0) INTO lock_result;
    
    IF lock_result = 1 THEN
        -- 创建一个包含唯一值的注释和 DROP VIEW 语句
        SET @pseudo_gtid_sql = CONCAT('/* ', pseudo_gtid_value, ' */ DROP VIEW IF EXISTS `meta`.`pseudo_gtid_view`');
        PREPARE stmt FROM @pseudo_gtid_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
        DO RELEASE_LOCK('pseudo_gtid_lock');
    END IF;
END$$

DELIMITER ;

3.2 监控 Pseudo-GTID 健康状况

创建监控脚本 /usr/local/bin/check_pseudo_gtid.sh

#!/bin/bash

# 检查事件是否存在且启用
MYSQL_CMD="mysql -uroot -pYourPassword -e"

EVENT_STATUS=$($MYSQL_CMD "SHOW EVENTS FROM meta LIKE 'create_pseudo_gtid_event'" 2>/dev/null | grep ENABLED)

if [ -z "$EVENT_STATUS" ]; then
    echo "ERROR: Pseudo-GTID event is not enabled or missing"
    exit 1
fi

# 检查最近是否有注入
LAST_INJECT=$($MYSQL_CMD "SELECT MAX(STR_TO_DATE(event_time, '%Y%m%d %H:%i:%s')) 
    FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(event_time, '# at', -1), ' ', 2) as event_time 
          FROM mysql.general_log WHERE argument LIKE '%DROP VIEW%' LIMIT 100) t" 2>/dev/null)

CURRENT_TIME=$(date +%s)
LAST_INJECT_TIME=$(date -d "$LAST_INJECT" +%s)

if [ $((CURRENT_TIME - LAST_INJECT_TIME)) -gt 30 ]; then
    echo "WARNING: No Pseudo-GTID injection in last 30 seconds"
    exit 2
fi

echo "OK: Pseudo-GTID is working properly"
exit 0

四、Orchestrator 配置文件调整

确保 orchestrator.conf.json 中包含正确的 Pseudo-GTID 配置:

{
  "AutoPseudoGTID": true,
  "PseudoGTIDPattern": "DROP VIEW IF EXISTS `meta`.`pseudo_gtid_view`",
  "PseudoGTIDPatternIsFixedSubstring": true,
  "PseudoGTIDMonotonicHint": "order:asc",
  "DetectPseudoGTIDQuery": "SELECT max(SUBSTRING_INDEX(SUBSTRING_INDEX(event_time, '# at', -1), ' ', 2)) as pseudo_gtid FROM mysql.general_log WHERE argument LIKE '%DROP VIEW IF EXISTS `meta`.`pseudo_gtid_view`%'",
  
  "RecoverMasterBinlogFileLocation": true,
  "RecoverMasterClusterFilters": ["*"],
  "InstancePollSeconds": 5
}

五、常见问题排查

5.1 事件未执行

现象:Pseudo-GTID 标记没有在 binlog 中出现

排查步骤

-- 检查事件状态
SELECT 
    EVENT_NAME,
    STATUS,
    LAST_EXECUTED,
    LAST_ALTERED
FROM information_schema.EVENTS 
WHERE EVENT_SCHEMA = 'meta';

-- 手动执行事件测试
CALL meta.create_pseudo_gtid_event();

-- 查看是否有锁冲突
SHOW PROCESSLIST;
SELECT * FROM performance_schema.metadata_locks;

5.2 权限问题

现象:Orchestrator 无法识别 Pseudo-GTID 标记

解决方案

-- 确保监控用户有足够的权限
GRANT DROP ON meta.* TO 'orch_topology_user'@'192.168.56.%';
GRANT SELECT ON mysql.general_log TO 'orch_topology_user'@'192.168.56.%';
FLUSH PRIVILEGES;

-- 如果不想开启 general_log,可以授予对 binlog 的访问权限
GRANT REPLICATION CLIENT ON *.* TO 'orch_topology_user'@'192.168.56.%';

5.3 性能影响评估

Pseudo-GTID 对性能的影响极小,但可以通过以下方式监控:

-- 查看事件执行耗时
SELECT 
    EVENT_NAME,
    AVG_EXEC_TIME,
    MAX_EXEC_TIME,
    COUNT_EXEC
FROM performance_schema.events_statements_summary_by_account_by_event_name
WHERE EVENT_NAME LIKE '%create_pseudo_gtid_event%';

-- 查看 binlog 增长速度
SHOW MASTER STATUS;
-- Pseudo-GTID 每10秒产生约 200-300 字节的 binlog 事件
-- 每天约增加 2-3 MB,影响可忽略不计

六、最佳实践建议

  1. 注入频率选择

    • 默认 10 秒是平衡点,故障转移速度和性能影响的最佳实践
    • 对延迟敏感的业务可以调整为 5 秒
    • 超大集群可以适当延长到 15-20 秒
  2. 监控告警配置

    # 添加 crontab 监控
    */5 * * * * /usr/local/bin/check_pseudo_gtid.sh > /dev/null 2>&1
    
  3. 版本升级注意事项

    • MySQL 小版本升级不会影响已配置的事件
    • 主从切换后,事件会在新主库上继续运行
    • 建议在事件定义中使用 IF NOT EXISTS,避免重复创建
  4. 备份恢复考虑

    -- 导出事件定义作为备份
    mysqldump --events --no-data meta > meta_events_backup.sql
    

总结

通过以上配置,MySQL 5.7 就成功开启了 Pseudo-GTID 功能。这将让 Orchestrator 在不开启原生 GTID 的情况下,依然能够实现接近 GTID 的自动化故障转移能力。

最后验证清单

  • 所有节点都创建了 meta 数据库
  • 所有节点的事件调度器已开启
  • 所有节点的 Pseudo-GTID 事件已创建并启用
  • 监控用户有 DROP 权限
  • 至少观察到一个 Pseudo-GTID 标记写入 binlog
  • Orchestrator 配置文件已更新

如果遇到任何问题,建议先从验证 binlog 中的 Pseudo-GTID 标记开始排查。

到此这篇关于MySQL5.7配置Pseudo-GTID完整步骤的文章就介绍到这了,更多相关MySQL5.7配置Pseudo-GTID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL导入sql脚本错误:2006 解决方法

    MySQL导入sql脚本错误:2006 解决方法

    本文给大家分享的是在使用mysql导入数据的时候,提示脚本错误2006 MySQL server has gone away的解决方法,非常实用,有需要的小伙伴,可以参考下。
    2015-07-07
  • windows环境下mysql的解压安装及备份和还原

    windows环境下mysql的解压安装及备份和还原

    这篇文章主要介绍了windows环境下mysql的解压安装及备份和还原,需要的朋友可以参考下
    2017-09-09
  • Windows10下mysql 5.7.21 Installer版安装图文教程

    Windows10下mysql 5.7.21 Installer版安装图文教程

    这篇文章主要为大家详细介绍了Windows10下mysql 5.7.21 Installer版安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Win中安装mysql的详细步骤

    Win中安装mysql的详细步骤

    这篇文章主要为大家详细介绍了Win中安装mysql的详细步骤,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • MySql查询某个时间段内的数据实例(前一周、前三个月、前一年等)

    MySql查询某个时间段内的数据实例(前一周、前三个月、前一年等)

    在实际工作中需要整理一份时间在规定时间前后的统计表,下面这篇文章主要给大家介绍了关于MySql查询某个时间段内的数据的相关资料,包括前一周、前三个月、前一年等,需要的朋友可以参考下
    2022-10-10
  • MySQL内外连接实战详解

    MySQL内外连接实战详解

    文章详解MySQL内连接与外连接,内连接通过WHERE筛选匹配记录,外连接包括左、右连接,保留一侧全数据,包含案例与练习及LeetCode实战题目,对mysql内外连接实战案例相关知识感兴趣的朋友一起看看吧
    2025-08-08
  • Windows下通过DOS命令登录MYSQL的方法

    Windows下通过DOS命令登录MYSQL的方法

    这篇文章主要介绍了Windows下通过DOS命令登录MYSQL的方法,方法很简单,本文给出了详细操作步骤,需要的朋友可以参考下
    2015-05-05
  • MySQL如何创建可以远程访问的root账户详解

    MySQL如何创建可以远程访问的root账户详解

    作为MySQL数据库管理员,创建远程用户并设置相应的权限是一项常见的任务,下面这篇文章主要给大家介绍了关于MySQL如何创建可以远程访问的root账户的相关资料,需要的朋友可以参考下
    2024-04-04
  • MySQL数据库触发器从小白到精通

    MySQL数据库触发器从小白到精通

    触发器是SQLserver提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等
    2022-03-03
  • Can''t connect to MySQL server的解决办法

    Can''t connect to MySQL server的解决办法

    ERROR 2003 (HY000): Can't connect to MySQL server on '*.*.*.*' (113)的解决办法
    2010-06-06

最新评论