一次簡單的處理mysql主從數(shù)據(jù)庫同步的問題

前段時(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)幫助

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容