溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql 5.7中Gtid帶來的運(yùn)維改變分析

發(fā)布時間:2021-11-12 14:40:30 來源:億速云 閱讀:121 作者:iii 欄目:MySQL數(shù)據(jù)庫

本篇內(nèi)容主要講解“Mysql 5.7中Gtid帶來的運(yùn)維改變分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Mysql 5.7中Gtid帶來的運(yùn)維改變分析”吧!

一、如何跳過一個事物

和傳統(tǒng)基于位置的主從不同,如果從庫報錯我們需要獲得從庫執(zhí)行的最后一個事物,方法有如下:

  • show slave status \G 中的 Executed_Gtid_Set。

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

  • show master status;中的Executed_Gtid_Set。

然后構(gòu)建一個空事物如下:

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導(dǎo)出行為的改變

使用mysqldump受到選項(xiàng)set-gtid-purged=AUTO的影響,假如我們在Gtid開啟和關(guān)閉的情況下使用如下語句導(dǎo)出數(shù)據(jù):

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

在Gtid開啟的情況下會多如下設(shè)置:

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';

為什么要這么設(shè)置呢?因?yàn)槿绻龌贕tid的主從,是否生成binlog就意味著在導(dǎo)入數(shù)據(jù)的時候是否基于本地數(shù)據(jù)庫生成新的Gtid事物,顯然這是不合理的,所以將SQL_LOG_BIN設(shè)置為0是必須的。接著GTID_PURGED被設(shè)置為備份時刻已經(jīng)執(zhí)行過的Gtid事物,如前文第五節(jié)源碼剖析設(shè)置GTID_PURGED會設(shè)置三個地方的Gtid如下:

  • mysql.gtid_executed表

  • gtid_purge變量

  • gtid_executed變量

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

 --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的主從

這里存在一個注意點(diǎn),也是我案例中會提到的。我們還是直接說步驟

  • 注意主備庫必須開啟Gtid和設(shè)置好server_id

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

同時主備庫都開啟binlog如果不設(shè)置級聯(lián)從庫,從庫不要設(shè)置log_slave_updates參數(shù)。
這是最合理的設(shè)置。

  • 建立復(fù)制用戶

CREATE USER 'repl'@'%' IDENTIFIED BY  'test123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' ;
  • 導(dǎo)出數(shù)據(jù)

mysqldump  --single-transaction  --master-data=2  -R -E --triggers  --all-databases > test.sql
  • 從庫導(dǎo)入數(shù)據(jù)
    source即可。

  • 從庫執(zhí)行reset master語句
    這一步主要防止gtid_executed被更改過。這個問題在在percona 5.7.14 5.7.17存在但是在percona 5.7.15 5.7.19又不存在。所以為了安全還是執(zhí)行下面的兩步。

reset master;
  • 提取GTID_PURGED,并且執(zhí)行
    使用head -n 40 命令可以快速的得到比如我這里的

--
-- GTID state at the beginning of the backup 
--

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

執(zhí)行

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

語句即可,完成本部分mysql.gtid_executed表會重構(gòu)。

  • 使用MASTER_AUTO_POSITION建立同步

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

start slave

四、5.7中Gtid的主從的切換

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

  • 從庫(新主庫)

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;

實(shí)際就這么簡單,從庫(新主庫)會生成自己的Gtid事物,新主庫接受到后執(zhí)行即可。此時會出現(xiàn)如下有兩個server_uuid對應(yīng)的Gtid,如下的gtid_executed

mysql> show global variables like '%gtid%';
+----------------------------------+-------------------------------------------------------------------------------------+
| Variable_name                    | Value                                                                               |
+----------------------------------+-------------------------------------------------------------------------------------+
| binlog_gtid_simple_recovery      | ON                                                                                  |
| enforce_gtid_consistency         | ON                                                                                  |
| gtid_executed                    | 31704d8a-da74-11e7-b6bf-525400a7d243:1-9,
ec9bdd78-a593-11e7-9315-5254008138e4:1-25 |
| gtid_executed_compression_period | 1000                                                                                |
| gtid_mode                        | ON                                                                                  |
| gtid_owned                       |                                                                                     |
| gtid_purged                      | ec9bdd78-a593-11e7-9315-5254008138e4:1-25                                           |
| session_track_gtids              | OFF                                                                                 |
+----------------------------------+-------------------------------------------------------------------------------------+

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

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以后實(shí)現(xiàn)的功能其主要依賴了我們前面分析的 Previous gtid Event以及參數(shù)gtid_mode新加入的2個值。我們具體來看看gitd_mode各個值的含義:

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

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

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

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

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

在線啟動

  • 主庫/從庫執(zhí)行

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

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

  • 主庫/從庫執(zhí)行

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  • 主庫/從庫執(zhí)行

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

生成的是匿名事物,slave可以應(yīng)用匿名和GTID事物

  • 主庫/從庫執(zhí)行

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

生成的是GTID事物,slave可以應(yīng)用匿名和GTID事物

  • 主庫/從庫執(zhí)行

確定已經(jīng)沒有匿名的事物

SHOW GLOBAL STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

同時確認(rèn)從庫
Retrieved_Gtid_Set
Executed_Gtid_Set
正常增長

到這一步實(shí)際上gtid事物已經(jīng)開始使用了。

  • 主庫/從庫執(zhí)行

SET @@GLOBAL.GTID_MODE = ON;
  • 從庫執(zhí)行

stop slave;
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
start slave;
  • 主庫/從庫執(zhí)行
    修改配置文件my.cnf,將參數(shù)的更改加入到配置文件

在線關(guān)閉

  • 從庫執(zhí)行

stop slave;

記錄從庫執(zhí)行狀態(tài)值

Exec_Master_Log_Pos: 7631438
Relay_Master_Log_File: bin_log.000016

執(zhí)行

CHANGE MASTER TO MASTER_AUTO_POSITION = 0,
MASTER_LOG_FILE = 'bin_log.000016', 
MASTER_LOG_POS = 7631438
start slave;
  • 主庫/從庫執(zhí)行

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

生成的是GTID事物,slave可以應(yīng)用匿名和GTID事物

  • 主庫/從庫執(zhí)行

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

生成的是匿名事物,slave可以應(yīng)用匿名和GTID事物

  • 從庫執(zhí)行

等待從庫
Retrieved_Gtid_Set
Executed_Gtid_Set
不再變動。
完成這一步實(shí)際上GTID事物已經(jīng)沒有生成和應(yīng)用了

  • 主庫/從庫執(zhí)行

SET @@GLOBAL.GTID_MODE = OFF;
  • 主庫/從庫執(zhí)行

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

到此,相信大家對“Mysql 5.7中Gtid帶來的運(yùn)維改變分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI