文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  混合二進制日誌格式

7.4.4.3 混合二進制日誌格式

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

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

注意

如果您嘗試使用基於語句的日誌記錄來執行應使用基於列的日誌記錄來寫入的語句,則會產生警告。該警告會顯示在用戶端(在 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 設定為顯示警告,則複本會將訊息列印到錯誤日誌,以提供其狀態的相關資訊,例如其開始工作的二進位日誌和中繼日誌座標、何時切換到另一個中繼日誌、在斷線後重新連線的時間、不適用於基於語句的日誌記錄的語句等等。