深入理解MySQL 5.7 GTID系列(八):GTID帶來的運維改變

2021-03-02 老葉茶館

 導 讀

作者:高鵬(重慶八怪)

原文地址:

https://www.jianshu.com/p/caae9a019dbd

深入理解MySQL 5.7 GTID系列文章共十篇,本文為第四篇,

第一篇:深入理解MySQL 5.7 GTID系列(一)

第二篇:深入理解MySQL 5.7 GTID系列(二):GTID相關內部數據結構

第三篇:深入理解MySQL 5.7 GTID系列(三):GTID的生成時機

第四篇:

深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executed&PREVIOUS GTID EVENT

第五篇:深入理解MySQL 5.7 GTID系列(五)  gtid_executed&gtid_purged什麼時候更新

第六篇:深入理解MySQL 5.7 GTID系列(六):MySQL啟動初始化GTID模塊

第七篇:深入理解MySQL 5.7 GTID系列(七)binlog_gtid_simple_recovery參數的影響總結

該系列文章將陸續不定期更新~

依託前文的解析來講5.7中 GTID帶來的運維改變,我想理解應該是更加深刻,這節主要討論以下幾個部分:

如何跳過一個事務

mysqldump導出行為的改變

5.7中搭建基於GTID的主從

5.7中GTID的主從的切換

5.7中在線改變GTID模式

一、如何跳過一個事務

和傳統基於位置的主從不同,如果從庫報錯我們需要獲得從庫執行的最後一個事務,方法有如下:

show slave status \G 中的 Executed_Gtid_Set。

show global variables like '%gtid%'; 中的 gtid_executed 。

show master status;中的Executed_Gtid_Set。

然後構建一個空事務如下:

stop slave ;set gtid_next='4a6f2a67-5d87-11e6-a6bd-000c29a879a3:34';begin;commit;set gtid_next='automatic';start slave ;

如果是多個如下:

stop slave ;set gtid_next='89dfa8a4-cb13-11e6-b504-000c29a879a3:3';begin;commit;set gtid_next='89dfa8a4-cb13-11e6-b504-000c29a879a3:4';begin;commit;set gtid_next='automatic';start slave ;

二、 mysqldump導出行為的改變

使用mysqldump受到選項set-gtid-purged=AUTO的影響,假如我們在GTID開啟和關閉的情況下使用如下語句導出數據:

mysqldump  --single-transaction  --master-data=2  -R -E --triggers  --all-databases

在GTID開啟的情況下會多如下設置:

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;SET @@SESSION.SQL_LOG_BIN= 0;---- GTID state at the beginning of the backup --SET @@GLOBAL.GTID_PURGED='ec9bdd78-a593-11e7-9315-5254008138e4:1-105';

為什麼要這麼設置呢?因為如果做基於GTID的主從,是否生成BINLOG就意味著在導入數據的時候是否基於本地資料庫生成新的GTID事務,顯然這是不合理的,所以將SQL_LOG_BIN設置為0是必須的。接著GTID_PURGED被設置為備份時刻已經執行過的GTID事務,如前文第五節源碼剖析設置GTID_PURGED會設置三個地方的GTID如下:

mysql.gtid_executed表

gtid_purge變量

gtid_executed變量

看起來是合理的,但是如果這裡忽略了整個mysql.gtid_executed表是innodb表,導入過程中某些版本(已知percona 5.7.14,5.7.17)會重新刪除和建立,因此通過GTID_PURGED設置的mysql.gtid_executed表會重新改變,重啟資料庫後需要讀取mysql.gtid_executed表可能獲得錯誤Gtid集合導致複製錯誤。這也為我的故障案例埋下了伏筆,案例中在詳細描述。
當然也可以使用 --set-gtid-purged=OFF選項來告訴mysqldump不需要加入SQL_LOG_BIN= 0和GTID_PURGED,但是初始化搭建基於GTID的主從一定不要設置為OFF。下面是這個選項的含義。

--set-gtid-purged[=name]                      Add 'SET @@GLOBAL.GTID_PURGED' to the output. Possible                      values for this option are ON, OFF and AUTO. If ON is                      used and GTIDs are not enabled on the server, an error is                      generated. If OFF is used, this option does nothing. If                      AUTO is used and GTIDs are enabled on the server, 'SET                      @@GLOBAL.GTID_PURGED' is added to the output. If GTIDs                      are disabled, AUTO does nothing. If no value is supplied                      then the default (AUTO) value will be considered.

三、5.7中搭建基於GTID的主從

這裡存在一個注意點,也是我案例中會提到的。我們還是直接說步驟

enforce_gtid_consistency = ON gtid_mode = ON server_id = 9910 binlog_format = row

同時主備庫都開啟binlog如果不設置級聯從庫,從庫不要設置log_slave_updates參數。
這是最合理的設置。

CREATE USER 'repl'@'%' IDENTIFIED BY  'test123';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' ;

mysqldump  --single-transaction  --master-data=2  -R -E --triggers  --all-databases > test.sql

reset master;

---- GTID state at the beginning of the backup --SET @@GLOBAL.GTID_PURGED='ec9bdd78-a593-11e7-9315-5254008138e4:1-21';

執行

SET @@GLOBAL.GTID_PURGED='ec9bdd78-a593-11e7-9315-5254008138e4:1-21';

語句即可,完成本部分mysql.gtid_executed表會重構。

change master to master_host='192.168.99.41',master_user='repl',master_password='test123',master_port=3310,MASTER_AUTO_POSITION = 1;

start slave

四、5.7中GTID的主從的切換

切換中必須要確認從庫(新主庫)沒有做過本地的事務,如果做過,否則切換主庫(新從庫)需要拉取這一部分的GTID事務,如果這些binlog已經不存在了那麼勢必會報錯。這種情況下還是從建從庫吧。那麼我們來說正常的切換步驟。

stop slave;reset slave all;

change master to master_host='192.168.99.40',master_user='repl',master_password='test123',master_port=3310,MASTER_AUTO_POSITION = 1;start slave;

實際就這麼簡單,從庫(新主庫)會生成自己的GTID事務,新主庫接受到後執行即可。此時會出現如下有兩個server_uuid對應的GTID,如下的gtid_executed

總的說來如果要作為的切換的從庫,不要在從庫本地做任何事務。如果確實要做比如加索引等不影響數據的操作可以是使用如下:

mysql> set sql_log_bin=0;Query OK, 0 rows affected (0.00 sec)mysql> create index test_jjj on jjj(id);Query OK, 0 rows affected (0.42 sec)Records: 0  Duplicates: 0  Warnings: 0

這樣也是不會增加本地GTID的。

五、在線修改GTID模式

這是5.7.6以後實現的功能其主要依賴了我們前面分析的 Previous gtid Event以及參數gtid_mode新加入的2個值。我們具體來看看gitd_mode各個值的含義:

OFF(0): Both new and replicated transactions must be anonymous.(生成的是匿名事務,slave也只能應用匿名事務)

OFF_PERMISSIVE:(1) New transactions are anonymous. Replicated transactions can be either
anonymous or GTID transactions.(生成的是匿名事務,slave可以應用匿名和GTID事務)

ON_PERMISSIVE(2): New transactions are GTID transactions. Replicated transactions can be either
anonymous or GTID transactions.(生成的是GTID事務,slave可以應用匿名和GTID事務)

ON(3): Both new and replicated transactions must be GTID transactions(生成的是GTID事務,slave也只能應用GTID事務)

注意每次修改值必然導致一次binlog的切換,如果發生binlog刪除也能夠依託 Previous gtid Event快速準確的找到gtid_purged(Gtid_state.lost_gtids)。

在線啟動

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

確定事務都支持GTID,不會在err log中出現警告如下:
2017-02-26T22:35:24.322055Z 55 [Warning] Statement violates GTID consistency: CREATE TABLE ... SELECT.

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

生成的是匿名事務,slave可以應用匿名和GTID事務

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

生成的是GTID事務,slave可以應用匿名和GTID事務

確定已經沒有匿名的事務

SHOW GLOBAL STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

同時確認從庫
Retrieved_Gtid_Set
Executed_Gtid_Set
正常增長

到這一步實際上GTID事務已經開始使用了。

SET @@GLOBAL.GTID_MODE = ON;

stop slave;CHANGE MASTER TO MASTER_AUTO_POSITION = 1;start slave;

在線關閉

stop slave;

記錄從庫執行狀態值

Exec_Master_Log_Pos: 7631438Relay_Master_Log_File: bin_log.000016

執行

CHANGE MASTER TO MASTER_AUTO_POSITION = 0,MASTER_LOG_FILE = 'bin_log.000016', MASTER_LOG_POS = 7631438start slave;

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

生成的是GTID事務,slave可以應用匿名和GTID事務

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

生成的是匿名事務,slave可以應用匿名和GTID事務

等待從庫
Retrieved_Gtid_Set
Executed_Gtid_Set
不再變動。
完成這一步實際上GTID事務已經沒有生成和應用了

SET @@GLOBAL.GTID_MODE = OFF;

修改配置文件my.cnf,將參數的更改加入到配置文件

六、總結

學習完本節至少能夠學習到:

如何跳過一個事務

mysqldump導出行為的改變

5.7中搭建基於GTID的主從

5.7中GTID的主從的切換

5.7中在線改變GTID 模式

關於其他運維可以參考官方文檔:

對本文有任何疑問可掃碼添加原文作者微信



知數堂

葉金榮與吳炳錫聯合打造

領跑IT精英培訓

行業資深專家強強聯合,傾心定製

MySQL實戰/MySQL優化 /大數據實戰/ Python/ SQL優化

數門精品課程

緊隨技術發展趨勢,定期優化培訓教案

融入大量生產案例,貼合企業一線需求

社群陪伴學習,一次報名,可學1年

DBA、開發工程師必修課

上千位學員已華麗轉身,薪資翻番,職位提升

改變已悄然發生,你還在等什麼?

掃碼下載知數堂精品課程試聽視頻

(MySQL 實戰/優化、大數據實戰、Python開發,及SQL優化等課程)

密碼:hg3h


相關焦點

  • 深入理解MySQL 5.7 GTID系列(三):GTID的生成時機
    /6ee969dc2c9b深入理解MySQL 5.7 GTID系列文章共十篇,本文為第三篇,第一篇:深入理解MySQL 5.7 GTID系列(一)第二篇:深入理解MySQL 5.7 GTID系列(二):GTID相關內部數據結構該系列文章將陸續不定期更新~一、GTID生成類型
  • 深入理解MySQL 5.7 GTID系列(六):MySQL啟動初始化GTID模塊
    深入理解MySQL 5.7 GTID系列文章共十篇,本文為第四篇,第一篇:深入理解MySQL 5.7 GTID系列(一)第二篇:深入理解MySQL 5.7 GTID系列(二):GTID相關內部數據結構第三篇:深入理解MySQL 5.7 GTID系列(三):GTID的生成時機
  • 深入理解MySQL 5.7 GTID系列(二):GTID相關內部數據結構
    /5649644fdc13深入理解MySQL 5.7 GTID系列文章共十篇,本文為第二篇,點擊查看第一篇文章:深入理解MySQL 5.7 GTID系列(一)該系列文章將陸續不定期更新~一、 GTID基本格式 e859a28b-b66d-11e7-8371-000c291f347d:1前一部分是SERVER_UUID
  • MySQL GTID(Global Transaction Identifier)深入理解
    GTID是 MySQL 5.6 版本引入的一個有關於主從複製的重大改進,相對於之前版本基於Binlog文件+Position的主從複製,基於GTID的主從複製,數據一致性更高,主從數據複製更健壯,主從切換、故障切換不易出錯,很少需要人為介入處理。
  • MySQL GTID的管理模式
    這是學習筆記的第 1973 篇文章從MySQL 5.6.5 開始新增了一種基於 GTID 的複製方式。
  • MySQL 5.7基於GTID及多線程主從複製
    Gtid概念從 MySQL 5.6.5 開始新增了一種基於 GTID 的複製方式。通過 GTID保證了每個在主庫上提交的事務在集群中有一個唯一的ID。這種方式強化了資料庫的主備一致性,故障恢復以及容錯能力。在原來基於二進位日誌的複製中,從庫需要告知主庫要從哪個偏移量進行增量同步,如果指定錯誤會造成數據的遺漏,從而造成數據的不一致。
  • MySQL Binlog 文件格式解析二(GTID_LOG_EVENT)
    insert into tb values(1);解析binlog,執行:show binlog events in 'mysql-bin.000001';可以看到一條插入語句,在binlog中變成了多個event。
  • MySQL- InnoDB之二進位日誌
    2.4 GTID的開啟和配置vim /etc/my.cnfgtid-mode=onenforce-gtid-consistency=true2.5 查看GTID信息mysql> create database gtid charset utf8mb4;mysql> show master status
  • [MySQL FAQ]系列 — 5.6版本GTID複製異常處理一例
    排查過程中,曾經一度懷疑是因為設置了BINLOG-DO或者IGNORE規則,或者設置了REPLICATION-DO或IGNORE規則,甚至是GTID的嚴重BUG,但都沒發現端倪。Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 2539 Relay_Log_File: mysql-relay-bin.000003 Relay_Log_Pos: 1996 Relay_Master_Log_File
  • 技術分享 | MySQL 閃回工具 MyFlash|mysql|session|query|server...
    作者:陳怡愛可生南分團隊 DBA,負責公司自動化運維平臺維護和處理客戶問題。本文來源:原創投稿*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
  • MySQL基於MHA的FailOver過程
    ping檢查資料庫狀態,主機狀態,埠等,判斷從庫節點讀取的master_log_file及read_master_log_pos節點大小,查看Retrieved_gtid_set(已接收到的gtid大小),executed_gtid_set(已執行的gtid號大小)3.數據補償
  • 技術分享 | MySQL 閃回工具 MyFlash
    作者:陳怡愛可生南分團隊 DBA,負責公司自動化運維平臺維護和處理客戶問題。本文來源:原創投稿*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
  • 技術分享 | 基於 GTID 的多源複製
    作者:馬文斌MySQL OCP 認證,PostgresSQL PGCA 認證,擅長 MySQL、PostgreSQL、dble 等開源資料庫相關產品的備份恢復、讀寫分離、SQL 調優、監控運維導出 4 個工廠的數據到 192.168.100.5,在該伺服器上運行:cd /data/backupmysqldump -uroot -p -h192.168.100.1 mysqldump -uroot -p -h192.168.100.2 mysqldump -uroot -p -h192.168.100.3 mysqldump -uroot
  • MySQL從庫實用技能教程 巧用slave_exec_mode參數
    的錯誤佔了不少的比重錯誤 1032 指的是從庫中找不到對應行的記錄錯誤 1062 指的是主鍵衝突遇到此報錯時,大多DBA會使用如下方法進行處理1 手動處理方法一: 找出引起異常的數據然後手動在從庫處理後重啟SQL線程繼續觀察;根據報錯的信息,通過mysqlbinlog
  • 操作解析:MySQL如何查看複製信息並排查問題(上)
    這裡的GTID不會因為複製而發生改變,即主庫GTID對應的事務一定是主庫執行過之後,通過複製發送過來的。備庫GTID對應的事務一定是備庫執行的。版本上述信息收集和分析的舉例均是在MySQL-5.7版本上進行的,不同大版本在信息的內容或者信息的存放方式上可能存在一定差異。
  • MySQL 5.7安裝部署總結(r10筆記第77天)
    之前搭建MySQL環境都是使用公司內部使用的腳本,其實說實話屏蔽了很多細節,對MySQL的安裝還是了解比較膚淺,今天有個MySQL 5.7的數據遷移的任務,也是為了熟悉安裝過程就走了一遍安裝的流程,整體和5.6差別不大,這裡演示安裝的都是Percona發布的二進位版本,和MySQL官方的是完全兼容,當然也揉入了Percona一些自己的東西。
  • MySQL中InnoDB-Cluster 日常運維掃盲-愛可生
    測試環境如下: 節點 A:192.168.2.210:3601(主節點) 節點 B:192.168.2.210:3602(從節點) 節點 C:192.168.2.210:3603(從節點) 接下來,看看 InnoDB Cluster 提供的一系列內置函數如何簡化組複製的日常運維管理
  • MySQL自動化運維工具Inception
    MySQL自動化運維工具。那麼在這個都追求自動化運維的時代,審核也必須要跟上步伐,因此Inception誕生了。而Inception可以做的工作遠不止是一個自動化審核工具,同時還具備執行,生成對影響數據的回滾語句(類似閃回的功能),這樣一條龍服務的工具,將會給DBA的工作帶來翻天覆地的變化,DBA從此就從繁重的審核、登上去執行,出錯了很難回滾(如果提前沒有備份的話)的被動局面解放了出來,突然發現,做DBA原來可以這麼輕鬆,工作可以不飽和了,那就有更多的自由時間學習、進一步向自動化運維平臺的實現等更智能化的方向去發展
  • UC運維工程師老王:深入聊聊你不熟知的網際網路應用運維,我在UC的運維
    離線服務比如說運維伺服器資源提供,運維擴容能力,甚至是ITIL的服務等等,這些服務能力一定要對研發和業務部門透明。千萬別設置很多的表格來研發或者產品理解。在線服務的透明,我其實講得更多的是服務公共化能力,打造公共化的服務平臺。原生memcache、mysql都是組件,而不是服務。而需要在此基礎上讓他們具備可運維性,一個重要衡量基準就是透明性。