Mysql

mysql 複製主 5.5 從 5.1 創建數據庫時出錯

  • May 8, 2015

我有一個複制系統,其中我的主伺服器有 mysql 5.5 版本,而從伺服器是 mysql 5.1。我知道這是不支持的,因為從版本應該大於主版本,但我們還不能升級。

一切都很好,直到在主伺服器中創建了一個新數據庫,然後從伺服器複製失敗並顯示錯誤:

Query caused different errors on master and slave.     
Error on master: message (format)=
'Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. 
Please use mysql_upgrade to fix this error.' error code=1558 ; Error on slave: actual message='no error', error code=0. Default database: 'newdb'. Query: 'DROP DATABASE newdb'

我的解決方法是:

set global sql_slave_skip_counter=2;
create database newdb;
start slave

在對所有數據庫表進行校驗和之後,一切似乎都正常,但是我們有一個糟糕的應用程序,它經常創建數據庫,所以我想知道是否有一種方法可以不使用編碼來解決問題,而無需手動創建數據庫.

主伺服器生成的每個複制事件都包含錯誤程式碼,該錯誤程式碼是執行生成該事件的查詢所導致的。這通常是“成功”(0,沒有錯誤)。

當 slave 執行查詢時,它期望遇到的錯誤與 master 遇到的錯誤相同(同樣,通常是“無錯誤”)。如果沒有發生這種情況,複製就會停止。請注意,來自 master 的錯誤消息不會被保留,只是程式碼。這就是您在錯誤消息中看到佔位符的原因,因為從站顯示sprintf()錯誤消息的模板。

但請注意,錯誤在哪裡。

檢查主伺服器的錯誤日誌。

看起來好像 master 沒有正確升級到 MySQL 5.5;具體來說,該實用程序似乎mysql_upgrade沒有用於升級系統表以與 MySQL 5.5 完全兼容。

http://dev.mysql.com/doc/refman/5.5/en/mysql-upgrade.html

您確實正在執行不受支持的配置,具有較新的主伺服器和較舊的從伺服器……但在這種情況下,您的伺服器似乎存在與複製無關的問題。

Error on master: 
message (format)=
'Column count of mysql.%s is wrong. Expected %d, found %d.  Created with MySQL %d, now running %d. 
Please use mysql_upgrade to fix this error.' 
error code=1558 ; 

主控遇到錯誤;您可能會在 master 的日誌中發現類似的錯誤,儘管它們可能僅在啟動時發生,如果有的話。無論如何,您的應用程序也應該看到這個錯誤……也許它忽略了它。:(

從站在執行實際查詢時沒有遇到任何錯誤。

Error on slave: actual message='no error', error code=0.

我突然想到mysql_upgrade,由於從伺服器較舊,因此無法安全地複制 by 執行的操作非常重要。事實證明,這是在設計中預期的,因此該mysql_upgrade實用程序似乎可以安全地在主設備上執行,而無需斷開從設備的連接,即使從設備較舊(或已經升級)。根據原始碼中的這條評論mysql_upgrade.c

Master and slave should be upgraded separately. 
All statements executed by mysql_upgrade will not be binlogged.

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