前段時(shí)間,公司一臺(tái)從服務(wù)機(jī)斷電關(guān)機(jī)了,再起來的時(shí)候,
我們查看 show slave status
從庫已經(jīng)和主庫查了好幾個(gè)日志文件了,那么我們現(xiàn)在能做的是什么呢?
首先,首先,首先,
關(guān)注以下這幾個(gè)參數(shù)
Master_Log_File: mysql-bin.000*** //主庫現(xiàn)在最新的日志文件版本
Relay_Master_Log_File: mysql-bin.000***//從庫現(xiàn)在執(zhí)行的主庫日志文件版本
Slave_IO_Running: Yes//主從數(shù)據(jù)庫之前的數(shù)據(jù)傳輸通道是否正常
Slave_SQL_Running: Yes//從庫的執(zhí)行日志腳本是否正常
Exec_Master_Log_Pos: 22563785//從庫執(zhí)行主庫日志腳本到哪個(gè)文件位置了
Seconds_Behind_Master: 0//可以理解為主從延遲的時(shí)間差,此值越大,延遲越明顯
那么出現(xiàn)延遲了,就要恢復(fù)同步,一般情況下是因?yàn)閺膸靾?zhí)行sql的時(shí)候發(fā)生了錯(cuò)誤,導(dǎo)致Slave_SQL_Running=no 所以就會(huì)越來越大的延遲.
Last_SQL_Error//最近一次的從庫執(zhí)行sql的異常信息
Last_SQL_Errno//最近一次從庫執(zhí)行主庫日志文件異常的code碼
以下列舉了一些較為常見的錯(cuò)誤碼
1007:數(shù)據(jù)庫已存在,創(chuàng)建數(shù)據(jù)庫失敗
?1008:數(shù)據(jù)庫不存在,刪除數(shù)據(jù)庫失敗
?1050:數(shù)據(jù)表已存在,創(chuàng)建數(shù)據(jù)表失敗
?1051:數(shù)據(jù)表不存在,刪除數(shù)據(jù)表失敗
?1054:字段不存在,或程序文件跟數(shù)據(jù)庫有沖突
?1060:字段重復(fù),導(dǎo)致無法插入
?1061:重復(fù)鍵名
?1068:定義了多個(gè)主鍵
?1094:位置線程ID
?1146:數(shù)據(jù)表缺失,請(qǐng)恢復(fù)數(shù)據(jù)庫
?1053:復(fù)制過程中主服務(wù)器宕機(jī)
1062:主鍵沖突 Duplicate entry '%s' for key %d
那么只需要看一下?Last_SQL_Error的提示,來解決掉這個(gè)問題,就可以了,如果這個(gè)錯(cuò)誤無關(guān)緊要,就比如?1062:主鍵沖突 Duplicate entry '%s' for key %d 此類錯(cuò)誤
那么直接
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave;
就可以恢復(fù)同步了.
但是如果還會(huì)持續(xù)出現(xiàn)此類問題,那么在你覺得安全的情況下可以去 mysql.cnf 里面
將
slave_skip_errors=error_code,error_code
保存my.cnf
重啟mysql
那么此err_code的問題就不會(huì)出現(xiàn)了.
如果出現(xiàn)了
Last_Error: Relay log read failure: Could not parse relay log event entry.
此類的問題,那么就證明了,在從庫執(zhí)行同步操作的時(shí)間,突然斷電,引起一個(gè)事件沒有執(zhí)行完,但是Exec_Master_Log_Pos卻記錄下來的此時(shí)的處理字節(jié)地址.
此時(shí)我們就需要重新設(shè)置從庫同步主庫的日志文件和讀取文件字節(jié)碼位置.
那么這個(gè)日志文件一般來說就是??Relay_Master_Log_File所指的文件版本
字節(jié)碼位置怎么確定呢?那就需要去主庫里的這個(gè)日志文件里面去查找Exec_Master_Log_Pos 所展示的值附近的事件.
怎么找呢?
用以下的命令
mysql->?show binlog events in 'mysql-bin.000***' limit ****,1;
命令展示出來的結(jié)果里面有Pos這個(gè)字段,那么就一直找這個(gè)pos在Exec_Master_Log_Pos之錢的事件的最接近的pos. 就是我們要找的 pos
那么在從庫上執(zhí)行
stop slave;
change master to master_log_file='mysql-bin.***', master_log_pos=pos;
start slave;
基本上我們就重新設(shè)置好了同步位置.最后查看一下
show slave status;
下面加上一個(gè)其他同步數(shù)據(jù)庫問題的解決辦法的文章
https://yq.aliyun.com/articles/27685
也希望大家看一下,希望能給大家提供一點(diǎn)幫助