在執行時切換 binlog 格式最安全的方法是什麼?
由於以下警告
mysqld.log
:$$ Warning $$使用語句格式寫入二進制日誌的不安全語句,因為 BINLOG_FORMAT = STATEMENT。該語句是不安全的,因為它使用了 LIMIT 子句。這是不安全的,因為包含的行集無法預測。
我想將複製格式切換為
MIXED
.但根據 MySQL 文件:
當存在任何臨時表時,不建議在執行時切換複製格式,因為只有在使用基於語句的複制時才會記錄臨時表,而使用基於行的複制時不會記錄臨時表。
那麼,問題是如何辨識是否存在臨時表來安全地切換二進制日誌格式?
由於在您執行此操作時二進制日誌將具有特定格式,因此您可能決定不將這兩種格式一起賭博,儘管 MySQL (eh Oracle
$$ still can’t roll off my tongue $$) 建構了此功能。 要在不重新啟動 mysql 的情況下完全安全地播放它,請嘗試以下操作:
FLUSH TABLES WITH READ LOCK; FLUSH LOGS; SET GLOBAL binlog_format = 'MIXED'; FLUSH LOGS; UNLOCK TABLES;
這將使最後一個二進制日誌保持“混合”格式。倒數第二個(倒數第二個)二進制日誌的存在只是關閉了先前格式的最後一個二進制日誌。
一旦執行,第一個之前的所有現有會話
FLUSH LOGS;
都將開始寫入最後一個 binlog 。UNLOCK TABLES;
試一試 !!!
警告
在應得的地方給予信任,我的回答真的是從@Jonathan的回答中捎帶。我只是在此基礎上關閉並打開二進制日誌。他因為首先提出這個而得到+1。
更新 2011-10-12 13:58 EDT
如果您對活動的 Master 執行此操作,並且有一個或多個 Slave 從該 Master 複製,則您需要關注中繼日誌也採用新格式。這是您可以執行的操作:
在奴隸上,執行
STOP SLAVE;
在 Master 上執行這些:
FLUSH TABLES WITH READ LOCK; FLUSH LOGS; SET GLOBAL binlog_format = 'MIXED'; FLUSH LOGS; UNLOCK TABLES;
在奴隸上,執行
START SLAVE;
執行
STOP SLAVE;
和START SLAVE;
輪換中繼日誌並導致新條目被複製,無論它採用哪種格式。您可能還想在從站中應用 binlog_format 更改。