【Shell】fix 1032报错信息的脚本
生活随笔
收集整理的這篇文章主要介紹了
【Shell】fix 1032报错信息的脚本
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?生產(chǎn)環(huán)境總會(huì)遇到由于各種原因?qū)е碌闹鲝膹?fù)制不一致的情況,導(dǎo)致slave出現(xiàn) 1032報(bào)錯(cuò)。為了使主從關(guān)系能夠穩(wěn)定的運(yùn)行,大多時(shí)候可以選擇修復(fù)1032 報(bào)錯(cuò) ,先跳過(guò)去 ,然后使用?percona??的工具?pt-table-checksum 和?pt-table-sync?進(jìn)行校驗(yàn)和修復(fù) 。?
修復(fù)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 使用該腳本需要注意的是?sql_slave_skip_counter = 1?
該參數(shù)是跳過(guò)一個(gè)事務(wù) ,是跳過(guò)一個(gè)事務(wù),是 跳過(guò)一個(gè)事務(wù),重要的事情說(shuō)三遍,如果你的一個(gè)事務(wù)里面包含了多個(gè)dml操作 比如4個(gè)update,第二個(gè)update出現(xiàn)問(wèn)題,使用該參數(shù)跳過(guò)的結(jié)果是 整個(gè)事務(wù)都會(huì)被跳過(guò)去,會(huì)導(dǎo)致數(shù)據(jù)不一致。
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) binlog為 statement格式
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) 所以修復(fù)1032之后務(wù)必使用上面提供的工具(當(dāng)然如果你們的工作環(huán)境有更好的工具也可以)?修復(fù)數(shù)據(jù)不一致。
推薦一下關(guān)于sql_slave_skip_counter 的參考資料
[1]?MySQL小誤區(qū):關(guān)于set global sql_slave_skip_counter=N 命令的一些點(diǎn)
[2]?Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL
如果您覺(jué)得從這篇文章受益,可以贊助?北在南方?一瓶飲料 ^_^
修復(fù)1032 error的腳本如下:
該參數(shù)是跳過(guò)一個(gè)事務(wù) ,是跳過(guò)一個(gè)事務(wù),是 跳過(guò)一個(gè)事務(wù),重要的事情說(shuō)三遍,如果你的一個(gè)事務(wù)里面包含了多個(gè)dml操作 比如4個(gè)update,第二個(gè)update出現(xiàn)問(wèn)題,使用該參數(shù)跳過(guò)的結(jié)果是 整個(gè)事務(wù)都會(huì)被跳過(guò)去,會(huì)導(dǎo)致數(shù)據(jù)不一致。
binlog為row模式:
推薦一下關(guān)于sql_slave_skip_counter 的參考資料
[1]?MySQL小誤區(qū):關(guān)于set global sql_slave_skip_counter=N 命令的一些點(diǎn)
[2]?Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL
如果您覺(jué)得從這篇文章受益,可以贊助?北在南方?一瓶飲料 ^_^
總結(jié)
以上是生活随笔為你收集整理的【Shell】fix 1032报错信息的脚本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 精品软件 推荐 百度杀毒 软件
- 下一篇: OK335xS CAN device r