mysql主從複製之GTID複製

2022-09-14 02:33:11 字數 1716 閱讀 2547

一.gtid的基本概念

gtid特性是從mysql5.6開始加入的乙個強大特性,又叫全域性事務id,是乙個已提交事務的編號。mysql會為每乙個dml/ddl操作增加乙個唯一標記叫做gtid,這個標記在整個複製環境中都是唯一的。主從環境中主庫的dump執行緒可以直接通過gtid定位到需要傳送的binlog位置,而不再需要指定binlog的檔名和pos號,因此切換很方便。

二.gtid的表示

gtid是由server_uuid和gno組成的;gtid的表示主要有以下幾個關注點:

(1)gtid:單個gtid,比如『24985463-a536-11e8-a30c-5432223535e4:5』。對應原始碼中的類結構gtid。原始碼中用sid代表前面的server_uuid,gno則用來表示後面的序號。

(2)gno:單個gtid後面的序號,上面的gtid其gno為5,這裡的gno實際上是從全域性計數器next_free_gno中獲取的。

(3)gtid set:乙個gtid的集合,可以包含多個server_uuid,比如我們常見的executed_gtid,gtid_purged就是乙個gtid set。對應原始碼中的類結構gtid_set,其中還包含乙個sid_map用於表示多個server_uuid。

(4)gtid set interval:gtid set中某個server_uuid可能包含多個區間比如『1-5:7-10』。對應原始碼中的結構體gtid_set::interval

三.server_uuid的生成

我們可以看到gtid中均包含了乙個server_uuid。server_uuid實際上是乙個32位元組+1位元組(/0)的字串。mysql啟動的時候會呼叫函式init_server_auto_options來讀取auto.cnf檔案。如果auto.cnf檔案丟失,則會呼叫函式generate_server_uuid來生成乙個新的server_uuid,但是需要注意這樣gtid必然會發生改變。

下面是generate_server_uuid的部分**

然而server_uuid的內部表示是binary_log::uuid,核心就是乙個16位元組的記憶體空間,在gtid相關的event中就會包含這個資訊。

四.gtid的生成

gtid其實是在『commit』命令發起後,order commit 執行到flush階段需要生成gtid event的時候才會獲取。mysql內部維護了乙個全域性的gtid的計數器next_free_gno用於生成gno。可以參考gtid_state::get_automatic_gno,部分**如下:

五.gtid_executed表的作用

官方文件中描述gtid_executed是gtid持久化的乙個介質。例項重啟後所有的記憶體資訊都會丟失,gtid模組初始化就需要讀取gtid持久化介質。

表結構如下

另外還有一種gtid持久化的介質->binary log 中的gtid_log_event,其中我們使用gtid做從庫的時候,從庫必須開啟binlog同時設定log_sl**e_updates,使從庫執行的gitd操作也記錄在自己的binlog中,但是很多時候我們不需要做級聯,設定log_sl**e_updates,會造成額外的空間和效能開銷。因此雖然有兩種gitd持久化介質,但是更多的還是以gtid_executed表為主。

主從複製gtid

主從複製gtid方式 首先,主從伺服器都要進行mysql初始化 systemctl stop mysqld rm rf var lib mysql systemctl restart mysqld grep password var log mysqld.log mysqladmin uroot p...

mysql主從複製

罪過啊,博主最近好久沒有更新部落格了,轉有道雲筆記了,筆記裡還有些乾貨,最近慢慢分享出來吧。博主最近發現有好多想學,但是發現精力有限啊,博主本來是搞個開發的,但是偏偏想把運維,dba的技術全都學了 mysql集群,nginx等等等 但是發現精力有限,所以簡單了解一下,mysql的主從複製,後面還有m...

MySQL 主從複製

1.概念 將主伺服器的資料複製到另外一台或多台伺服器的過程。也即將主資料庫的ddl和dml操作通過二進位制日誌傳到復 務器上,然後在從伺服器上對這些日誌進行重新執行,從而 保持資料同步。2.作用 降低主伺服器的訪問壓力 避免主伺服器因故障導致資料丟失。3.操作步驟 1 主伺服器將資料的改變記錄到二進...