【Shell】fix 1032報錯資訊的指令碼
生產環境總會遇到由於各種原因導致的主從複製不一致的情況,導致slave出現 1032報錯。為了使主從關係能夠穩定的執行,大多時候可以選擇修復1032 報錯 ,先跳過去 ,然後使用 percona 的工具 pt-table-checksum 和 pt-table-sync 進行校驗和修復 。
修復1032 error的指令碼如下:
使用該指令碼需要注意的是 sql_slave_skip_counter = 1
該引數是跳過一個事務 ,是跳過一個事務,是 跳過一個事務,重要的事情說三遍,如果你的一個事務裡面包含了多個dml操作 比如4個update,第二個update出現問題,使用該引數跳過的結果是 整個事務都會被跳過去,會導致資料不一致。
binlog為row模式:
binlog為 statement格式
所以修復1032之後務必使用上面提供的工具(當然如果你們的工作環境有更好的工具也可以) 修復資料不一致。
推薦一下關於sql_slave_skip_counter 的參考資料
[1] MySQL小誤區:關於set global sql_slave_skip_counter=N 命令的一些點
[2] Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL
如果您覺得從這篇文章受益,可以贊助 北在南方 一瓶飲料 ^_^
修復1032 error的指令碼如下:
-
#!/bin/sh
-
# fetch port 1032 error recored to /tmp/record.bashc.1032.$port
-
# parament port
-
if [ -z "$1" ] ; then
-
PORT=3001
-
else
-
PORT=$1
-
fi
-
tmpfile="/tmp/record.bashc.1032.$PORT"
-
touch $tmpfile
-
if [ -f $tmpfile ] ; then
-
rm -f $tmpfile
-
fi
-
while true ; do
-
mysql -uroot -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep -i Slave_SQL_Running | grep -i no > /dev/null
-
if [ $? -eq 0 ] ; then
-
# whether 1032 ?
-
mysql -uroot -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep -i Last_SQL_Errno | grep -i 1032 > /dev/null
-
if [ $? -eq 0 ] ; then
-
table=$(mysql -uroot -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep Last_SQL_Error | awk -F 'on table ' '{print $2}' | awk -F ';' '{print $1}')
-
grep "$table" $tmpfile > /dev/null
-
if [ $? -eq 0 ] ; then
-
echo "Error $table is already exists , can't record $tmpfile , Errorno 1032"
-
mysql -h127.0.0.1 -P$PORT -Ae 'STOP SLAVE ; SET GLOBAL sql_slave_skip_counter = 1 ; SELECT SLEEP(0.1) ; START SLAVE'
-
else
-
echo "Error $table is not exists record it to $tmpfile Errorno 1032"
-
echo $table >> $tmpfile
-
mysql -uroot -h127.0.0.1 -P$PORT -Ae 'STOP SLAVE ; SET GLOBAL sql_slave_skip_counter = 1 ; SELECT SLEEP(0.1) ; START SLAVE'
-
fi
-
else
-
echo "Error , is not 1032 error , please maunal fix , infor $(mysql -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep Last_SQL_Error)"
-
fi
-
else
-
echo "IS OK , behind master : $(mysql -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep Seconds_Behind_Master | awk '{print $2}')"
-
fi
-
sleep 0.2
- done
該引數是跳過一個事務 ,是跳過一個事務,是 跳過一個事務,重要的事情說三遍,如果你的一個事務裡面包含了多個dml操作 比如4個update,第二個update出現問題,使用該引數跳過的結果是 整個事務都會被跳過去,會導致資料不一致。
binlog為row模式:
-
master> select * from t;
-
+----+-----+
-
| id | pid |
-
+----+-----+
-
| 1 | 1 |
-
| 2 | 2 |
-
| 3 | 3 |
-
+----+-----+
-
3 rows in set (0.00 sec)
-
slave> select * from t;
-
+----+-----+
-
| id | pid |
-
+----+-----+
-
| 1 | 1 |
-
| 3 | 3 |
-
+----+-----+
-
2 rows in set (0.00 sec)
-
master> BEGIN;
-
Query OK, 0 rows affected (0.00 sec)
-
master> DELETE FROM t WHERE id = 1;
-
Query OK, 1 row affected (0.00 sec)
-
master> DELETE FROM t WHERE id = 2;
-
Query OK, 1 row affected (0.00 sec)
-
master> DELETE FROM t WHERE id = 3;
-
Query OK, 1 row affected (0.00 sec)
-
master> COMMIT;
-
Query OK, 0 rows affected (0.01 sec)
-
-
-
slave> show slave status G
-
*************************** 1. row ***************************
-
...
-
Last_SQL_Errno: 1032
-
Last_SQL_Error: Could not execute Delete_rows event on table test.t; Can't find record in 't', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000002, end_log_pos 333
-
...
- 1 row in set (0.00 sec)
-
master> select * from t;
-
+----+-----+
-
| id | pid |
-
+----+-----+
-
| 4 | 1 |
-
| 6 | 3 |
-
+----+-----+
-
2 rows in set (0.00 sec)
-
slave> select * from t;
-
+----+-----+
-
| id | pid |
-
+----+-----+
-
| 4 | 1 |
-
| 5 | 2 |
-
| 6 | 3 |
-
+----+-----+
-
3 rows in set (0.00 sec)
-
master> BEGIN;
-
Query OK, 0 rows affected (0.00 sec)
-
master> delete from t where id = 4;
-
Query OK, 1 row affected (0.00 sec)
-
master> insert into t values (5,2);
-
Query OK, 1 row affected (0.00 sec)
-
master> delete from t where id = 6;
-
Query OK, 1 row affected (0.00 sec)
-
master> COMMIT;
-
Query OK, 0 rows affected (0.15 sec)
-
slave> show slave status G
-
*************************** 1. row ***************************
-
...
-
Last_SQL_Errno: 1062
-
Last_SQL_Error: Error 'Duplicate entry '5' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t values (5,2)'
-
...
-
1 row in set (0.00 sec)
-
slave> stop slave; set global sql_slave_skip_counter = 1; start slave;
-
Query OK, 0 rows affected (0.05 sec)
-
slave> select * from t;
-
+----+-----+
-
| id | pid |
-
+----+-----+
-
| 4 | 1 |
-
| 5 | 2 |
-
| 6 | 3 |
-
+----+-----+
- 3 rows in set (0.00 sec)
推薦一下關於sql_slave_skip_counter 的參考資料
[1] MySQL小誤區:關於set global sql_slave_skip_counter=N 命令的一些點
[2] Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL
如果您覺得從這篇文章受益,可以贊助 北在南方 一瓶飲料 ^_^
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-1791474/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell指令碼中如何報錯即刻退出以及如何獲取子shell指令碼的錯誤資訊:set -o errexit指令碼
- shell指令碼報錯:[: missing `]‘指令碼
- shell指令碼報錯:"[: =: unary operator expected"指令碼
- 通過shell指令碼生成資料統計資訊的報表指令碼
- 透過shell指令碼生成資料統計資訊的報表指令碼
- shell 指令碼的除錯問題指令碼除錯
- shell 指令碼報錯^M: syntax error near unexpected token指令碼Error
- Shell 系統資訊監控指令碼指令碼
- 透過shell指令碼檢視procedure的資訊指令碼
- 透過shell指令碼檢視package的資訊指令碼Package
- 通過shell指令碼檢視procedure的資訊指令碼
- 通過shell指令碼檢視package的資訊指令碼Package
- Shell指令碼 – 檢視網路介面資訊指令碼
- 透過shell指令碼檢視鎖資訊指令碼
- 通過shell指令碼檢視鎖資訊指令碼
- 透過shell指令碼得到資料字典的資訊指令碼
- 通過shell指令碼得到資料字典的資訊指令碼
- 執行shell指令碼報錯:-bash: ./test1.sh: /bin/bash^M: ...指令碼
- shell指令碼指令碼
- VUE—刪除HelloWorld.vue後報錯 `--fix` option報錯的解決Vue
- eslint --fix 報錯 can't not find modulesEsLint
- 通過shell指令碼得到資料庫的基本資訊(一)指令碼資料庫
- 通過shell指令碼檢測MySQL服務資訊指令碼MySql
- [Shell] Shell 生成 HTML指令碼HTML指令碼
- sh指令碼執行報錯指令碼
- 一個自動生成awr報告的shell指令碼指令碼
- 根據快照產生statpack報表的Shell指令碼指令碼
- shell指令碼(二)指令碼
- shell指令碼心得指令碼
- shell指令碼案例指令碼
- 常用shell指令碼指令碼
- 巧用shell指令碼生成快捷指令碼指令碼
- 解決shell指令碼錯誤$’r’ command not found指令碼
- shell指令碼執行錯誤 $‘\r‘:command not found指令碼
- 從一個shell指令碼執行出錯聊起指令碼
- DELL伺服器硬體資訊採集SHELL指令碼伺服器指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- shell指令碼實現自動生成awr報告指令碼