2017-09-21 71 views
0

我有一個MySQL複製的問題 - 在主服務器上有一個表沒有出現在從屬服務器上。 master和slave都具有相同的master_log_file和master_log_position,slave_io和slave_sql線程都在運行,我甚至試圖向master數據庫添加一個空表,但它確實出現在slave數據庫上。這不是我第一次得到這樣的錯誤,但在此之前,我的symptopms是新數據沒有出現在從屬數據庫中。有沒有其他的解決方案,比停止複製奴隸,刪除數據庫,轉儲它在主服務器,rsyncing從服務器和重新啓動複製從新的文件/位置?MYSQL複製不適用於所有表

我注意到使用

SHOW SLAVE STATUS; 

即RELAY_LOG_POS比Read_Master_Log_Pos小,RELAY_LOG_FILE從MASTER_LOG_FILE不同,但Slave_SQL_Running_State說

Slave has read all relay log; waiting for more updates 

說的Seconds_Behind_Master 0

+0

首先,Relay_Log_Pos和Read_Master_Log_Pos是不同的值,可以不同,這很好。對於你的複製:你使用相同的mysql版本和配置嗎?如果您運行的聲明依賴於其他服務器不支持/已禁用的功能,則可能會出現類似這樣的問題。你有沒有嘗試創建一個相同的表(使用不同的名稱)到不復制的表來檢查表是否使用了某些在從屬上不起作用的表? – Solarflare

+1

是否爲replicate_do_db/replicate_do_table設置了任何值?這些在my.cnf中,並且處於奴隸狀態。重新振作痛苦 - 同意。你是什​​麼binlog_format?行,混合,聲明?用mysqlbinlog檢查binlog的內容 - 確保它在那裏,否則,它絕對不會複製... –

+0

@KevinBott我沒有爲replicate_do_db設置值,我用binlog_do_db在主端進行過濾,我的binlog_format是混合。 – baskax

回答

1

MySQL的官方只支持複製到下一個更高版本(雖然它可以工作在5.7.13+以上),請參閱Replication Compatibility Between MySQL Versions

MySQL支持從一個發行版系列到下一個更高版本系列的複製。例如,您可以從運行MySQL 5.5的主服務器複製到運行MySQL 5.6的從服務器,從運行MySQL 5.6的主服務器到運行MySQL 5.7的從服務器等等。

但是,如果主站使用語句或依賴於從站上使用的MySQL版本不再支持的行爲,則從較舊的主站複製到較新的從站時可能會遇到困難。

默認情況下,如果發生錯誤,複製將停止,並且必須重新啓動它(修復錯誤後)。但是如果使用--slave-skip-errors=all - 選項,它會跳過這些錯誤:

通常情況下,當奴隸,這給您解決在手動將數據不一致的機會出現錯誤複製停止。當語句返回選項值中列出的任何錯誤時,此選項會導致從屬SQL線程繼續複製。

請不要使用此選項,除非您完全明白爲什麼您會收到錯誤。如果您的複製設置和客戶端程序中沒有錯誤,並且MySQL本身沒有錯誤,則永遠不會發生停止複製的錯誤。不分青紅皁白地使用這個選項會導致奴隸變得無法與主人同步,你不知道爲什麼會發生這種情況。

MySQL 5.5。和5.7。實際上對於很多陳述行爲會有所不同,因此在這種情況下啓用此選項將需要更多的關注。

沒有看到您的實際table create -statement,目前尚不清楚究竟是什麼原因造成了這個問題,以及如何解決它(或者如果可能的話),但您應該特別檢查您的配置設置。 MySQL 5.7。因此,不相容的嫌疑人通常是例如日期/時間戳列(例如default '0000-00-00'(顯式或隱式))的零默認值不再允許,請參閱no_zero_date

即使您對100%的複製(可能雪球速度非常快,但這取決於您的場景進行評估)似乎並不太熱衷,至少重置您的從站(在修復了例如配置設置之後)至少一次可能是最簡單的解決方案,因爲可能有其他一些你可能錯過的事情,如果執行沒有錯誤,也將重新檢查,如果你的表格和數據直到現在與你的5.7-從屬設備兼容。