【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;
核驗:成功!