中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么理解mysql GTID主從復制

發布時間:2021-11-11 16:48:26 來源:億速云 閱讀:145 作者:iii 欄目:MySQL數據庫

本篇內容介紹了“怎么理解mysql GTID主從復制”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、GTID的概述:

1、全局事物標識:global transaction identifieds。

2、GTID事物是全局唯一性的,且一個事務對應一個GTID。

3、一個GTID在一個服務器上只執行一次,避免重復執行導致數據混亂或者主從不一致。

4、GTID用來代替classic的復制方法,不在使用binlog+pos開啟復制。而是使用master_auto_postion=1的方式自動匹配GTID斷點進行復制。

5、MySQL-5.6.5開始支持的,MySQL-5.6.10后開始完善。

6、在傳統的slave端,binlog是不用開啟的,但是在GTID中,slave端的binlog是必須開啟的,目的是記錄執行過的GTID(強制)。

二、GTID的組成部分:

前面是server_uuid:后面是一個序列號

例如:server_uuid:sequence number

7800a22c-95ae-11e4-983d-080027de205a:10

UUID:每個mysql實例的唯一ID,由于會傳遞到slave,所以也可以理解為源ID。

Sequence number:在每臺MySQL服務器上都是從1開始自增長的序列,一個數值對應一個事務。

三、GTID比傳統復制的優勢:

1、更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。

2、更簡單的搭建主從復制。

3、比傳統復制更加安全。

4、GTID是連續沒有空洞的,因此主從庫出現數據沖突時,可以用添加空事物的方式進行跳過。

四、GTID的工作原理:

1、master更新數據時,會在事務前產生GTID,一同記錄到binlog日志中。

2、slave端的i/o 線程將變更的binlog,寫入到本地的relay log中。

3、sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有記錄。

4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。

5、如果沒有記錄,slave就會從relay log中執行該GTID的事務,并記錄到binlog。

6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。

要點:

1、slave在接受master的binlog時,會校驗master的GTID是否已經執行過(一個服務器只能執行一次)。

2、為了保證主從數據的一致性,多線程只能同時執行一個GTID。

六、使用GTID搭建mysql的主從復制的主要參數:

[mysqld]

#GTID:

gtid_mode=on

enforce_gtid_consistency=on

server_id=2003306    #每天實例的server_id都要不一樣

#binlog

log-bin=mysqlbin

log-slave-updates=1   #允許下端接入slave

binlog_format=row      #強烈建議,其他格式可能造成數據不一致

#relay log

skip_slave_start=1

注意:建議使用mysql-5.6.5以上的最新版本。

(二)、啟動GTID的兩種方法:

方法一、

1、如果是在已經跑的服務器,你需要重啟一下mysql server。

2、啟動之前,一定要先關閉master的寫入,保證所有slave端都已經和master端數據保持同步。

3、所有slave需要加上skip_slave_start=1的配置參數,避免啟動后還是使用老的復制協議。

方法二、

1、如果是新搭建的服務器,直接啟動就行了。

七、master-slave搭建的注意事項:

(一)、使用GTID的方式,把salve端掛載master端:

1、啟動以后最好不要立即執行事務,而是先change master上。

2、然后在執行事務,當然知不是必須的。

3、使用下面的sql切換slave到新的master。

stop slave;

change master to

master_host = 192.168.100.200,

master_port = 3306,

master_user = abobo,

master_password=123,

master_auto_position = 1;

(二)、如果給已經運行的GTID的master端添加一個新的slave

有兩種方法:

方法一、適用于master也是新建不久的情況。

1、如果你的master所有的binlog還在。可以選擇類似于上面的方法,安裝slave,直接change master to到master端。

2、原理是直接獲取master所有的GTID并執行。

3、優點:簡單方便。

4、缺點:如果binlog太多,數據完全同步需要時間較長,并且master一開始就啟用了GTUD。

方法二、適用于擁有較大數據的情況。(推薦)

1、通過master或者其他slave的備份搭建新的slave。(看第三部分)

2、原理:獲取master的數據和這些數據對應的GTID范圍,然后通過slave設置@@global.gtid_purged跳過備份包含的gtid。

3、優點:是可以避免第一種方法的不足。

4、缺點:相對來說有點復雜。

(三)、通過備份搭建新的slave:(方法二的擴展)

兩種方法:

方法一、mysqldump的方式:

1、在備份的時候指定--master-data=2(來保存binlog的文件號和位置的命令)。

2、使用mysqldump的命令在dump文件里可以看到下面兩個信息:

SET @@SESSION.SQL_LOG_BIN=0;

SET @@GLOBAL.GTID_PURGED='7800a22c-95ae-11e4-983d-080027de205a:1-8';

3、將備份還原到slave后,使用change master to命令掛載master端。

注意:在mysql5.6.9以后的命令才支持這個功能。

方法二、percona Xtrabackup

1、Xtrabackup_binlog_info文件中,包含global.gtid_purged='XXXXXX:XXXX'的信息。

2、然后到slave去手工的 SET GLOBAL.GTID_PURGED='XXXXXX:XXXX'。

3、恢復備份,開啟change master to 命令。

注意:如果系統運行了很久,無法找到GTID的編號了,可以通過上面的方式進行查找。

八、GTID如何跳過事務沖突:

1、這個功能主要跳過事務,代替原來的set global sql_slave_skip_counter = 1。

2、由于在這個GTID必須是連續的,正常情況同一個服務器產生的GTID是不會存在空缺的。所以不能簡單的skip掉一個事務,只能通過注入空事物的方法替換掉一個實際操作事務。

3、注入空事物的方法:

stop slave;

set gtid_next='xxxxxxx:N';

begin;commit;

set gtid_next='AUTOMAIC';

start slave;

4、這里的xxxxx:N 也就是你的slave sql thread報錯的GTID,或者說是你想要跳過的GTID。

九、GTID的參數注釋:

[master]>show global variables like '%gtid%';

1、enforce_gtid_consistency:開啟gtid的一些安全限制(介意開啟)。

2、gtid_executed:全局和seeeion級別都可以用。用來保存已經執行過的GTIDs。

貼士:show  master status\G;輸出結果中的Executed_Gtid_Set和gitd_executed一致。reset master時,此值會被清空。

3、gtid_owned:全局和session級別都可用,全局表示所有服務器擁有GTIDs,session級別表示當前client擁有所有GTIDs。(此功能用的少)

4、gtid_mode:是否開啟GTID功能。

5、gtid_purged:全局參數,設置在binlog中,已經purged的GTIDs,并且purged掉的GTIDs會包含到gtid_executed中。

貼士:從而導致slave不會再去master請求這些GTIDs,并且Executed_Gtid_Set為空時,才可以設置此值。

6、gtid_next:這個時session級別的參數:

[master]>show session variables like '%gtid_next%';

十、關于GTID的一些功能限制:

(一)、更新非事務引擎:

1、Case重現:

master:對一個innodb表做一個多sql更新的事物,效果是產生一個GTID。

slave:對應的表是MYISAM引擎,執行這個GTID的第一個語句后就會報錯,因為非事務引擎一個sql就是一個事務。

2、錯誤編號:

last_Errno:1756

3、異常恢復方案:

(1)、簡單的stop slave; start slave;就能夠忽略錯誤。但是這個時候主從的一致性已經出現問題。需要手工的把slave差的數據補上。

(2)、首先將引擎調整為一樣的,slave也改為事務引擎。

(二)、不支持 create table ....select statements

1、case重現:

master:直接執行一個create table select * from table;的sql

2、報錯:

error 1786

3、原理:

由于create table ...select語句會生成兩個sql,一個是DDL創建表SQL,一個是insert into 插入數據的sql。由于DDL會導致自動提交,所以這個sql至少需要兩個GTID,但是GTID模式下,只能給這個sql生成一個GTID,如果強制執行會導致和上面更新非事務引擎一樣的結果。

(三)、一個sql同事操作innodb引擎和myisam引擎:

case重現:t1表是innodb,t2表是myisam

1、update t1,t2 set t1.id=1000,t2.id=1000 where t1.id=t2.id;

2、報錯:1785

3、原理和第二個相同。

(四)、在一個replication grouop 中,所有的mysql必須要統一開啟或者關閉GTID功能。

1、case重現:

將一個未開啟gtid的slave通過原始的binlog和pos方式連接到開啟GTID的master。

2、報錯:

The slave IO thread stops because the master has @@GLOBAL.GTID_MODE ON and this server has @@GLOBAL.GTID_MODE OFF。

(五)、在一個replication group中,如果開啟GTID以后,就不再允許使用classic的復制方式:

1、case重現:

將一個開啟gtid的slave通過原始的binlog和pos方式連接到開啟GTID的master。

2、報錯:

ERROR 1776(HY000):Parameters MASTER_LOG_FILE,MASTER_LOG_POS,RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active。

(六)、GTID_MODE是not online的:

需要重啟才能生效,官方暫時不支持平滑的從classic replication切換到GTID replication。

貼士:

由于GTID開啟需要重啟系統,一個復制組中所有的實例必須統一開啟或者關閉GTID,開啟GTID以后不能在使用classic復制。

問題:

也就是說在線業務必須統一關閉,然后再啟動,會導致服務中斷。

解決方案:

1、針對這種情況,社區有兩種對應的平滑升級的方案:

一種是booking.com出品,這兩個差別在淘寶9月份數據庫月報里有說明,加了一個橋接的服務器,既可以運行GTID模式下,也可以運行classic模式下。

另外一種是facebook.com出品。所有的slave可以在開啟GTID模式的情況下,可以連接到沒有開啟GTID模式的master。

2、可以關閉一個部分,停止寫操作,但是讀不用,將另一部分改成GTID模式。

(七)、Temporary tables。

1、create temporary table和drop temporary table語句一樣在GTID環境下不支持。

如果--enforce_gtid_consistency參數開啟,并且autocommit=1,那么可以使用。

(八)、關于Errant transaction

1、Errant transaction:所謂的errant transaction也就是沒有規范的從master執行,而是直接從slave執行的事務。

2、由于GTID協議的原因,最開始已經提過(參見GTID architecture)。

3、如果slave有errant transaction產生,由于GTID協議中的規則,很容易導致failover失敗。主要有兩種情況:

a、在slave上做了無用的或者臨時的errant transaction操作,如果該slave升級成為master的話,連接到它的所有數據庫都會獲取到這個事務。如果一樣就會產生沖突。

b、由于做了這個errant transaction這個事務以后,其他的slave還沒有獲取這個errant transaction的GTID,需要從master上發同步給其他的slave,但是主的binlog又被刪掉了,這時將會報錯。

4、總之:盡量避免產生errant transaction。可以通過:set sql_log_bin=off的方式在slave執行sql,但是也要考慮到數據一致性。

“怎么理解mysql GTID主從復制”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

漳平市| 武夷山市| 临湘市| 平泉县| 江源县| 铜陵市| 玉林市| 咸宁市| 温州市| 榆中县| 甘肃省| 武平县| 聂拉木县| 图们市| 永善县| 鸡西市| 南川市| 本溪市| 迭部县| 昔阳县| 平阳县| 建瓯市| 东兴市| 南江县| 鹤庆县| 巫溪县| 祁阳县| 常德市| 防城港市| 黄石市| 邹平县| 军事| 遵化市| 中宁县| 马尔康县| 祁门县| 青海省| 南江县| 格尔木市| 德阳市| 来安县|