學習下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唯一,