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