主從複製中常會遇到的問題就是1062主鍵重複、1023slave上相關記錄沒找到。
mysql
若是在讀寫分離的架構中,slave同步失敗會對業務形成很大的影響的(好比用戶在master上發了帖子,閱覽跑到了slave上,找不到了剛纔的帖子了)。sql
所以,咱們頗有必要對主從複製作些監控,作些自動化的處理。bash
這裏要涉及到MySQL的一個參數slave_exec_mode架構
slave_exec_mode參數可用來自動處理同步複製錯誤:ide
# slave上執行 > set global slave_exec_mode='IDEMPOTENT'; 冪等模式 (默認是STRICT嚴格模式) > stop slave; > start slave;
通過上面3步的設置後,當出現1023錯誤(記錄沒找到)、1062錯誤(主鍵重複)時,就會自動跳過錯誤,而且記錄到錯誤日誌裏。spa
其實,slave_exec_mode和slave_skip_errors的做用是同樣的,可是slave_skip_errors不支持動態修改,必須重啓mysql才能生效,所以建議使用slave_exec_mode。日誌
腳本方法以下 cat /home/scripts/manage_repl.sh:ip
#!/bin/bash # Description: 自動跳過主從複製的錯誤(錯誤代碼102三、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 status\G'|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 "地址: $IP\n端口: 3306\n服務: MySQL主從複製發生錯誤,系統已自動跳過錯誤,請後續跟進處理。\n發生時間: `date +"%F %T"`" \ | mail -s '主從複製錯誤警告' xxxxxx@126.com fi
添加一個每隔10分鐘檢查一次主從複製狀態的計劃任務,以下:同步
echo '*/10 * * * * /home/scripts/manage_repl.sh' >>/var/spool/cron/root