mysql雙主gtid模式,在有數據情況下


【1】需求

(1.1)需求

現有主從 b(主)=》c從

現在想合並數據,有一個主庫 a,a與b的數據無交集

想把 b變成a的從,從而構建 a=>b=>c 的復制情況

如何在 b不 reset master 的情況下 b變成a的從啊(gtid模式)

最終的結果是 主庫 a 會一直寫入,b即做a的從庫同時也是主庫有數據寫入

(1.2)架構

數據庫版本:mysql8.0.22 社區版,啟用 gtid 

192.168.148.27    a 機器

192.168.148.39    b 機器

192.168.148.30    c 機器

 

《1》b(主)=》c(從)

《2》a(主)=》b(從,同時是主)=》c

 

【2】測試

(2.1)構造測試數據

-- <1> a / b 機器都創建復制賬戶
create user repl@'192.168.148.%' identified by 'a123456!';
grant replication client,replication slave on *.* to repl@'192.168.148.%';
reset master;
-- <2> a 機器創建測試庫 a ; create database a; create table a.a1(id int); insert into a.a1 values(1); -- <3> b 機器創建測試庫 b ; create database b; create table b.b1(id int); insert into b.b1 values(1); -- <4> c 機器 change master to b機器 change master to master_host='192.168.148.39', master_user='repl', master_password='a123456!', master_auto_position=1;
start slave;

 

當前是  b(主)=》c(從),a 是獨立主庫;

(2.2)a機器的 a庫數據初始化dump 到b機器

a機器:

mysqldump --single-transaction --master-data=2 --set-gtid-purged=ON -B a > a.txt

 

less a.txt

   

 

b 機器,執行上面這個 set @@global.gtid_purged....

   

 

成功了;

a機器上執行,修改dump出來的文件 去掉該參數,且把文件內的 binlog 修改為1;

sed -i 's/SET @@GLOBAL.GTID_PURGED=/#SET @@GLOBAL.GTID_PURGED=/g' a.txt

sed -i 's/SET @@SESSION.SQL_LOG_BIN= 0/SET @@SESSION.SQL_LOG_BIN= 1/g' a.txt

b機器上應用 a.txt

mysql < a.txt 

  

我們可以看到 a1表 只有 1 一行數據,2是我們mysqldump 導出該文件之后操作的。

  

 

 

(2.3)b 機器 change master to  a機器

change master to 
master_host='192.168.148.27',
master_user='repl',
master_password='a123456!',
master_auto_position=1;
start slave;

 

核驗:

(1)show slave status

  

 

(2)數據同步查看

  

 

 至此完成;

a-b的復制,那么 b-c的復制有問題;

(2.4)b(主)=》c(從)的復制出現問題

報錯如下:

 Got fatal error 1236 from master when reading data from binary log: 
'Cannot replicate because the master purged required binary logs. Replicate the missing transactions from elsewhere,
or provision a new slave from backup. Consider increasing the master
's binary log expiration period.
The GTID set sent by the slave is '', and the missing transactions are '101e0f50-69e2-11ec-b4dc-000c2992a4b1:1-6''

很明顯,報錯是說確實事務: 

  missing transactions are '101e0f50-69e2-11ec-b4dc-000c2992a4b1:1-6'

那我們同理也是要在 c機器上運行:

stop slave;
set @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '101e0f50-69e2-11ec-b4dc-000c2992a4b1:1-6';  
start slave;

成功:

 

  

 

【3】雙主,a 也變成 b的從庫

記住,我們的前提是 現在想合並數據,有一個主庫 a,a與b的數據無交集

(3.1)b 機器的 b 庫數據初始化dump 到 a 機器

b機器:

mysqldump --single-transaction --master-data=2 --set-gtid-purged=ON -B b > b.txt

這里我們就不做 b.txt 文件內容替換了

(3.2)應用 dump文件到 a 機器 

[root@DB4 /data/dba]$ mysql < b.txt 
ERROR 3546 (HY000) at line 24: @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED

如上面代碼,我們發現報錯了;

文件中的 set @@global.gtid_pirged 是下面值:

  SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '101e0f50-69e2-11ec-b4dc-000c2992a4b1:1-7,aa548eae-d889-11ea-8601-000c29c8f925:1-12';

是因為有自己的gtid啊;那么我們去掉自己的gtid;那么我們自己的 gtid 是多少呢

  

 

 我們可以看到是101開頭的,那很明顯了,我們把文件中的 

  SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '101e0f50-69e2-11ec-b4dc-000c2992a4b1:1-7,aa548eae-d889-11ea-8601-000c29c8f925:1-12';

改成如下:

  SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ 'aa548eae-d889-11ea-8601-000c29c8f925:1-12';

vim b.txt

  

 

 應用,核驗:如下

mysql < b.txt

  

 

(3.3)a 機器 change master to b 機器

b機器:

insert into b.b1 values(2),(3);

a 機器:

change master to 
master_host='192.168.148.39',
master_user='repl',
master_password='a123456!',
master_auto_position=1;
start slave;

核驗:成功!

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM