您好,登錄后才能下訂單哦!
看到了一篇server id導致mysql備份恢復的時候丟失事務的文章,特此重現一下。
主備開啟了GTID,實驗過程如下:
1.主庫執行: create database test1; create database test2; 2.主從沒有延遲后備份,利用從庫備份,物理或者邏輯都可以: mysqldump -uroot -poracle --single-transaction --master-data=2 --all-databases > dump.sql 3.主庫執行: create database test3; 4.將主庫干掉 5.從庫提升為主庫,并且: create database test4; 6.利用從庫的備份恢復老的主庫,并指向新主 這個時候會發現,恢復出來的從庫丟失了一個事務test3: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ming | | mysql | | performance_schema | | sakila | | sys | | test1 | | test2 | | test4 | | tt | | world | +--------------------+ 11 rows in set (0.00 sec)
文章說是因為server_id的緣故。
server id一個很大的作用是避免數據回環。所以事務中記錄的sever id會是持久不變的,就像我們的身份證一樣,
走到哪兒都不變。
老主庫因為是利用從庫的備份集還原出來的,執行過的事務是 6f5b02b9-1f08-11ea-9853-000c2970dcdf:1-4,
那么就要去向新主請求6f5b02b9-1f08-11ea-9853-000c2970dcdf:5事務。
新主的master-bin log文件中該事務如下:server id是1573854809 。而該server id正好是老主的server id,
此時該條記錄就會被過濾掉。就不會傳遞到老主那邊去。
# at 836 #200328 11:23:25 server id 1573854809 end_log_pos 901 CRC32 0x23ffdc70 GTID last_committed=4 sequence_number=5 rbr_only=no SET @@SESSION.GTID_NEXT= '6f5b02b9-1f08-11ea-9853-000c2970dcdf:5'/*!*/; # at 901 #200328 11:23:25 server id 1573854809 end_log_pos 998 CRC32 0x2f611a1d Query thread_id=2 exec_time=4290974348 error_code=0 SET TIMESTAMP=1585365805/*!*/; create database test3 /*!*/;
那么為什么test4會被傳遞到老主被應用呢?因為該事務在新主master-bin log中如下,server id 1051295是新主的,
就不會被IO thread過濾.
# at 998 #200211 6:19:19 server id 1051295 end_log_pos 1063 CRC32 0xec9c6a1e GTID last_committed=5 sequence_number=6 rbr_only=no SET @@SESSION.GTID_NEXT= '4c312339-ab38-11e9-86a8-000c29050245:1'/*!*/; # at 1063 #200211 6:19:19 server id 1051295 end_log_pos 1160 CRC32 0xaccb28ab Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1581373159/*!*/; SET @@session.sql_mode=1151336480/*!*/; create database test4 /*!*/;
那么為什么兩條記錄不一致呢?這是因為test3事務是老主傳遞過來的,那么在relay log中,master-bin log中,
以及向后傳遞到其它從庫中的時候,server id是會一直被帶下去的。test4事務是新主自己的事務,
那么從他自己的master-bin log,以及向后傳遞的從庫的relay log和應用后生成的master-bin log中都會是新主的server id。
所以test3會被過濾,test4會被應用。
老的主庫此時:
mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000002 Position: 1443 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1508afe9-70a7-11ea-8d70-000c2970dcdf:1-3, --自己庫里執行的事務 4c312339-ab38-11e9-86a8-000c29050245:1,--主從傳遞下來的事務 6f5b02b9-1f08-11ea-9853-000c2970dcdf:1-4--自己作為主的時候執行的事務 1 row in set (0.00 sec)
新的主庫:
mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000002 Position: 1322 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 4c312339-ab38-11e9-86a8-000c29050245:1-2, 6f5b02b9-1f08-11ea-9853-000c2970dcdf:1-5 1 row in set (0.00 sec)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。