Mysql

奇怪的 MySQL 複製錯誤 1146(表不存在)

  • February 22, 2022

我收到了一個非常奇怪的 MySQL 複製錯誤 No. 1146,用於REPLACE INTO在從屬主機上從主機複製所有數據庫中的所有表的查詢,我很難理解為什麼。

這是我的場景:

  1. 新數據僅在主伺服器 MySQL 5.5.40 上生成。
  2. 從機 A,MySQL 5.5.38,已經從這個主伺服器複製所有數據庫中的所有表很長時間了,沒有產生任何錯誤。
  3. IO_THREAD在從站 A 上暫停。確認Relay_Master_Log_File的值與**Master_Log_File的值匹配,並確認Exec_Master_Log_Pos的值與**Read_Master_Log_Pos的值匹配。
  4. AFLUSH TABLES WITH READ LOCK在從機 A 上發出,隨後從它生成了所有 db 的轉儲mysqldump -v -h localhost -u root -p --all-databases --opt --single-transaction --hex-blob --no-autocommit > dump.sql。只有在dump完成後才釋放鎖,然後重新啟動slave IO_THREAD;從主伺服器的複制恢復沒有任何問題,並且在從伺服器 A 上繼續順利執行到今天。
  5. mysql -h localhost -u root -p < dump.sql在確認第二台主機上不存在目標數據庫(實際上除了 mysql 數據庫和資訊和性能模式之外沒有其他數據庫)之後,轉儲被轉移到從機 B,MySQL 5.5.34,並通過一個簡單的命令成功載入到其中)。由於兩台主機上匹配的 RMD160 校驗和,我還可以在傳輸到從機 B 後確認轉儲文件的完整性。
  6. 從站 B 指向主伺服器進行複制,其中MASTER_LOG_FILEMASTER_LOG_POS座標分別設置為上述步驟 3 中從從站 A 記錄的Relay_Master_Log_FileExec_Master_Log_Pos的值。
  7. 從 B 上開始複製,數據開始流入就好了。

然而,經過大約一天的平穩執行,從機 B 在其SQL_THREAD中產生了以下錯誤:

Error 'Table 'knet.course_location_tracks' doesn't exist' on query. Default database: 'knet'. Query: 'REPLACE INTO `course_location_tracks` (`userid`,`courseid`,`lesson_location`,`datestamp`) VALUES (val1,val2,val3,val4)'

(實際行值已被刪除)

我無法理解這個錯誤,因為我不僅可以確認knet.course_location_tracks表存在於從站 B 上,而且它的定義與從站 A 上相應表的定義相同。正如我指出的,從站 A以上,繼續從master複製到今天,沒有任何問題。

如果從 B 上的複制開始正常,這使我相信初始複製座標是在轉儲點從從 A 的狀態正確計算出來的,為什麼我會為確實存在於主持人?此外,為什麼我在從 B 上得到錯誤,而從 A 仍在順利複製?

除了我的三台主機上的 MySQL 版本不匹配(我最近在嘗試調試問題時才注意到這一點,我會盡快糾正),我可能做錯了什麼?

最後,一旦確定並糾正了問題,我怎樣才能讓從屬 B 在正確的點恢復複製,以便它再次與主控完全同步?

提前感謝您的幫助!

PS:如果重要的話,從 A 上的複制最初是通過以類似方式將 master 中的所有 db 和表傳輸到它來設置的,即首先用讀鎖刷新和阻塞 master 上的所有表,用mysqldump轉儲數據(相同的標誌),最後使用相同的mysql命令行客戶端呼叫將它們載入到從屬設備中。

不太清楚為什麼,但是在我採取一些故障排除步驟來追捕罪魁禍首之後,這個問題就消失了。可能是打開文件的限制導致打開 MyISAM 表時出錯,可能是因為在 slave2 伺服器上執行的其他服務的高活動性,例如 Rackspace 的雲備份……但是,無論哪種情況,複製一直執行順利在我的主伺服器上的 slave2 上已經有幾個星期了,在再次載入它之後,使用從 slave1 拍攝的新數據快照,其方式與我最初的問題中描述的方式相同。

所以,雖然很遺憾我無法為這個問題提供一個明確的答案,但我可以肯定地說它看起來已經解決了。所以我暫時關閉這個文章。

引用自:https://dba.stackexchange.com/questions/83544