MySQL 的slave_exec_mode參數的用處
- 2019 年 10 月 5 日
- 筆記
主從複製中常會遇到的問題就是1062主鍵重複、1023slave上相關記錄沒找到。
如果在讀寫分離的架構中,slave同步失敗會對業務造成很大的影響的(比如用戶在master上發了帖子,閱覽跑到了slave上,找不到了剛才的帖子了)。
因此,我們很有必要對主從複製做些監控,做些自動化的處理。
這裡要涉及到MySQL的一個參數slave_exec_mode
slave_exec_mode參數可用來自動處理同步複製錯誤:
# slave上執行 > set global slave_exec_mode='IDEMPOTENT'; 冪等模式 (默認是STRICT嚴格模式) > stop slave; > start slave;
經過上面3步的設置後,當出現1023錯誤(記錄沒找到)、1062錯誤(主鍵重複)時,就會自動跳過錯誤,並且記錄到錯誤日誌里。
其實,slave_exec_mode和slave_skip_errors的作用是一樣的,但是slave_skip_errors不支援動態修改,必須重啟mysql才能生效,因此建議使用slave_exec_mode。
腳本方法如下 cat /home/scripts/manage_repl.sh:
#!/bin/bash # Description: 自動跳過主從複製的錯誤(錯誤程式碼1023、1062) ,這個腳本在slave上執行 # user='root' pass='root' port='3306' IP='172.16.10.10' MYSQLCLI='/usr/local/mysql/bin/mysql' STATUS=$($MYSQLCLI -u$user -p$pass -h $IP -e 'show slave statusG'|sed -n '13p'|awk -F ":" '{print $2}') if [[ $STATUS != 'YES' ]];then $MYSQLCLI -u$user -p$pass -h $IP -e "SET GLOBAL slave_exec_mode='IDEMPOTENT';" $MYSQLCLI -u$user -p$pass -h $IP -e "stop slave';" $MYSQLCLI -u$user -p$pass -h $IP -e "start slave';" echo -e "地址: $IPn埠: 3306n服務: MySQL主從複製發生錯誤,系統已自動跳過錯誤,請後續跟進處理。n發生時間: `date +"%F %T"`" | mail -s '主從複製錯誤警告' [email protected] fi
添加一個每隔10分鐘檢查一次主從複製狀態的計劃任務,如下:
echo '*/10 * * * * /home/scripts/manage_repl.sh' >>/var/spool/cron/root
