MySQL Master Slave Replication Error 1062 (14/08/09更新)
- Category: 電腦相關
- Last Updated: Sunday, 10 August 2014 17:22
- Published: Wednesday, 23 July 2014 22:27
- Written by sam
安裝、設定都不難
難在除錯…
剛好閒著來看一下Replication運行的如何
想不到一看就看到GG了…
[root@ip-172-31-12-172 html]# mysql -e 'show slave status\G'
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:
Master_User:
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mylogbin.000001
Read_Master_Log_Pos: 2193370
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 99060
Relay_Master_Log_File: mylogbin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: joomla
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '217' for key 'PRIMARY'' on query. Default database: 'joomla'. Query: 'INSERT INTO `jos_content` (`id`,`title`,`alias`,`introtext`,`fulltext`,`state`,`sectionid`,`catid`,`created`,`created_by`,`created_by_alias`,`checked_out`,`checked_out_time`,`publish_up`,`publish_down`,`version`,`ordering`,`metakey`,`metadesc`,`access` ) VALUES ( '0','AUTO MySQL Master Slave Replication UPDATE','auto-mysql-master-slave-replication-update','\r\n
Skip_Counter: 0
Exec_Master_Log_Pos: 98915
Relay_Log_Space: 2193672
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '217' for key 'PRIMARY'' on query. Default database: 'joomla'. Query: 'INSERT INTO `jos_content` ( `id`,`title`,`alias`,`introtext`,`fulltext`,`state`,`sectionid`,`catid`,`created`,`created_by`,`created_by_alias`,`checked_out`,`checked_out_time`,`publish_up`,`publish_down`,`version`,`ordering`,`metakey`,`metadesc`,`access` ) VALUES ( '0','AUTO MySQL Master Slave Replication UPDATE','auto-mysql-master-slave-replication-upda te','\r\n
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
未免來的太快了吧
Error Number 1062
照提示是主鍵無法更新進去
通常網路的解法就是兩種
1.SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
把錯誤加1,也就是跳過去…
2. slave_skip_errors = 1062
這個就更棒了…到my.cnf設定檔把這個錯誤1062代碼無視
以上都能解決問題(不看到就沒事…
先分別查看主、從的主機內容是否真的一致
[root@ip-172-31-12-172 html]# mysql -e 'select count(*) from joomla.jos_content where id=217'
+----------+
| count(*) |
+----------+
| 1 |
+----------+
上面的表名及條件請自行依錯誤提示修改
一定要主、從架構的主機都是真的相同
運氣好相同的話,就請執行
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;
但通常都是不同的…所以報錯
而以上的兩種方法,則都是略過錯誤
正常來說的話…是應該要將該筆報錯的刪掉(但通常會有很多筆…
所以需要寫個SHELL了
#!/bin/bash
#Delete duplicate records primary key conflict ERROR NUM 1062
#By Sam 14/07/24
DB=`mysql -e 'show slave status\G' |grep Last_Error |awk '{print $13}' |awk -F "'" '{print $2}'`
Slave_SQL_Running=`mysql -e 'show slave status\G' |egrep 'Slave_SQL_Running' |awk '{print $2}'`
Last_SQL_Errno=`mysql -e 'show slave status\G' |egrep Last_Errno |awk '{print $2}'`
Duplicate=`mysql -e 'show slave status\G' |grep Last_Error |awk '/Duplicate entry/{print $5}' |awk -F "'" '{print $2}'`
TABLE=`mysql -e 'show slave status\G' |grep Last_Error |awk -F ":" '{print $4}' |awk '{print $3}' |sed 's/\''\/""/g'`
if [ "$Slave_SQL_Running" == No ] && [ "$Last_SQL_Errno" == 1062 ]; then
PRIKEY=`mysql -e "desc $DB.$TABLE" |grep PRI |awk '{print $1}'`
mysql -e "delete from $DB.$TABLE where $PRIKEY=$Duplicate"
mysql -e 'start slave sql_thread'
else
echo "Normal and nothing to do"
fi
如果要一次解決…可以改用while true do (joomla裝新程式碼套件…試一下 Hs Highlighter
#!/bin/bash
#Delete duplicate records primary key conflict ERROR NUM 1062
#By Sam 14/08/05
echo `date +"%c"`
Slave_SQL_Running=`mysql -e 'show slave status\G' |egrep 'Slave_SQL_Running' |awk '{print $2}'`
Last_SQL_Errno=`mysql -e 'show slave status\G' |egrep Last_Errno |awk '{print $2}'`
while [ "$Slave_SQL_Running" == No ] && [ "$Last_SQL_Errno" == 1062 ]; do
echo `mysql -e 'show slave status\G'`
DB=`mysql -e 'show slave status\G' |grep Last_Error |awk '{print $13}' |awk -F "'" '{print $2}'`
TABLE=`mysql -e 'show slave status\G' |grep Last_Error |sed 's/\`//g' |awk -F ":" '{print $4}' |awk '{print $3}'`
PRIKEY=`mysql -e "desc $DB.$TABLE" |grep PRI |awk '{print $1}'`
Duplicate=`mysql -e 'show slave status\G' |grep Last_Error |awk '/Duplicate entry/{print $5}' |awk -F "'" '{print $2}'`
mysql -e "delete from $DB.$TABLE where $PRIKEY=$Duplicate"
mysql -e "start slave sql_thread"
Slave_SQL_Running=`mysql -e 'show slave status\G' |egrep 'Slave_SQL_Running' |awk '{print $2}'`
Last_SQL_Errno=`mysql -e 'show slave status\G' |egrep Last_Errno |awk '{print $2}'`
done
但我是用來作一次性的…或是懶的話…也可以弄進cron…又省事了些!!!
一切又正常了
[root@ip-172-31-12-172 html]# mysql -e 'show slave status\G'
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host:
Master_User:
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mylogbin.000001
Read_Master_Log_Pos: 2218077
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 2218222
Relay_Master_Log_File: mylogbin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: joomla
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 2218077
Relay_Log_Space: 2218379
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
###14/08/09### 更新一下
修正當出現不同的字串…會無法動作
[root@ip-172-31-12-172 ~]# mysql -e 'show slave status\G'
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 114.43.123.19
Master_User:
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mylogbin.000006
Read_Master_Log_Pos: 354520
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 13797802
Relay_Master_Log_File: mylogbin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '2014-08-05 11:00:00-2-1' for key 'PRIMARY'' on query. Default database: 'joomla'. Query: 'INSERT INTO sam_banner_tracks
(`count`,`track_type`,`banner_id`,`track_date`) VALUES
(1, 2,1,'2014-08-05 11')'
Skip_Counter: 0
Exec_Master_Log_Pos: 13797657
Relay_Log_Space: 29610586
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '2014-08-05 11:00:00-2-1' for key 'PRIMARY'' on query. Default database: 'joomla'. Query: 'INSERT INTO sam_banner_tracks
(`count`,`track_type`,`banner_id`,`track_date`) VALUES
(1, 2,1,'2014-08-05 11')'
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
新的程式碼,針對新字串"日期"格式修正
#!/bin/bash
#Delete duplicate records primary key conflict ERROR NUM 1062
#By Sam 14/08/09
echo `date +"%c"`
Slave_SQL_Running=`mysql -e 'show slave status\G' |egrep 'Slave_SQL_Running' |awk '{print $2}'`
Last_SQL_Errno=`mysql -e 'show slave status\G' |egrep Last_Errno |awk '{print $2}'`
while [ "$Slave_SQL_Running" == No ] && [ "$Last_SQL_Errno" == 1062 ]; do
echo `mysql -e 'show slave status\G'`
DB=`mysql -e 'show slave status\G' |grep Last_Error |awk -F"'" '{print $8}'`
TABLE=`mysql -e 'show slave status\G' |grep Last_Error |awk -F "'" '{print $10}' |awk '{print $3}' |sed 's/\`//g'`
PRIKEY=`mysql -e "desc $DB.$TABLE" |grep PRI |awk 'NR==1{print $1}'`
mysql -e 'show slave status\G' |grep Last_Error |awk -F"'" '{print $3}' > $$.dup
grep -q " " /root/$$.dup $1
if [ $? == 0 ]; then
Duplicate=`mysql -e 'show slave status\G' |grep Last_Error |awk -F"'" '{print $3}' |awk -F"-" '{print $1"-"$2"-"$3}'`
mysql -e "delete from $DB.$TABLE where $PRIKEY='$Duplicate'"
mysql -e "start slave sql_thread"
else
Duplicate=`mysql -e 'show slave status\G' |grep Last_Error |awk -F"'" '{print $3}'`
mysql -e "delete from $DB.$TABLE where $PRIKEY='$Duplicate'"
mysql -e "start slave sql_thread"
fi
Slave_SQL_Running=`mysql -e 'show slave status\G' |egrep 'Slave_SQL_Running' |awk '{print $2}'`
Last_SQL_Errno=`mysql -e 'show slave status\G' |egrep Last_Errno |awk '{print $2}'`
rm -rf /root/$$.dup
done