#作者:stackofumbrella
文章目錄
- 一、前言
- 二、故障概述
- 2.1 基礎信息
- 2.2 故障現象描述
- 三、故障診斷分析
- 3.1 排查過程
- 3.2 問題根因
- 四、故障解決方案 📊
- 4.1 解決方案 🛠?
- 五、總結
- 附件
一、前言
在磐基系統中大量使用MySQL作為后端的數據存儲,支撐著各類關鍵業務的數據讀寫需求。為保障數據的高可用性與業務連續性,實現數據的冗余備份,普遍采用MySQL主從復制架構。但在使用過程中,較頻繁的出現從庫被寫入數據的問題,導致主從數據不一致,影響業務的正常運行。因此,配置合理參數,防止從庫被寫入數據,顯得尤為重要。
二、故障概述
2.1 基礎信息
磐基版本:kem
涉及組件:MySQL 5.7.38
參考范圍:所有使用MySQL的業務系統
2.2 故障現象描述
磐基租戶在使用MySQL主從同步過程中從庫同步異常,導致主從數據不一致。
三、故障診斷分析
3.1 排查過程
通過查看show slave status\G狀態信息,從錯誤信息可以看出從庫在同步mysql-bin.000010文件的偏移量位置為830237357的數據時候出現錯誤。從庫具體報錯信息如下:
Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ‘ANONYMOUS’ at master log mysql-bin.000010, end_log_pos 830237357. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
從錯誤信息中可以看出,查看performance_schema.replication_applier_status_by_worker表可以獲取更詳細的信息,因此在從庫執行SQL語句select * from performance_schema.replication_applier_status_by_worker查詢結果如下圖所示:
在查詢結果中看出,在更新某個庫的某個表時發生了錯誤,找到這個表和主庫進行對比,發現從庫比主庫的數據較新且數據量多于主庫。
另外可以根據查詢結果,到主庫找到對應的mysql-bin.000010二進制文件,使用如下命令找到偏移量830237357前后的SQL語句,查看到底是哪些操作,在與從庫數據對比并更正,跳過錯誤的事件或者刪除某些數據:
# mysqlbinlog --no-defaults -v -v --base64 --output=decode-rows /var/lib/mysql/mysql-bin.000010 | grep -A 20 “830237357” --color
注意:此命令針對數據量不大的情況使用,對于大量差異數據,還是采用下面章節的方法。
3.2 問題根因
業務在連接數據庫時,配置DNS域名地址,使得主從數據庫被輪詢訪問,而從庫中并未配置只讀參數,這樣就會導致從庫中被寫入了大量數據,從而進一步導致主從同步不一致。
四、故障解決方案 📊
4.1 解決方案 🛠?
注意:請提前備份好主從庫數據,再執行SQL語句:
mysql> stop slave;
mysql> set global sql_slave_skip_counter=1; #跳過一個事務,可以執行多次
mysql> start slave;
mysql> show slave status\G;
或者執行:
mysql> stop slave;
mysql> reset slave; #重置同步
mysql> start slave;
mysql> show slave status\G;
以上方式只適用于同步過程中出現的較少錯誤,對于較多同步錯誤,需要為從庫添加只讀參數,修改部署mysql的deploy清單文件,添加arg參數:
arg:
- --read_only=1
- --super_read_only=1
- --slave-skip-errors=all
重啟deploy后,主從恢復正常同步
五、總結
MySQL的read_only參數可以讓整個MySQL實例普通權限用戶處于只讀狀態,但并不能限制擁有super權限的用戶。read_only參數一般是用于主從復制從庫的配置,目的是為了規避從庫誤寫數據,導致主從復制異常或者主從數據不一致的隱患。另外,為了避免從庫被super權限用戶誤寫數據,MySQL官方在MySQL5.7版本引入了super_read_only參數來限制super用戶在從庫的只讀屬性。
附件
官方參考地址:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_super_read_only