MySQL binlog 格式的困境?
MySQL 版本:5.5.13
如果我將 binlog 格式設置為,我會在 Master 上
STATEMENT
收到以下警告:$$ Warning $$使用語句格式寫入二進制日誌的不安全語句,因為 BINLOG_FORMAT = STATEMENT。語句是不安全的,因為它使用的系統函式可能會在從站上返回不同的值……
我還閱讀了複製儲存過程和功能的限制:http: //dev.mysql.com/doc/refman/5.5/en/stored-programs-logging.html
但如果我切換到
MIXED
,mysqld.log
在 Slave顯示:$$ Warning $$從屬 SQL:無法在表 hdcn.sessions 上執行 Update_rows 事件;在“會話”中找不到記錄,錯誤程式碼:1032;處理程序錯誤 HA_ERR_KEY_NOT_FOUND;事件的主日誌 mysql-bin.003834, end_log_pos 602692401, Error_code: 1032 $$ Warning $$從屬 SQL:無法在表 reportingdb.102_rpt_clickview 上執行 Delete_rows 事件;在 ‘102_rpt_clickview’ 中找不到記錄,Error_code: 1032; 處理程序錯誤 HA_ERR_END_OF_FILE;事件的主日誌 mysql-bin.003834, end_log_pos 725203511, Error_code: 1032
看起來
MIXED
binlog 格式導致 Master 沒有完全複製到 Slave。我切換回
STATEMENT
格式。我可以忽略不安全的警告嗎?
我假設您在一個設置中執行此操作,而沒有清理從站並從頭開始設置。
由於基於語句的複制的錯誤消息告訴您,您的應用程序使用了一些無法使用基於語句的複制來複製的命令。一個例子是這樣的查詢
INSERT INTO t (t) VALUES(NOW())
where
NOW()
將在 master 和 slave 上執行時返回不同的值。通過這樣做,您在主伺服器和從伺服器上擁有不同的數據。這很糟糕,因為根據您的從站,您的客戶端將讀取不同的數據,隨後的寫入將更改其他數據,因此您最終會得到更加不同的數據。
現在您切換到混合複製,它可能對某些語句使用基於行的複制。使用 RBR,您確實需要完全相同的數據,因為很難辨識已更改的行並更新它們。
那你該怎麼辦?- 將您的主伺服器配置為使用混合日誌記錄,然後使用一致的快照設置從伺服器。