點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!
背景概述
MySQL主從復制技術應用非常廣泛,M-S復制架構、keepalived+M-M復制架構、MHA等高可用架構都基于MySQL主從復制技術。
主從復制是基于binlog的邏輯復制,實際應中,可能會因為各種原因出現主從數據不一致的情況,因此我們需要定期或不定期地開展主從復制數據一致性的校驗和修復工作。
如果發生了mysql主從數據不一致的情況,我們應該怎樣修復呢?
環境準備
創建測試表t1和t2:
CREATE TABLE `t1` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`phone` int(11) NOT NULL,
`create_time` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=innodb DEFAULT CHARSET=utf8mb4;
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("李四","0123456789",now());
insert into t1(username,phone,create_time) values("李四","0123456789",now());
insert into t1(username,phone,create_time) values("李四","0123456789",now());
CREATE TABLE `t2` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`phone` int(11) NOT NULL,
`create_time` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=innodb DEFAULT CHARSET=utf8mb4;
insert into t2(username,phone,create_time) values("張三","0123456789",now());
insert into t2(username,phone,create_time) values("張三","0123456789",now());
insert into t2(username,phone,create_time) values("張三","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
2.2 Slave節點
錯誤模擬
3.1 Salve節點執行以下操作
set sql_log_bin=0;
delete from t1 where id=3;
3.2 Master節點執行
delete from t1 where id=3;
3.3 Slave節點檢查復制狀態
此時slave復制已發生異常,無法應用主庫操作。
3.4 Master持續操作,模擬業務
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("李四","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
數據修復
4.1 Master節點導出slave異常的數據表
mysqldump -uxxx-pxxxx -P3306 -S 3306.sock --single-
transaction --master-data=2 test t1 > t1.sql
查看gtid信息并記錄。
grep -A10 GLOBAL.GTID_PURGED t1.sql
SET @@GLOBAL.GTID_PURGED=fdc161ff-5aea-11eb-ab62-000c29e9d0c1:1-81;
4.2 Master持續模擬業務
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("張三","0123456789",now());
insert into t1(username,phone,create_time) values("李四","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
insert into t2(username,phone,create_time) values("李四","0123456789",now());
4.3 Slave節點導入數據
檢查gtid信息:
導入數據:
導入數據時發生報錯,無法更新gtid信息,該錯誤不需理會,千萬不能為了解決該錯誤執行resetmaster。
再次檢查gtid信息,未發生變化。
設置復制過濾并應用日志:
此處設置的SQL_AFTER_GTIDS為備份文件中gtid,復制應用日志到該gtid后停止應用日志,此時異常的表數據已修復,清除復制過濾規則后啟動sql應用即可。
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ();
start slave sql_thread;
數據驗證
5.1 master節點
5.2 slave節點
演示中數據較少使用count(*)和select* 即可進行比較,生產中數據量大,環境復雜建議使用pt-table-checksum進行一致性校驗。
演示環境為啟用GTID的主從復制,同樣適用于非GTID復制環境,根據情況選用合適的startslave選項,參考官方文檔STARTSLAVE Statement部分:
START SLAVE [thread_types] [until_option] [connection_options] [channel_option]
thread_types:
[thread_type [, thread_type] ... ]
thread_type:
IO_THREAD | SQL_THREAD
until_option:
UNTIL { {SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS} = gtid_set
| MASTER_LOG_FILE = log_name, MASTER_LOG_POS = log_pos
| RELAY_LOG_FILE = log_name, RELAY_LOG_POS = log_pos
| SQL_AFTER_MTS_GAPS }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129141.html
摘要:簡介項目地址主從環境下數據一致性校驗經常會用工具,它的原理及實施過程之前寫過一篇文章生產環境使用檢查數據一致性。上面的配置文件可以認為是用于控制程序的,這個配置文件是指定要校驗的源庫和目標庫信息,以及要檢驗哪些表。 1. 簡介 項目地址:https://github.com/seanlook/p... 主從環境下數據一致性校驗經常會用 pt-table-checksum 工具,它的原理...
摘要:通過對一些客戶的跨云遷移過程進行總結,發現普遍存在的挑戰有三點數據完整性和一致性挑戰。簡而言之,跨云遷移過程中的數據一致性主要就集中在存量數據的遷移如何保證一致。前言隨著互聯網業務發展對容災以及對訪問加速、多供應商成本控制等需求的產生,互聯網公司的多云部署和跨云遷移逐漸成為剛需,而在此過程中,最困擾運維和研發人員的就是數據的遷移和同步。俗語說 上屋搬下屋,搬灑一籮谷 ,在業務的遷移過程中一旦...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1904·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20