Mysql

在執行時切換 binlog 格式最安全的方法是什麼?

  • March 2, 2021

由於以下警告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 更改。

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