MySQL5.7配置Pseudo-GTID完整步驟
一、Pseudo-GTID 原理解析
在開始配置之前,先簡單理解 Pseudo-GTID 的工作原理:
- 定期注入唯一標(biāo)記:在 MySQL 的 binlog 中定期插入一個全局唯一的 SQL 語句
- 作為定位錨點:這些標(biāo)記成為 binlog 中的"坐標(biāo)點",Orchestrator 可以通過它們快速定位數(shù)據(jù)同步位置
- 無需開啟 GTID:在傳統(tǒng)復(fù)制模式下,也能實現(xiàn)類似 GTID 的自動定位能力
二、配置步驟詳解
2.1 第一步:創(chuàng)建元數(shù)據(jù)庫(所有節(jié)點)
首先在每個 MySQL 實例上創(chuàng)建用于存放偽 GTID 相關(guān)對象的數(shù)據(jù)庫:
-- 登錄 MySQL(所有節(jié)點:192.168.56.80、61、60) mysql -uroot -p -- 創(chuàng)建 meta 數(shù)據(jù)庫(如果不存在) CREATE DATABASE IF NOT EXISTS meta;
2.2 第二步:創(chuàng)建 Pseudo-GTID 事件(所有節(jié)點)
這是最核心的步驟,需要創(chuàng)建一個定時事件來定期注入偽 GTID 標(biāo)記:
-- 切換到 meta 數(shù)據(jù)庫
USE meta;
-- 確保事件調(diào)度器已開啟
SET GLOBAL event_scheduler = ON;
-- 創(chuàng)建偽 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;
-- 獲取鎖,確保同一時間只有一個會話執(zhí)行注入
SELECT GET_LOCK('pseudo_gtid_lock', 0) INTO lock_result;
IF lock_result = 1 THEN
-- 執(zhí)行一個會產(chǎn)生 binlog 事件的語句
-- DROP VIEW 即使視圖不存在也會記錄 binlog
DROP VIEW IF EXISTS `meta`.`pseudo_gtid_view`;
-- 釋放鎖
DO RELEASE_LOCK('pseudo_gtid_lock');
END IF;
END$$
DELIMITER ;
2.3 第三步:驗證事件創(chuàng)建成功
-- 查看事件是否創(chuàng)建成功
SHOW EVENTS FROM meta\G
-- 查看事件調(diào)度器狀態(tài)(應(yīng)為 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 持久化
為了確保重啟后配置依然有效,需要將相關(guān)配置寫入 my.cnf:
# 編輯 MySQL 配置文件 vim /etc/my.cnf # 添加以下配置 [mysqld] # 確保事件調(diào)度器開機(jī)自啟 event_scheduler = ON # 可選:優(yōu)化 binlog 格式 binlog_format = ROW # 推薦使用 ROW 格式 binlog_rows_query_log_events = ON # 記錄原始 SQL,便于調(diào)試
重啟 MySQL 使配置生效:
systemctl restart mysqld # 驗證重啟后事件調(diào)度器狀態(tài) mysql -e "SHOW VARIABLES LIKE 'event_scheduler';"
2.5 第五步:驗證 Pseudo-GTID 是否正常工作
方法一:直接查看 binlog 內(nèi)容
# 找到最新的 binlog 文件 mysql -e "SHOW MASTER STATUS\G" # 查看 binlog 中的 Pseudo-GTID 標(biāo)記 mysqlbinlog /var/lib/mysql/mysql-bin.000001 | grep -A 3 -B 3 "DROP VIEW" | head -20
你應(yīng)該能看到類似這樣的輸出:
# 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 查看集群拓?fù)? orchestrator-client -c topology -i 192.168.56.80:3306 # 在 Orchestrator 日志中查看偽 GTID 相關(guān)信息 tail -f /var/log/orchestrator.log | grep -i pseudo
三、高級配置選項
3.1 多語句 Pseudo-GTID 模式
如果希望 Pseudo-GTID 標(biāo)記更明顯,可以使用復(fù)合語句:
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
-- 創(chuàng)建一個包含唯一值的注釋和 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 監(jiān)控 Pseudo-GTID 健康狀況
創(chuàng)建監(jiān)控腳本 /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 配置文件調(diào)整
確保 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 事件未執(zhí)行
現(xiàn)象:Pseudo-GTID 標(biāo)記沒有在 binlog 中出現(xiàn)
排查步驟:
-- 檢查事件狀態(tài)
SELECT
EVENT_NAME,
STATUS,
LAST_EXECUTED,
LAST_ALTERED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'meta';
-- 手動執(zhí)行事件測試
CALL meta.create_pseudo_gtid_event();
-- 查看是否有鎖沖突
SHOW PROCESSLIST;
SELECT * FROM performance_schema.metadata_locks;
5.2 權(quán)限問題
現(xiàn)象:Orchestrator 無法識別 Pseudo-GTID 標(biāo)記
解決方案:
-- 確保監(jiān)控用戶有足夠的權(quán)限 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 的訪問權(quán)限 GRANT REPLICATION CLIENT ON *.* TO 'orch_topology_user'@'192.168.56.%';
5.3 性能影響評估
Pseudo-GTID 對性能的影響極小,但可以通過以下方式監(jiān)控:
-- 查看事件執(zhí)行耗時
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秒產(chǎn)生約 200-300 字節(jié)的 binlog 事件
-- 每天約增加 2-3 MB,影響可忽略不計
六、最佳實踐建議
注入頻率選擇:
- 默認(rèn) 10 秒是平衡點,故障轉(zhuǎn)移速度和性能影響的最佳實踐
- 對延遲敏感的業(yè)務(wù)可以調(diào)整為 5 秒
- 超大集群可以適當(dāng)延長到 15-20 秒
監(jiān)控告警配置:
# 添加 crontab 監(jiān)控 */5 * * * * /usr/local/bin/check_pseudo_gtid.sh > /dev/null 2>&1
版本升級注意事項:
- MySQL 小版本升級不會影響已配置的事件
- 主從切換后,事件會在新主庫上繼續(xù)運行
- 建議在事件定義中使用
IF NOT EXISTS,避免重復(fù)創(chuàng)建
備份恢復(fù)考慮:
-- 導(dǎo)出事件定義作為備份 mysqldump --events --no-data meta > meta_events_backup.sql
總結(jié)
通過以上配置,MySQL 5.7 就成功開啟了 Pseudo-GTID 功能。這將讓 Orchestrator 在不開啟原生 GTID 的情況下,依然能夠?qū)崿F(xiàn)接近 GTID 的自動化故障轉(zhuǎn)移能力。
最后驗證清單:
- 所有節(jié)點都創(chuàng)建了 meta 數(shù)據(jù)庫
- 所有節(jié)點的事件調(diào)度器已開啟
- 所有節(jié)點的 Pseudo-GTID 事件已創(chuàng)建并啟用
- 監(jiān)控用戶有 DROP 權(quán)限
- 至少觀察到一個 Pseudo-GTID 標(biāo)記寫入 binlog
- Orchestrator 配置文件已更新
如果遇到任何問題,建議先從驗證 binlog 中的 Pseudo-GTID 標(biāo)記開始排查。
到此這篇關(guān)于MySQL5.7配置Pseudo-GTID完整步驟的文章就介紹到這了,更多相關(guān)MySQL5.7配置Pseudo-GTID內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql5.7以上版本配置my.ini的詳細(xì)步驟
- MySQL5.7免安裝版配置圖文教程
- mysql 5.7.16 安裝配置方法圖文教程
- mysql 5.7.13 安裝配置方法圖文教程(linux)
- mysql5.7.19 安裝配置方法圖文教程(win10)
- 最全的mysql 5.7.13 安裝配置方法圖文教程(linux) 強(qiáng)烈推薦!
- windows下mysql 5.7.20 安裝配置方法圖文教程
- MySQL5.7.17安裝及配置圖文教程
- mysql 5.7以上版本安裝配置方法圖文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)
- mysql 5.7.13 winx64安裝配置方法圖文教程
- mysql 5.7.21 解壓版安裝配置方法圖文教程
相關(guān)文章
在Mysql環(huán)境下對數(shù)據(jù)進(jìn)行增刪改查的操作方法
本文介紹了在MySQL環(huán)境下對數(shù)據(jù)進(jìn)行增刪改查的基本操作,包括插入數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)、數(shù)據(jù)查詢(基本查詢、連接查詢、聚合函數(shù)查詢、子查詢)等,并舉例說明了每種操作的具體用法,感興趣的朋友跟隨小編一起看看吧2025-02-02
MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟
本文主要介紹了MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
mysql實現(xiàn)查詢數(shù)據(jù)并根據(jù)條件更新到另一張表的方法示例
這篇文章主要介紹了mysql實現(xiàn)查詢數(shù)據(jù)并根據(jù)條件更新到另一張表的方法,結(jié)合實例形式分析了mysql多表關(guān)聯(lián)查詢、更新等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
使用cgroups來限制MySQL企業(yè)備份服務(wù)對資源的占用
這篇文章主要介紹了使用cgroups來限制MySQL企業(yè)備份服務(wù)對資源的占用,以限制mysqlbackup相關(guān)的進(jìn)程和線程對CPU和內(nèi)存的閑時消耗,需要的朋友可以參考下2015-06-06

