MySQL主從不一致發現的細小問題分析(r12筆記第63天)
今天和同事一起看了一個問題,她在一個主從環境中發現了資料不一致,存在主鍵衝突。
show slave status的報錯資訊大概是下面的樣子。
Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 0 failed executing transaction '0e454161-3169-11e7-98f6-02004d9d000a:665' at master log mysql-bin.000001, end_log_pos 274391. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any. 這是一個MySQL 5.7版本的主從環境,還沒有投入線上業務使用,是在搭建的過程中碰到了這類問題。
一般來說,如果主從資料不一致,可以使用pt工具來嘗試檢查和修復。而這個問題是在搭建主從的時候出現,主從搭建貌似也沒有太多的技巧,開啟GTID,完全夠用了,聽起來確實有些奇怪。
同事在使用pt工具修復失敗之後,準備重建,但是重建的過程也很曲折,slave總是會有主鍵資料的衝突。我們檢查了主庫端,資料是沒有衝突的,難道這又是bug,我覺得細細看看。
我拿到環境,準備向從搭建從庫突破,因為資料量不大,所以我重新匯入了一次資料,是使用最簡單的重定向方式來匯入。
# mysql -pxxxxx < db-dump-201705121718.sql
Logging to file '/home/mysql/query.log'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty. 但是我執行之後發現,匯入的時候報錯了,在匯出的時候其實可以加一個選項,這樣就不會有這類干擾了。
因為是重新搭建從庫,所以我使用了reset master的方式,
> reset master;
Query OK, 0 rows affected (0.01 sec) 再次匯入就沒有問題了。
接下來就是change master的設定.
CHANGE
MASTER TO MASTER_HOST='xxxx',
MASTER_USER='rep_user', MASTER_PASSWORD='xxxx',
MASTER_PORT=3306, MASTER_AUTO_POSITION = 1;
啟動slave後發現同事碰到的錯誤沒有了。
對於這個問題,我們進行了溝通,同事匯入的時候使用source的方式匯入,說沒有看到錯誤,我們對比了一下搭建方法,也就這個地方不同了。
帶著試試看的態度,我使用source的方式搭建了一次。
>source db-dump-201705121718.sql 看到後臺輸出了很多的日誌,總體來看是沒有什麼異常的地方。然後重啟slave錯誤可以重現了。所以透過這個過程可以基本斷定和bug無關。
這個時候我們的關注點逐步縮小,經過論證,就是這個地方的問題,我們來透過幾個小測試來說明。
我寫了幾行SQL,檔案a.sql包含建立表,插入兩行資料的操作。
# cat a.sql
create table test(id int);
insert into test values('aaa');
insert into test values(100);使用mysql test < a.sql 還是source的方式都沒有任何報錯。
執行後表test的資料為:
> select *from test;
+------+
| id |
+------+
| 0 |
| 100 |
+------+這一點確實讓我有些意外。當然問題的重點不在這裡,我們繼續改一下指令碼。
# cat a.sql
create table test(id int);
insert into test values('aaa','aa');
insert into test values(100);這個時候差別就很明顯了。
# mysql test < a.sql
Logging to file '/home/mysql/query.log'
ERROR 1136 (21S01) at line 2: Column count doesn't match value count at row 1檢視資料情況,是沒有資料插入的。
> select *from test;
Empty set (0.00 sec) 而使用source的方式,日誌如下:
> source a.sql
Query OK, 0 rows affected (0.01 sec)
ERROR 1136 (21S01): Column count doesn't match value count at row 1
Query OK, 1 row affected (0.01 sec)檢視資料,是有1行資料的。
所以很大的一個差別就在於此,使用重定向的方式,如果有錯誤會直接退出,而使用source會依次執行,錯誤的地方跳過,繼續執行下面的步驟。這樣一個細小的地方可謂是細思恐極。對於我們做資料變更類的操作而言,是尤其重要的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2139019/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL自增列主從不一致的測試(r12筆記第37天)MySql筆記
- MySQL無法建立表的問題分析(r12筆記第73天)MySql筆記
- MySQL 主從 AUTO_INCREMENT 不一致問題分析MySqlREM
- 使用pt工具檢測MySQL主從延遲(r12筆記第7天)MySql筆記
- 分分鐘搭建MySQL一主多從環境(r12筆記第31天)MySql筆記
- MySQL自增列的重複值問題(r12筆記第25天)MySql筆記
- MYSQL 主從不一致的原因分析MySql
- 一個細小問題觸發的報警(r11筆記第68天)筆記
- 一個ORA-00600問題的簡單分析(r12筆記第18天)筆記
- MySQL傳輸表空間小結(r12筆記第2天)MySql筆記
- MySQL中的derived table(r12筆記第47天)MySql筆記
- MySQL主從複製不一致的情況的問題總結MySql
- MySQL 主從切換延時高問題分析MySql
- 如何解決MySQL 主從複製資料不一致問題MySql
- 相同update語句在MySQL,Oracle的不同表現(r12筆記第30天)MySqlOracle筆記
- mysql主從同步問題整理MySql主從同步
- MySQL數值型別在binlog中需要注意的細節(r12筆記第69天)MySql型別筆記
- 關於金錢的幾個小故事(r12筆記第8天)筆記
- MySQL原始碼安裝總結(r12筆記第12天)MySql原始碼筆記
- MySQL主從不同步問題分析與處理思路MySql
- MySQL中的binlog和redo淺析(r12筆記第5天)MySql筆記
- mysql主從同步(2)-問題梳理MySql主從同步
- MySQL service啟動指令碼淺析(r12筆記第59天)MySql指令碼筆記
- 筆記本省電問題分析及其實用小技巧筆記
- MySQL主從不一致的修復過程MySql
- 歸零的心態(r12筆記第82天)筆記
- mysqlpump的效能測試(r12筆記第89天)MySql筆記
- 閃回區報警引發的效能問題分析(r11筆記第11天)筆記
- MySQL中insert語句沒有響應的問題分析(r11筆記第21天)MySql筆記
- 主主複製的mysql從庫 記憶體表The table 'pvlogs' is full問題處理MySql記憶體
- 在eclipse中配置MySQL原始碼環境(r12筆記第14天)EclipseMySql原始碼筆記
- 我爸爸眼中的我(r12筆記第22天)筆記
- 一個IT人和ppt的故事(r12筆記第39天)筆記
- 我的女兒二三事(七)(r12筆記第58天)筆記
- 玩足彩的一點感受(r12筆記第80天)筆記
- 如何解決 MySQL 主從延時問題?MySql
- mysql主從不同步問題解決MySql
- Mysql跨庫主從熱備失效問題MySql