mariadb gtid方式搭建從庫

賀子_DBA時代發表於2022-11-22

學習下mariadb,搭建下主從,mariadb gtid的和mysql的gtid不一樣

在MariaDB中,GTID由三部分組成,三部分之間用’-‘分隔,例如0-161002-1:
struct rpl_gtid {  uint32 domain_id;  uint32 server_id;  uint64 seq_no; };
第一個是無符號32位整數的domain_id,在多源複製、多主拓撲復制中每個會寫入的Master通常需要設定不同的Domain_id。
第二個是無符號32位整數的server_id,叢集中每個server需要設定唯一的server id,標識最初寫入binlog的server,用來避免迴圈複製。
第三個是服務號64位整數的seq_no,seq_no在每個寫入server產生binlog中是遞增的。

1、主庫執行備份

[root@fis10serverbak mysqld_exporter]# mysqldump   -uroot  -p***l --port=33061  -h10.1.5.3 --single-transaction  --routines --master-data=2 -B test45bg wf >20221122.sql
master-data=2  #表示會帶如下所示的關鍵字,並且是以註釋的方式存在:
-- Position to start replication or point-in-time recovery from
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000065', MASTER_LOG_POS=378099089;
-- GTID to start replication from
-- SET GLOBAL gtid_slave_pos='0-1133306110-5468601';
2、slave執行恢復操作
mysql   -uroot  -pmysql --port=33061  -h10.1.5.3  <20221122.sql
3、change 命令
CHANGE MASTER TO MASTER_HOST='172:29:7::e02',MASTER_USER='replusr',MASTER_PASSWORD='replusr',MASTER_PORT=3306,MASTER_CONNECT_RETRY=10,MASTER_USE_GTID = slave_pos;   #選擇slave_pos的方式,這樣更安全
4、設定從庫的gtid, 設定這個不需要像社群mysql那樣先reset master,然後再SET @@GLOBAL.GTID_PURGED;只需要在stop slave狀態下即可!
MariaDB [(none)]> SET GLOBAL gtid_slave_pos='0-1133306110-5468601';
確認是否設定成功!
MariaDB [(none)]> SELECT @@GLOBAL.gtid_slave_pos;
+---------------------------------------+
| @@GLOBAL.gtid_slave_pos               |
+---------------------------------------+
| 0-1133306110-5468601 |
+---------------------------------------+
5、start slave即可!
MariaDB [(none)]> start slave;
注意
1、 如果有多個主庫,需要保證上游多個主庫的gtid_domain_id是不一樣的!可以如下這樣設定,建議配置到配置檔案中
MariaDB [(none)]>  set global  gtid_domain_id=1;
Query OK, 0 rows affected (0.000 sec)
2、如下查詢可以判斷出,該節點的作為主庫執行的事務的gtid為 2-1113306120-2這倆!
MariaDB [(none)]> select @@global.gtid_binlog_pos;  #節點執行過的所有的事務的gtid,最後寫入到binlog中的GTID,包括作為從庫同步主庫的gtid,也包括自己作為主庫執行的事務的gtid,
+--------------------------------------------------------+
| @@global.gtid_binlog_pos                               |
+--------------------------------------------------------+
| 0-1133306110-5471555,1-1133306110-13388, 2-1113306120-2 |
+--------------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT @@GLOBAL.gtid_slave_pos;  #節點作為從庫同步主庫的事務的gtid;不包括自己作為主庫執行的gtid
+-----------------------------------------+
| @@GLOBAL.gtid_slave_pos                 |
+-----------------------------------------+
| 0-1133306110-5471555,1-1133306110-13388 |
+-----------------------------------------+
1 row in set (0.000 sec)
4、注意:一定要保證所有的機器gtid_domain_id唯一,server_id唯一!如下是測試過程,
#主庫的gtid_domain_id=1 然後去從庫也設定gtid_domain_id=1 MariaDB [liuwenhe]> set  gtid_domain_id=1;   Query OK, 0 rows affected (0.000 sec) 在從庫模擬一個dml操作 MariaDB [liuwenhe]> insert into liuwenhe values (1); Query OK, 1 row affected (0.001 sec) 你就會發現,剛開始1-1113306120-627 這個就是前面insert的事務 MariaDB [liuwenhe]> select @@global.gtid_binlog_pos; +------------------------------------------------------+ | @@global.gtid_binlog_pos                             | +------------------------------------------------------+ | 0-1133306110-5470703,1-1113306120-627,2-1113306120-2 |   +------------------------------------------------------+ 1 row in set (0.000 sec) 持續查,就會發現等上游事務同步過來之後,就會覆蓋掉1-1113306120-627,而變成1-1133306110-631了,中 間的server_id=1133306110是主庫的! MariaDB [liuwenhe]> select @@global.gtid_binlog_pos; +------------------------------------------------------+ | @@global.gtid_binlog_pos                             | +------------------------------------------------------+ | 0-1133306110-5470703,1-1113306120-627,2-1113306120-2 | +------------------------------------------------------+ 1 row in set (0.000 sec) MariaDB [liuwenhe]> select @@global.gtid_binlog_pos; +------------------------------------------------------+ | @@global.gtid_binlog_pos                             | +------------------------------------------------------+ | 0-1133306110-5470707,1-1133306110-631,2-1113306120-2 | +------------------------------------------------------+ 1 row in set (0.000 sec) MariaDB [liuwenhe]> select @@global.gtid_binlog_pos; +------------------------------------------------------+ | @@global.gtid_binlog_pos                             | +------------------------------------------------------+ | 0-1133306110-5470707,1-1133306110-631,2-1113306120-2 | +------------------------------------------------------+ 1 row in set (0.000 sec) 但是你再insert一條資料,就會發現又變成了從庫的server_id,變成1-1113306120-632, MariaDB [liuwenhe]>insert into liuwenhe values (2); MariaDB [liuwenhe]> select @@global.gtid_binlog_pos; +------------------------------------------------------+ | @@global.gtid_binlog_pos                             | +------------------------------------------------------+ | 0-1133306110-5470707,1-1113306120-632,2-1113306120-2 | +------------------------------------------------------+ 1 row in set (0.000 sec) 這樣不利於排查問題,所以建議保持所有的機器gtid_domain_id唯一,server_id唯一,


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2924655/,如需轉載,請註明出處,否則將追究法律責任。

相關文章