You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GTID主从复制,如何让MariaDB主动推送最新GTID?

实现MariaDB主动通知最新GTID的方案

一、基于事件调度器的主动推送方案

MariaDB自带事件调度器,可定期触发任务,结合自定义逻辑实现最新GTID的主动通知,替代轮询方式。

1. 启用事件调度器

先确保调度器处于开启状态:

SET GLOBAL event_scheduler = ON;
-- 永久生效需修改my.cnf配置文件,添加event_scheduler=ON

2. 创建自定义函数封装GTID获取逻辑

主库和从库的GTID获取路径不同,用函数统一处理:

DELIMITER //
CREATE FUNCTION get_latest_gtid() RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
    DECLARE gtid_str VARCHAR(255);
    -- 通过进程判断角色:主库存在Binlog Dump线程,从库存在Slave相关线程
    IF EXISTS(SELECT 1 FROM information_schema.processlist WHERE COMMAND = 'Binlog Dump') THEN
        SET gtid_str = @@GLOBAL.gtid_current_pos;
    ELSEIF EXISTS(SELECT 1 FROM information_schema.processlist WHERE COMMAND LIKE 'Slave%') THEN
        SET gtid_str = @@GLOBAL.gtid_slave_pos;
    ELSE
        SET gtid_str = '未处于复制架构中';
    END IF;
    RETURN gtid_str;
END //
DELIMITER ;

3. 创建事件触发通知逻辑

根据需求选择以下两种方式:

方式1:调用外部脚本推送

依赖lib_mysqludf_sys插件(需提前安装),调用自定义脚本将GTID推送到监控系统或消息队列:

DELIMITER //
CREATE EVENT notify_gtid_event
ON SCHEDULE EVERY 10 SECOND -- 可根据实时性需求调整间隔
DO
BEGIN
    SET @latest_gtid = get_latest_gtid();
    -- 调用外部脚本,传递GTID参数
    SELECT sys_exec(CONCAT('/usr/bin/python3 /opt/scripts/notify_gtid.py ', @latest_gtid));
END //
DELIMITER ;

示例notify_gtid.py脚本:

import sys
import requests

gtid = sys.argv[1]
# 示例:发送到内部监控API
requests.post('http://your-monitor-internal/gtid/update', data={'gtid': gtid})
# 或写入本地日志文件
with open('/var/log/mariadb_gtid.log', 'a') as f:
    f.write(f"{gtid}\n")

方式2:通过HTTP UDF直接推送

安装lib_mysqludf_http插件后,无需外部脚本即可直接发送HTTP请求:

DELIMITER //
CREATE EVENT notify_gtid_http
ON SCHEDULE EVERY 10 SECOND
DO
BEGIN
    SET @latest_gtid = get_latest_gtid();
    SELECT http_post('http://your-monitor-internal/gtid/update', CONCAT('gtid=', @latest_gtid));
END //
DELIMITER ;

二、基于复制事件的实时触发方案

若对实时性要求极高,可通过监听事务提交事件触发通知,但需注意:触发器无法直接获取GTID,需结合binlog解析或在事务提交后通过事件调度器补充触发。这种方式仅在有数据变更时触发,适合低写入量但需实时感知GTID的场景。

三、注意事项

  • 确保MariaDB账号拥有创建事件、函数的权限,以及调用UDF的权限。
  • lib_mysqludf_sys和lib_mysqludf_http插件需从可信渠道安装,避免安全风险。
  • 事件调度间隔需平衡实时性与服务器负载,短间隔会增加CPU消耗。
  • 从库若需获取已接收但未应用的GTID,可查询SHOW SLAVE STATUS中的Retrieved_Gtid_Set字段。

内容的提问来源于stack exchange,提问作者programZhuang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:20:05