文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  混合式二進位日誌格式

7.4.4.3 混合式二進位日誌格式

當以 MIXED 日誌格式執行時,伺服器會在下列情況下自動從基於陳述式的記錄切換為基於列的記錄

在 MySQL 8.0 之前的版本中,當使用混合式二進位日誌格式時,如果陳述式依列記錄,且執行陳述式的工作階段有任何暫時資料表,則所有後續陳述式都會被視為不安全,並以基於列的格式記錄,直到該工作階段使用的所有暫時資料表都被捨棄為止。在 MySQL 9.0 中,暫時資料表上的作業不會以混合式二進位日誌格式記錄,且工作階段中存在暫時資料表不會影響每個陳述式使用的記錄模式。

注意

如果您嘗試使用基於陳述式的記錄執行應使用基於列的記錄寫入的陳述式,則會產生警告。警告會顯示在用戶端中(在 SHOW WARNINGS 的輸出中)和透過 mysqld 錯誤日誌顯示。每次執行此類陳述式時,都會在 SHOW WARNINGS 資料表中新增警告。但是,為了防止日誌氾濫,只有每個用戶端工作階段產生警告的第一個陳述式會寫入錯誤日誌。

除了上述決定外,個別引擎也可以決定更新資料表中的資訊時所使用的記錄格式。個別引擎的記錄功能可以定義如下

  • 如果引擎支援以列為基礎的記錄,則該引擎被稱為具備列記錄能力

  • 如果引擎支援以語句為基礎的記錄,則該引擎被稱為具備語句記錄能力

一個特定的儲存引擎可以支援其中一種或兩種記錄格式。下表列出每個引擎支援的格式。

儲存引擎 支援列記錄 支援語句記錄
ARCHIVE
BLACKHOLE
CSV
EXAMPLE
FEDERATED
HEAP
InnoDB 當交易隔離等級為 REPEATABLE READSERIALIZABLE 時為「是」;否則為「否」。
MyISAM
MERGE
NDB

是否要記錄語句以及要使用的記錄模式,取決於語句的類型(安全、不安全或二進位注入)、二進位記錄格式(STATEMENTROWMIXED)以及儲存引擎的記錄能力(具備語句能力、具備列能力、兩者皆具備或兩者皆不具備)。(二進位注入是指必須使用 ROW 格式記錄的變更。)

語句可以記錄,也可以不記錄警告;失敗的語句不會記錄,但會在日誌中產生錯誤。這顯示在以下的決策表中。類型binlog_formatSLCRLC 欄概述條件,而 錯誤/警告記錄為 欄代表相應的動作。SLC 代表 具備語句記錄能力,而 RLC 代表 具備列記錄能力

類型 binlog_format SLC RLC 錯誤/警告 記錄為
* * 錯誤:無法執行語句:由於至少有一個引擎既不具備列記錄能力也不具備語句記錄能力,因此無法進行二進位記錄。 -
安全 STATEMENT - STATEMENT
安全 MIXED - STATEMENT
安全 ROW 錯誤:無法執行語句:由於 BINLOG_FORMAT = ROW 且至少有一個表格使用不具備以列為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
不安全 STATEMENT 警告:不安全語句以語句格式記錄到二進位日誌,因為 BINLOG_FORMAT = STATEMENT STATEMENT
不安全 MIXED 錯誤:無法執行語句:當儲存引擎僅限於以語句為基礎的記錄時,即使 BINLOG_FORMAT = MIXED,也無法對不安全語句進行二進位記錄。 -
不安全 ROW 錯誤:無法執行語句:由於 BINLOG_FORMAT = ROW 且至少有一個表格使用不具備以列為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
列注入 STATEMENT 錯誤:無法執行列注入:由於至少有一個表格使用不具備以列為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
列注入 MIXED 錯誤:無法執行列注入:由於至少有一個表格使用不具備以列為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
列注入 ROW 錯誤:無法執行列注入:由於至少有一個表格使用不具備以列為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
安全 STATEMENT 錯誤:無法執行語句:由於 BINLOG_FORMAT = STATEMENT 且至少有一個表格使用不具備以語句為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
安全 MIXED - ROW
安全 ROW - ROW
不安全 STATEMENT 錯誤:無法執行語句:由於 BINLOG_FORMAT = STATEMENT 且至少有一個表格使用不具備以語句為基礎的記錄能力的儲存引擎,因此無法進行二進位記錄。 -
不安全 MIXED - ROW
不安全 ROW - ROW
列注入 STATEMENT 錯誤:無法執行列注入:由於 BINLOG_FORMAT = STATEMENT,因此無法進行二進位記錄。 -
列注入 MIXED - ROW
列注入 ROW - ROW
安全 STATEMENT - STATEMENT
安全 MIXED - STATEMENT
安全 ROW - ROW
不安全 STATEMENT 警告:不安全語句以語句格式記錄到二進位日誌,因為 BINLOG_FORMAT = STATEMENT STATEMENT
不安全 MIXED - ROW
不安全 ROW - ROW
列注入 STATEMENT 錯誤:無法執行列注入:由於 BINLOG_FORMAT = STATEMENT,因此無法進行二進位記錄。 -
列注入 MIXED - ROW
列注入 ROW - ROW

當判斷產生警告時,會產生標準的 MySQL 警告(可以使用 SHOW WARNINGS 檢視)。該資訊也會寫入 mysqld 錯誤日誌。每個客戶端連線的每個錯誤實例只記錄一個錯誤,以防止日誌氾濫。日誌訊息包含嘗試執行的 SQL 語句。

如果複本的 log_error_verbosity 設定為顯示警告,複本會將訊息列印到錯誤日誌中,以提供其狀態的資訊,例如它開始工作的二進位日誌和中繼日誌座標、何時切換到另一個中繼日誌、中斷連線後重新連線時、不適合以語句為基礎的記錄的不安全語句等等。