您可以使用本節中描述的 mysqld 選項和系統變數來影響二進制日誌的運作,以及控制哪些陳述式寫入二進制日誌。有關二進制日誌的更多資訊,請參閱第 7.4.4 節,「二進制日誌」。有關使用 MySQL 伺服器選項和系統變數的更多資訊,請參閱第 7.1.7 節,「伺服器命令選項」和第 7.1.8 節,「伺服器系統變數」。
以下列表描述用於啟用和設定二進制日誌的啟動選項。本節稍後將討論用於二進制日誌的系統變數。
-
命令列格式 --binlog-row-event-max-size=#
系統變數 binlog_row_event_max_size
範圍 全域 動態 否 SET_VAR
提示適用否 類型 整數 預設值 8192
最小值 256
最大值 (64 位元平台) 18446744073709551615
最大值 (32 位元平台) 4294967295
單位 位元組 當使用基於列的二進制日誌記錄時,此設定是對基於列的二進制日誌事件最大大小(以位元組為單位)的軟性限制。在可能的情況下,二進制日誌中儲存的列會分組到大小不超過此設定值的事件中。如果無法分割事件,則可能會超過最大大小。該值必須是 256 的倍數(否則會向下捨入為 256 的倍數)。預設值為 8192 位元組。
-
命令列格式 --log-bin=file_name
類型 檔案名稱 指定用於二進制日誌檔案的基本名稱。啟用二進制日誌記錄後,伺服器會將所有變更資料的陳述式記錄到二進制日誌中,該日誌用於備份和複製。二進制日誌是一系列具有基本名稱和數字擴展名的檔案。
--log-bin
選項的值是日誌序列的基本名稱。伺服器會通過在基本名稱後添加數字後綴來依序建立二進制日誌檔案。如果您不提供
--log-bin
選項,MySQL 會使用binlog
作為二進制日誌檔案的預設基本名稱。為了與早期版本相容,如果您提供的--log-bin
選項沒有字串或為空字串,則基本名稱預設為
,使用主機的名稱。host_name
-bin二進制日誌檔案的預設位置是資料目錄。您可以使用
--log-bin
選項指定其他位置,方法是在基本名稱前添加前導絕對路徑名稱以指定不同的目錄。當伺服器從二進制日誌索引檔案(追蹤已使用的二進制日誌檔案)讀取條目時,它會檢查該條目是否包含相對路徑。如果包含,則路徑的相對部分會被使用--log-bin
選項設定的絕對路徑取代。記錄在二進制日誌索引檔案中的絕對路徑保持不變;在這種情況下,必須手動編輯索引檔案才能啟用新的路徑或路徑。二進制日誌檔案基本名稱和任何指定的路徑都可用作log_bin_basename
系統變數。在 MySQL 8.4 中,無論您是否指定
--log-bin
選項,預設情況下都會啟用二進制日誌記錄。例外情況是,如果您使用 mysqld 並使用--initialize
或--initialize-insecure
選項手動初始化資料目錄,此時預設情況下會停用二進制日誌記錄。在這種情況下,可以通過指定--log-bin
選項來啟用二進制日誌記錄。啟用二進制日誌記錄後,顯示伺服器上二進制日誌記錄狀態的log_bin
系統變數會設定為 ON。要停用二進制日誌記錄,您可以在啟動時指定
--skip-log-bin
或--disable-log-bin
選項。如果指定了其中任何一個選項,並且也指定了--log-bin
,則稍後指定的選項優先。停用二進制日誌記錄後,log_bin
系統變數會設定為 OFF。當伺服器上正在使用 GTID 時,如果您在異常關閉後重新啟動伺服器時停用二進制日誌記錄,則可能會遺失一些 GTID,導致複製失敗。在正常關閉時,目前二進制日誌檔案中的 GTID 集會儲存在
mysql.gtid_executed
資料表中。在發生未執行此操作的異常關閉後,在復原期間,GTID 會從二進制日誌檔案新增到資料表中,前提是仍啟用二進制日誌記錄。如果伺服器重新啟動時停用了二進制日誌記錄,則伺服器無法存取二進制日誌檔案來復原 GTID,因此無法啟動複製。在正常關閉後可以安全地停用二進制日誌記錄。--log-replica-updates
和--replica-preserve-commit-order
選項需要二進制日誌記錄。如果您停用二進制日誌記錄,請省略這些選項,或指定--log-replica-updates=OFF
和--skip-replica-preserve-commit-order
。當指定--skip-log-bin
或--disable-log-bin
時,MySQL 預設會停用這些選項。如果您將--log-replica-updates
或--replica-preserve-commit-order
與--skip-log-bin
或--disable-log-bin
一起指定,則會發出警告或錯誤訊息。當啟用二進制日誌記錄時,可以使用預設伺服器 ID 啟動伺服器,但如果您未透過設定
server_id
系統變數來明確指定伺服器 ID,則會發出資訊訊息。對於在複製拓撲中使用的伺服器,您必須為每個伺服器指定唯一的非零伺服器 ID。有關二進制日誌的格式和管理資訊,請參閱第 7.4.4 節,「二進制日誌」。
-
命令列格式 --log-bin-index=file_name
系統變數 log_bin_index
範圍 全域 動態 否 SET_VAR
提示適用否 類型 檔案名稱 二進制日誌索引檔案的名稱,其中包含二進制日誌檔案的名稱。預設情況下,它具有與使用
--log-bin
選項為二進制日誌檔案指定的值相同的位置和基本名稱,加上擴展名.index
。如果您未指定--log-bin
,則預設的二進制日誌索引檔案名稱為binlog.index
。如果您指定的--log-bin
選項沒有字串或為空字串,則預設的二進制日誌索引檔案名稱為
,使用主機的名稱。host_name
-bin.index有關二進制日誌的格式和管理資訊,請參閱第 7.4.4 節,「二進制日誌」。
陳述式選取選項。以下清單中的選項會影響哪些陳述式會寫入二進制日誌,並因此由複寫來源伺服器傳送至其複本。還有一些選項適用於複本,用於控制應執行或忽略從來源接收的哪些陳述式。有關詳細資訊,請參閱第 19.1.6.3 節,「複本伺服器選項和變數」。
-
命令列格式 --binlog-do-db=name
類型 字串 此選項會以類似於
--replicate-do-db
影響複寫的方式影響二進制日誌記錄。此選項的效果取決於使用的是以陳述式為基礎的日誌記錄格式還是以資料列為基礎的日誌記錄格式,如同
--replicate-do-db
的效果取決於使用的是以陳述式為基礎的複寫還是以資料列為基礎的複寫。您應該記住,用於記錄給定陳述式的格式不一定與binlog_format
的值所指示的格式相同。例如,CREATE TABLE
和ALTER TABLE
等 DDL 陳述式始終以陳述式形式記錄,而不考慮生效的日誌記錄格式,因此以下以陳述式為基礎的--binlog-do-db
規則始終適用於確定是否記錄陳述式。以陳述式為基礎的日誌記錄。僅當預設資料庫(即由
USE
選取的資料庫)為db_name
時,才會將這些陳述式寫入二進制日誌。若要指定多個資料庫,請多次使用此選項,每個資料庫使用一次;但是,這樣做不會導致記錄跨資料庫陳述式,例如UPDATE
,同時選取不同的資料庫(或沒有資料庫)。some_db.some_table
SET foo='bar'警告若要指定多個資料庫,您必須使用此選項的多個實例。由於資料庫名稱可以包含逗號,因此如果您提供以逗號分隔的清單,則該清單會被視為單一資料庫的名稱。
以下範例說明當使用以陳述式為基礎的日誌記錄時,可能不會如預期運作的情況:如果伺服器啟動時使用
--binlog-do-db=sales
,並且您發出以下陳述式,則UPDATE
陳述式不會被記錄USE prices; UPDATE sales.january SET amount=amount+1000;
這種「僅檢查預設資料庫」行為的主要原因是,很難僅從陳述式本身判斷是否應該複製該陳述式(例如,如果您使用多個資料表
DELETE
陳述式或跨多個資料庫的多個資料表UPDATE
陳述式)。如果沒有必要,僅檢查預設資料庫而不是所有資料庫也比較快。當複製給定資料庫時,即使在設定選項時未指定該資料庫,也可能會發生另一個不明顯的情況。如果伺服器啟動時使用
--binlog-do-db=sales
,即使在設定--binlog-do-db
時未包含prices
,也會記錄以下UPDATE
陳述式USE sales; UPDATE prices.discounts SET percentage = percentage + 10;
由於發出
UPDATE
陳述式時sales
是預設資料庫,因此會記錄UPDATE
。以資料列為基礎的日誌記錄。日誌記錄僅限於資料庫
db_name
。僅記錄對屬於db_name
的資料表所做的變更;預設資料庫對此沒有影響。假設伺服器啟動時使用--binlog-do-db=sales
並且以資料列為基礎的日誌記錄生效,然後執行以下陳述式USE prices; UPDATE sales.february SET amount=amount+100;
會根據
UPDATE
陳述式記錄sales
資料庫中february
資料表的變更;無論是否發出USE
陳述式,都會發生這種情況。但是,當使用以資料列為基礎的日誌記錄格式和--binlog-do-db=sales
時,以下UPDATE
所做的變更不會被記錄USE prices; UPDATE prices.march SET amount=amount-25;
即使
USE prices
陳述式變更為USE sales
,UPDATE
陳述式的效果仍不會寫入二進制日誌。與以陳述式為基礎的日誌記錄相比,在處理
--binlog-do-db
時,以資料列為基礎的日誌記錄還有另一個重要的差異,該差異發生在參照多個資料庫的陳述式中。假設伺服器啟動時使用--binlog-do-db=db1
,並且執行以下陳述式USE db1; UPDATE db1.table1, db2.table2 SET db1.table1.col1 = 10, db2.table2.col2 = 20;
如果您使用以陳述式為基礎的日誌記錄,則對兩個資料表的更新都會寫入二進制日誌。但是,當使用以資料列為基礎的格式時,只會記錄對
table1
的變更;table2
位於不同的資料庫中,因此它不會被UPDATE
變更。現在假設,USE db4
陳述式而不是USE db1
陳述式USE db4; UPDATE db1.table1, db2.table2 SET db1.table1.col1 = 10, db2.table2.col2 = 20;
在此情況下,使用基於語句的記錄時,
UPDATE
陳述式不會寫入二進位日誌。但是,當使用基於列的記錄時,對table1
的變更會被記錄,但對table2
的變更則不會記錄 — 換句話說,只有在--binlog-do-db
指定的資料庫中的表格變更才會被記錄,而預設資料庫的選擇對此行為沒有影響。 -
命令列格式 --binlog-ignore-db=name
類型 字串 此選項對二進位日誌的影響,類似於
--replicate-ignore-db
對複寫的影響。此選項的效果取決於目前使用的是基於語句的記錄格式還是基於列的記錄格式,如同
--replicate-ignore-db
的效果取決於目前使用的是基於語句的複寫還是基於列的複寫一樣。您應該記住,用於記錄給定陳述式的格式不一定與binlog_format
的值所指示的格式相同。例如,諸如CREATE TABLE
和ALTER TABLE
之類的 DDL 陳述式始終會以語句的形式記錄,而不管生效的記錄格式如何,因此,以下關於--binlog-ignore-db
的基於語句的規則始終適用於判斷是否記錄陳述式。基於語句的記錄。 告知伺服器不要記錄任何預設資料庫(也就是由
USE
選取的資料庫)為db_name
的陳述式。當沒有預設資料庫時,不會套用任何
--binlog-ignore-db
選項,且此類陳述式始終會被記錄。(Bug #11829838, Bug #60188)基於列的格式。 告知伺服器不要記錄對資料庫
db_name
中任何表格的更新。目前資料庫沒有影響。當使用基於語句的記錄時,以下範例的行為可能與您預期的不同。假設伺服器以
--binlog-ignore-db=sales
啟動,並且您發出以下陳述式:USE prices; UPDATE sales.january SET amount=amount+1000;
在這種情況下,
UPDATE
陳述式會被記錄,因為--binlog-ignore-db
僅適用於預設資料庫(由USE
陳述式決定)。因為陳述式中明確指定了sales
資料庫,所以該陳述式未被篩選。但是,當使用基於列的記錄時,UPDATE
陳述式的影響不會被寫入二進位日誌,這表示不會記錄對sales.january
表格的任何變更;在此實例中,--binlog-ignore-db=sales
會導致對於二進位日誌記錄而言,所有對來源副本的sales
資料庫中表格所做的變更都會被忽略。若要指定要忽略的多個資料庫,請多次使用此選項,每個資料庫使用一次。因為資料庫名稱可能包含逗號,如果您提供以逗號分隔的清單,則該清單會被視為單一資料庫的名稱。
如果您使用跨資料庫更新,並且不希望記錄這些更新,則不應使用此選項。
校驗和選項。 MySQL 支援讀取和寫入二進位日誌校驗和。這些是使用此處列出的兩個選項啟用的
--binlog-checksum={NONE|CRC32}
命令列格式 --binlog-checksum=type
類型 字串 預設值 CRC32
有效值 NONE
CRC32
啟用此選項會導致來源針對寫入二進位日誌的事件寫入校驗和。設定為
NONE
以停用,或設定為用於產生校驗和的演算法名稱;目前僅支援 CRC32 校驗和,且 CRC32 是預設值。您無法在交易內變更此選項的設定。
若要控制複本(從中繼日誌)讀取校驗和,請使用 --replica-sql-verify-checksum
選項。
測試和偵錯選項。 以下二進位日誌選項用於複寫測試和偵錯。它們不適用於正常操作。
以下清單描述用於控制二進位日誌的系統變數。它們可以在伺服器啟動時設定,並且其中一些可以使用 SET
在執行階段變更。用於控制二進位日誌的伺服器選項會在本節前面列出。
-
命令列格式 --binlog-cache-size=#
系統變數 binlog_cache_size
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 32768
最小值 4096
最大值 (64 位元平台) 18446744073709547520
最大值 (32 位元平台) 4294963200
單位 位元組 區塊大小 4096
在交易期間保留二進位日誌變更的記憶體緩衝區大小。
當在伺服器上啟用二進位日誌記錄時(
log_bin
系統變數設定為 ON),如果伺服器支援任何交易儲存引擎,則會為每個用戶端配置一個二進位日誌快取。如果交易的資料超過記憶體緩衝區中的空間,則多餘的資料會儲存在暫存檔中。當伺服器上啟用二進位日誌加密時,記憶體緩衝區不會加密,但用於保留二進位日誌快取的任何暫存檔都會加密。在每次交易提交後,會透過清除記憶體緩衝區和截斷暫存檔(如果已使用)來重設二進位日誌快取。如果您經常使用大型交易,則可以增加此快取大小,以減少或消除寫入暫存檔的需求,從而獲得更好的效能。
Binlog_cache_use
和Binlog_cache_disk_use
狀態變數可用於調整此變數的大小。請參閱第 7.4.4 節「二進位日誌」。binlog_cache_size
僅設定交易快取的大小;語句快取的大小由binlog_stmt_cache_size
系統變數控管。 -
命令列格式 --binlog-checksum=type
系統變數 binlog_checksum
範圍 全域 動態 是 SET_VAR
提示適用否 類型 字串 預設值 CRC32
有效值 NONE
CRC32
啟用後,此變數會導致來源為二進位日誌中的每個事件寫入校驗和。
binlog_checksum
支援值NONE
(停用校驗和)和CRC32
。預設值為CRC32
。當binlog_checksum
停用時(值為NONE
),伺服器會透過寫入和檢查每個事件的事件長度(而非校驗和),來驗證它只將完整的事件寫入二進位日誌。在來源上將此變數設定為複本無法辨識的值,會導致複本將其自己的
binlog_checksum
值設定為NONE
,並停止複寫且出現錯誤。如果擔心與舊版複本的回溯相容性,您可能需要明確將值設定為NONE
。MySQL 8.4 中的群組複寫支援校驗和,因此群組成員可以使用預設設定。
變更
binlog_checksum
的值會導致二進位日誌輪換,因為校驗和必須針對整個二進位日誌檔寫入,而絕不能僅針對其中一部分寫入。您無法在交易內變更binlog_checksum
的值。當使用
binlog_transaction_compression
系統變數啟用二進位日誌交易壓縮時,不會為壓縮交易酬載中的個別事件寫入校驗和。而是為 GTID 事件寫入校驗和,並為壓縮的Transaction_payload_event
寫入校驗和。 binlog_direct_non_transactional_updates
命令列格式 --binlog-direct-non-transactional-updates[={OFF|ON}]
系統變數 binlog_direct_non_transactional_updates
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
由於並行問題,當交易包含對交易和非交易表格的更新時,複本可能會變得不一致。MySQL 嘗試透過將非交易陳述式寫入交易快取來保留這些陳述式之間的因果關係,該交易快取會在提交時清除。但是,當代表交易對非交易表格所做的修改立即對其他連線可見時,會出現問題,因為這些變更可能不會立即寫入二進位日誌。
binlog_direct_non_transactional_updates
變數提供了一種可能的解決方案。預設情況下,此變數已停用。啟用binlog_direct_non_transactional_updates
會導致對非交易表格的更新直接寫入二進位日誌,而不是寫入交易快取。設定此系統變數的 Session 值是受限的操作。Session 使用者必須擁有足夠的權限來設定受限的 Session 變數。請參閱第 7.1.9.1 節,「系統變數權限」。
binlog_direct_non_transactional_updates
僅適用於使用基於語句的二進制日誌格式複製的語句;也就是說,它僅在binlog_format
的值為STATEMENT
時,或當binlog_format
為MIXED
且給定的語句使用基於語句的格式複製時才有效。當二進制日誌格式為ROW
時,或當binlog_format
設定為MIXED
且給定的語句使用基於行的格式複製時,此變數無效。重要在啟用此變數之前,您必須確定事務表和非事務表之間沒有任何相依性;例如,
INSERT INTO myisam_table SELECT * FROM innodb_table
語句即為此類相依性。否則,此類語句很可能會導致副本與來源不同步。當二進制日誌格式為
ROW
或MIXED
時,此變數無效。-
命令列格式 --binlog-encryption[={OFF|ON}]
系統變數 binlog_encryption
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
啟用此伺服器上二進制日誌檔案和中繼日誌檔案的加密。
OFF
是預設值。ON
設定二進制日誌檔案和中繼日誌檔案的加密。二進制日誌記錄不需要在伺服器上啟用即可啟用加密,因此您可以在沒有二進制日誌的副本上加密中繼日誌檔案。若要使用加密,必須安裝並設定金鑰環外掛程式,以提供 MySQL 伺服器的金鑰環服務。有關如何執行此操作的說明,請參閱第 8.4.4 節,「MySQL 金鑰環」。任何支援的金鑰環外掛程式都可以用於儲存二進制日誌加密金鑰。當您首次啟用二進制日誌加密啟動伺服器時,會在初始化二進制日誌和中繼日誌之前產生新的二進制日誌加密金鑰。此金鑰用於加密每個二進制日誌檔案(如果伺服器已啟用二進制日誌記錄)和中繼日誌檔案(如果伺服器具有複製通道)的檔案密碼,而從檔案密碼產生的進一步金鑰則用於加密檔案中的資料。中繼日誌檔案會針對所有通道加密,包括群組複製應用程式通道和在啟用加密後建立的新通道。二進制日誌索引檔案和中繼日誌索引檔案永遠不會加密。
如果您在伺服器執行時啟用加密,則此時會產生新的二進制日誌加密金鑰。例外情況是,如果先前在伺服器上啟用了加密,然後又停用了,則會再次使用之前使用的二進制日誌加密金鑰。二進制日誌檔案和中繼日誌檔案會立即輪換,並且使用此二進制日誌加密金鑰加密新檔案和所有後續二進制日誌檔案和中繼日誌檔案的檔案密碼。伺服器上仍然存在的現有二進制日誌檔案和中繼日誌檔案不會自動加密,但您可以清除不再需要的檔案。
如果您將
binlog_encryption
系統變數變更為OFF
來停用加密,二進制日誌檔案和中繼日誌檔案會立即輪換,而所有後續日誌記錄都不會加密。先前加密的檔案不會自動解密,但伺服器仍然能夠讀取它們。需要BINLOG_ENCRYPTION_ADMIN
權限(或已棄用的SUPER
權限)才能在伺服器執行時啟用或停用加密。群組複製應用程式通道不包含在中繼日誌輪換請求中,因此這些通道的未加密日誌記錄要等到它們的日誌在正常使用中輪換後才會開始。有關二進制日誌檔案和中繼日誌檔案加密的更多資訊,請參閱第 19.3.2 節,「加密二進制日誌檔案和中繼日誌檔案」。
-
命令列格式 --binlog-error-action[=value]
系統變數 binlog_error_action
範圍 全域 動態 是 SET_VAR
提示適用否 類型 列舉 預設值 ABORT_SERVER
有效值 IGNORE_ERROR
ABORT_SERVER
控制當伺服器遇到錯誤時會發生什麼情況,例如無法寫入、刷新或同步二進制日誌,這可能會導致來源的二進制日誌不一致,並導致副本失去同步。
此變數預設為
ABORT_SERVER
,這會使伺服器在遇到二進制日誌的此類錯誤時停止記錄並關閉。重新啟動時,復原程序會像發生意外伺服器停止的情況一樣(請參閱第 19.4.2 節,「處理副本的意外停止」)。當
binlog_error_action
設定為IGNORE_ERROR
時,如果伺服器遇到此類錯誤,它會繼續進行中的交易,記錄錯誤,然後停止記錄,並繼續執行更新。若要恢復二進制日誌記錄,必須再次啟用log_bin
,這需要重新啟動伺服器。此設定提供與較舊版本的 MySQL 的向後相容性。 -
命令列格式 --binlog-expire-logs-seconds=#
系統變數 binlog_expire_logs_seconds
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 2592000
最小值 0
最大值 4294967295
單位 秒 以秒為單位設定二進制日誌的到期時間。到期時間結束後,可以自動移除二進制日誌檔案。可能的移除發生在啟動時和刷新二進制日誌時。日誌刷新的發生方式如第 7.4 節,「MySQL 伺服器日誌」所示。
二進制日誌的預設到期時間為 2592000 秒,等於 30 天(30*24*60*60 秒)。
可以將
binlog_expire_logs_auto_purge
系統變數設定為OFF
來停用二進制日誌的自動清除。這會優先於binlog_expire_logs_seconds
的任何設定。若要手動移除二進制日誌檔案,請使用
PURGE BINARY LOGS
陳述式。請參閱第 15.4.1.1 節,「PURGE BINARY LOGS 陳述式」。 -
命令列格式 --binlog-expire-logs-auto-purge={ON|OFF}
系統變數 binlog_expire_logs_auto_purge
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 ON
啟用或停用自動清除二進制日誌檔案。將此變數設定為
ON
(預設值)會啟用自動清除;將其設定為OFF
會停用自動清除。清除前等待的時間間隔由binlog_expire_logs_seconds
控制。注意即使
binlog_expire_logs_auto_purge
為ON
,將binlog_expire_logs_seconds
設定為0
也會停止執行自動清除。此變數對
PURGE BINARY LOGS
無效。 -
命令列格式 --binlog-format=format
已棄用 是 系統變數 binlog_format
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 列舉 預設值 ROW
有效值 MIXED
STATEMENT
ROW
此系統變數設定二進制日誌記錄格式,可以是
STATEMENT
、ROW
或MIXED
中的任何一個。(請參閱第 19.2.1 節,「複製格式」。)當伺服器上啟用二進制日誌記錄時,設定才會生效,也就是當log_bin
系統變數設定為ON
時。在 MySQL 8.4 中,預設會啟用二進制日誌記錄,且預設使用基於行的格式。注意binlog_format
已棄用,並會在未來版本的 MySQL 中移除。這表示對基於行以外的記錄格式的支援也會在未來版本中移除。因此,任何新的 MySQL 複製設定都應僅採用基於行的記錄。可以在啟動時或執行時設定
binlog_format
,但如稍後所述,在某些情況下,無法在執行時變更此變數,或導致複製失敗。預設值為
ROW
。例外情況:在 NDB Cluster 中,預設值為MIXED
;NDB Cluster 不支援基於語句的複製。設定此系統變數的 Session 值是受限的操作。Session 使用者必須擁有足夠的權限來設定受限的 Session 變數。請參閱第 7.1.9.1 節,「系統變數權限」。
管理此變數變更何時生效以及效果持續多久的規則,與其他 MySQL 伺服器系統變數相同。有關更多資訊,請參閱第 15.7.6.1 節,「設定變數指派的語法」。
指定
MIXED
時,會使用基於語句的複製,但保證只有基於行的複製才能產生正確結果的情況除外。例如,當語句包含可載入的函式或UUID()
函式時,就會發生這種情況。有關設定每個二進制日誌記錄格式時如何處理預存程式(預存程序和函式、觸發程序和事件)的詳細資訊,請參閱第 27.7 節,「預存程式二進制日誌記錄」。
在某些情況下,您無法在執行時切換複製格式
無法從預存函式或觸發程序中變更複製格式。
如果 Session 開啟了暫存資料表,則無法變更 Session 的複製格式 (
SET @@SESSION.binlog_format
)。如果有任何複製通道開啟了暫存資料表,則無法全域變更複製格式 (
SET @@GLOBAL.binlog_format
或SET @@PERSIST.binlog_format
)。如果有任何複製通道應用程式執行緒正在執行,則無法全域變更複製格式 (
SET @@GLOBAL.binlog_format
或SET @@PERSIST.binlog_format
)。
嘗試在任何這些情況下切換複製格式(或嘗試設定目前的複製格式)都會導致錯誤。但是,您可以使用
PERSIST_ONLY
(SET @@PERSIST_ONLY.binlog_format
) 隨時變更複製格式,因為此動作不會修改執行時全域系統變數值,並且僅在重新啟動伺服器後才會生效。當存在任何暫存資料表時,不建議在執行時切換複製格式,因為僅在使用基於語句的複製時才會記錄暫存資料表,而在使用基於行的複製和混合複製時,則不會記錄它們。
變更複製來源伺服器上的日誌格式,不會導致副本的日誌格式也隨之變更。如果在複製正在進行時切換複製格式,可能會導致問題,如果副本啟用了二進位日誌,且變更導致副本使用
STATEMENT
格式的日誌,而來源卻使用ROW
或MIXED
格式的日誌。副本無法將接收到的ROW
日誌格式二進位日誌項目轉換為STATEMENT
格式,以便在自己的二進位日誌中使用,因此這種情況可能會導致複製失敗。如需更多資訊,請參閱 第 7.4.4.2 節,「設定二進位日誌格式」。二進位日誌格式會影響下列伺服器選項的行為
這些影響會在各個選項的說明中詳細討論。
binlog_group_commit_sync_delay
命令列格式 --binlog-group-commit-sync-delay=#
系統變數 binlog_group_commit_sync_delay
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 0
最小值 0
最大值 1000000
單位 微秒 控制二進位日誌提交在將二進位日誌檔案同步到磁碟之前等待的微秒數。預設情況下,
binlog_group_commit_sync_delay
設定為 0,表示沒有延遲。將binlog_group_commit_sync_delay
設定為微秒延遲,可以讓更多交易同時同步到磁碟,從而減少提交一組交易的整體時間,因為較大的群組每個群組需要較少的時間單位。當設定
sync_binlog=0
或sync_binlog=1
時,由binlog_group_commit_sync_delay
指定的延遲將在每次二進位日誌提交群組同步之前(或在sync_binlog=0
的情況下,在繼續之前)應用。當sync_binlog
設定為大於 1 的值 n 時,延遲會在每 n 個二進位日誌提交群組之後應用。設定
binlog_group_commit_sync_delay
可以增加任何具有(或在容錯移轉後可能具有)副本的伺服器上並行提交交易的數量,因此可以增加副本上的並行執行。若要從此效果中受益,副本伺服器必須設定replica_parallel_type=LOGICAL_CLOCK
。設定binlog_group_commit_sync_delay
時,請務必考量來源和副本的輸送量。設定
binlog_group_commit_sync_delay
也可以減少任何具有二進位日誌的伺服器(來源或副本)上對二進位日誌的fsync()
呼叫次數。請注意,設定
binlog_group_commit_sync_delay
會增加伺服器上交易的延遲時間,這可能會影響用戶端應用程式。此外,在高並行工作負載下,延遲可能會增加競爭,從而降低輸送量。通常,設定延遲的好處大於缺點,但應始終進行調整以確定最佳設定。binlog_group_commit_sync_no_delay_count
命令列格式 --binlog-group-commit-sync-no-delay-count=#
系統變數 binlog_group_commit_sync_no_delay_count
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 0
最小值 0
最大值 100000
在中止
binlog_group_commit_sync_delay
指定的目前延遲之前,要等待的最大交易數。如果binlog_group_commit_sync_delay
設定為 0,則此選項沒有任何效果。-
命令列格式 --binlog-max-flush-queue-time=#
已棄用 是 系統變數 binlog_max_flush_queue_time
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 0
最小值 0
最大值 100000
單位 微秒 binlog_max_flush_queue_time
已棄用,並標記為在未來的 MySQL 版本中最終移除。以前,此系統變數控制從刷新佇列讀取交易以繼續進行群組提交的微秒時間。它不再有任何效果。 -
命令列格式 --binlog-order-commits[={OFF|ON}]
系統變數 binlog_order_commits
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 ON
當在複製來源伺服器上啟用此變數時(這是預設值),發送至儲存引擎的交易提交指令會在單一執行緒上序列化,以便交易始終以寫入二進位日誌的相同順序提交。停用此變數允許使用多個執行緒發送交易提交指令。與二進位日誌群組提交結合使用時,這可以防止單一交易的提交速率成為輸送量的瓶頸,因此可能會產生效能提升。
當所有涉及的儲存引擎都確認交易已準備好提交時,交易會寫入二進位日誌。然後,二進位日誌群組提交邏輯會在二進位日誌寫入完成後提交一組交易。當停用
binlog_order_commits
時,由於此程序使用多個執行緒,因此提交群組中的交易可能會以與它們在二進位日誌中的順序不同的順序提交。(來自單一用戶端的交易始終按時間順序提交。)在許多情況下,這並不重要,因為在個別交易中執行的操作應產生一致的結果,如果不是這種情況,則應改為使用單一交易。如果您想要確保來源和多執行緒副本上的交易歷史記錄保持相同,請在副本上設定
replica_preserve_commit_order=1
。 binlog_rotate_encryption_master_key_at_startup
命令列格式 --binlog-rotate-encryption-master-key-at-startup[={OFF|ON}]
系統變數 binlog_rotate_encryption_master_key_at_startup
範圍 全域 動態 否 SET_VAR
提示適用否 類型 布林值 預設值 OFF
指定是否在伺服器啟動時輪換二進位日誌主金鑰。二進位日誌主金鑰是二進位日誌加密金鑰,用於加密伺服器上二進位日誌檔案和中繼日誌檔案的檔案密碼。當首次在啟用二進位日誌加密的情況下啟動伺服器時(
binlog_encryption=ON
),會產生新的二進位日誌加密金鑰並用作二進位日誌主金鑰。如果binlog_rotate_encryption_master_key_at_startup
系統變數也設定為ON
,則每次重新啟動伺服器時,都會產生另一個二進位日誌加密金鑰,並用作所有後續二進位日誌檔案和中繼日誌檔案的二進位日誌主金鑰。如果binlog_rotate_encryption_master_key_at_startup
系統變數設定為OFF
(這是預設值),則在伺服器重新啟動後會再次使用現有的二進位日誌主金鑰。如需有關二進位日誌加密金鑰和二進位日誌主金鑰的更多資訊,請參閱 第 19.3.2 節,「加密二進位日誌檔案和中繼日誌檔案」。-
命令列格式 --binlog-row-event-max-size=#
系統變數 binlog_row_event_max_size
範圍 全域 動態 否 SET_VAR
提示適用否 類型 整數 預設值 8192
最小值 256
最大值 (64 位元平台) 18446744073709551615
最大值 (32 位元平台) 4294967295
單位 位元組 當使用以列為基礎的二進位日誌時,此設定是以列為基礎的二進位日誌事件的最大大小(以位元組為單位)的軟性限制。如果可能,二進位日誌中儲存的列會分組到大小不超過此設定值的事件中。如果事件無法分割,則可能會超過最大大小。預設值為 8192 位元組。
此全域系統變數為唯讀,且只能在伺服器啟動時設定。因此,其值只能透過將
PERSIST_ONLY
關鍵字或@@persist_only
限定詞與SET
陳述式搭配使用來修改。 -
命令列格式 --binlog-row-image=image_type
系統變數 binlog_row_image
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 列舉 預設值 full
有效值 full
(記錄所有欄位)minimal
(僅記錄變更的欄位和識別列所需的欄位)noblob
(記錄所有欄位,但不需要的 BLOB 和 TEXT 欄位除外)對於 MySQL 以列為基礎的複製,此變數決定如何將列影像寫入二進位日誌。
設定此系統變數的 Session 值是受限的操作。Session 使用者必須擁有足夠的權限來設定受限的 Session 變數。請參閱第 7.1.9.1 節,「系統變數權限」。
在 MySQL 以列為基礎的複製中,每個列變更事件都包含兩個影像,一個「之前」影像,其欄位在搜尋要更新的列時會與之比對,以及一個包含變更的「之後」影像。通常,MySQL 會記錄完整列(也就是所有欄位),以作為之前和之後的影像。但是,嚴格來說,並非必須在兩個影像中都包含每個欄位,而且我們通常可以透過僅記錄實際需要的欄位來節省磁碟、記憶體和網路使用量。
注意刪除列時,僅記錄之前的影像,因為刪除後沒有要傳播的變更值。插入列時,僅記錄之後的影像,因為沒有要比對的現有列。只有在更新列時才需要之前的影像和之後的影像,並且這兩個影像都會寫入二進位日誌。
對於前置影像(before image),只需要記錄能唯一識別資料列的最小欄位集合。如果包含該資料列的資料表有主鍵,則只會將主鍵欄位或多個欄位寫入二進位日誌。否則,如果資料表具有唯一鍵,且其所有欄位都為
NOT NULL
,則只需要記錄唯一鍵中的欄位。(如果資料表既沒有主鍵,也沒有任何NULL
欄位的唯一鍵,則必須在前置影像中使用並記錄所有欄位。)在後置影像(after image)中,只需要記錄實際已變更的欄位。您可以使用
binlog_row_image
系統變數,使伺服器記錄完整或最少的資料列。此變數實際上會採用三個可能值之一,如下列所示:注意此變數不受 NDB Cluster 支援;設定它不會影響
NDB
資料表的日誌記錄。預設值為
full
。當使用
minimal
或noblob
時,如果來源資料表和目標資料表都符合下列條件,則保證刪除和更新可以正確運作:所有欄位都必須存在且順序相同;每個欄位都必須使用與另一個資料表中相對應的欄位相同的資料類型。
資料表必須具有相同的主鍵定義。
(換句話說,資料表必須相同,除了非資料表主鍵一部分的索引之外。)
如果未滿足這些條件,則目標資料表中的主鍵欄位值可能不足以提供刪除或更新的唯一比對。在這種情況下,不會發出警告或錯誤;來源和複本會無聲地分歧,從而破壞一致性。
當二進位日誌格式為
STATEMENT
時,設定此變數無效。當binlog_format
為MIXED
時,binlog_row_image
的設定會套用至使用以列為基礎的格式記錄的變更,但此設定對以陳述式記錄的變更無效。在全域或工作階段層級設定
binlog_row_image
不會導致隱含的 commit;這表示此變數可以在交易進行時變更,而不會影響交易。 -
命令列格式 --binlog-row-metadata=metadata_type
系統變數 binlog_row_metadata
範圍 全域 動態 是 SET_VAR
提示適用否 類型 列舉 預設值 MINIMAL
有效值 FULL
(包含所有中繼資料)MINIMAL
(限制包含的中繼資料)設定在使用以列為基礎的日誌記錄時,新增至二進位日誌的資料表元資料數量。設定為
MINIMAL
(預設值) 時,只會記錄與SIGNED
旗標、欄位字元集和幾何類型相關的中繼資料。設定為FULL
時,會記錄資料表的完整元資料,例如欄位名稱、ENUM
或SET
字串值、PRIMARY KEY
資訊等等。擴充的元資料用於以下目的:
當複本的資料表結構與來源的不同時,複本會使用元資料來傳輸資料。
外部軟體可以使用元資料來解碼資料列事件,並將資料儲存到外部資料庫,例如資料倉儲。
-
命令列格式 --binlog-row-value-options=#
系統變數 binlog_row_value_options
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 Set 預設值 有效值 PARTIAL_JSON
設定為
PARTIAL_JSON
時,這會針對僅修改 JSON 文件一小部分的更新啟用空間效率高的二進位日誌格式,這會導致以列為基礎的複寫僅將 JSON 文件的修改部分寫入二進位日誌中更新的後置影像,而不是寫入完整的文件(請參閱JSON 值的部份更新)。這適用於使用任何JSON_SET()
、JSON_REPLACE()
和JSON_REMOVE()
序列修改 JSON 欄位的UPDATE
陳述式。如果伺服器無法產生部份更新,則會改為使用完整文件。預設值為空字串,這會停用格式的使用。若要取消設定
binlog_row_value_options
並還原為寫入完整 JSON 文件,請將其值設定為空字串。設定此系統變數的 Session 值是受限的操作。Session 使用者必須擁有足夠的權限來設定受限的 Session 變數。請參閱第 7.1.9.1 節,「系統變數權限」。
binlog_row_value_options=PARTIAL_JSON
僅在啟用二進位日誌記錄且binlog_format
設定為ROW
或MIXED
時才會生效。以陳述式為基礎的複寫始終僅記錄 JSON 文件的修改部分,無論為binlog_row_value_options
設定的任何值為何。為了最大化節省的空間,請將binlog_row_image=NOBLOB
或binlog_row_image=MINIMAL
與此選項一起使用。binlog_row_image=FULL
比這兩者節省的空間都少,因為完整 JSON 文件儲存在前置影像中,而部分更新僅儲存在後置影像中。mysqlbinlog 輸出包含以 base-64 字串編碼的形式呈現的部分 JSON 更新,使用
BINLOG
陳述式。如果指定--verbose
選項,mysqlbinlog 會使用虛擬 SQL 陳述式以可讀取的 JSON 格式顯示部分 JSON 更新。如果無法將修改套用至複本上的 JSON 文件,MySQL 複寫會產生錯誤。這包括找不到路徑的錯誤。請注意,即使有此和其他安全檢查,如果複本上的 JSON 文件與來源上的文件分歧,並且套用了部分更新,理論上仍可能在複本上產生有效但非預期的 JSON 文件。
-
命令列格式 --binlog-rows-query-log-events[={OFF|ON}]
系統變數 binlog_rows_query_log_events
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
此系統變數僅影響以列為基礎的日誌記錄。啟用時,它會導致伺服器將資訊性日誌事件(例如資料列查詢日誌事件)寫入其二進位日誌中。此資訊可用於偵錯和相關目的,例如在無法從資料列更新重建時,取得來源上發出的原始查詢。
設定此系統變數的 Session 值是受限的操作。Session 使用者必須擁有足夠的權限來設定受限的 Session 變數。請參閱第 7.1.9.1 節,「系統變數權限」。
這些資訊性事件通常會被讀取二進位日誌的 MySQL 程式忽略,因此在從備份複寫或還原時不會造成問題。若要檢視它們,請使用 mysqlbinlog 的
--verbose
選項兩次,以-vv
或--verbose --verbose
的形式,來增加詳細程度。 -
命令列格式 --binlog-stmt-cache-size=#
系統變數 binlog_stmt_cache_size
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 32768
最小值 4096
最大值 (64 位元平台) 18446744073709547520
最大值 (32 位元平台) 4294963200
單位 位元組 區塊大小 4096
二進位日誌的記憶體緩衝區大小,用於保存交易期間發出的非交易性陳述式。
如果在伺服器上啟用二進位日誌記錄(將
log_bin
系統變數設定為 ON),如果伺服器支援任何交易性儲存引擎,則會為每個用戶端分配個別的二進位日誌交易和陳述式快取。如果交易中使用的非交易性陳述式資料超過記憶體緩衝區中的空間,則多餘的資料會儲存在暫存檔中。當二進位日誌加密在伺服器上處於作用中時,記憶體緩衝區不會加密,但用於保存二進位日誌快取的任何暫存檔都會加密。在每次交易提交後,二進位日誌陳述式快取會透過清除記憶體緩衝區和截斷暫存檔(如果已使用)來重設。如果您在交易期間經常使用大型的非交易性陳述式,您可以增加此快取大小,藉由減少或消除寫入暫存檔的需求來獲得更好的效能。
Binlog_stmt_cache_use
和Binlog_stmt_cache_disk_use
狀態變數可用於調整此變數的大小。請參閱第 7.4.4 節,"二進位日誌"。binlog_cache_size
系統變數設定交易快取的大小。 binlog_transaction_compression
命令列格式 --binlog-transaction-compression[={OFF|ON}]
系統變數 binlog_transaction_compression
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
啟用此伺服器上寫入二進位日誌檔的交易壓縮功能。預設值為
OFF
。使用binlog_transaction_compression_level_zstd
系統變數來設定用於壓縮的zstd
演算法的壓縮層級。設定
binlog_transaction_compression
不會立即生效,而是適用於所有後續的START REPLICA
陳述式。當啟用二進位日誌交易壓縮時,交易酬載會被壓縮,然後以單一事件(
Transaction_payload_event
)寫入二進位日誌檔。壓縮後的交易酬載在以複製串流傳送到副本、其他群組複製群組成員或諸如 mysqlbinlog 之類的用戶端時,會保持壓縮狀態,並以壓縮狀態寫入中繼日誌。因此,二進位日誌交易壓縮可節省交易發起者和接收者(及其備份)的儲存空間,並在伺服器實例之間傳送交易時節省網路頻寬。若要使
binlog_transaction_compression=ON
直接生效,則必須在伺服器上啟用二進位日誌記錄。當 MySQL 8.4 伺服器實例沒有二進位日誌時,無論其binlog_transaction_compression
的值為何,它都可以接收、處理和顯示壓縮的交易酬載。此類伺服器實例接收的壓縮交易酬載會以壓縮狀態寫入中繼日誌,因此它們間接受益於複製拓撲中其他伺服器執行的壓縮。此系統變數無法在交易內容中變更。設定此系統變數的工作階段值是受限制的操作。工作階段使用者必須擁有足夠的權限才能設定受限制的工作階段變數。請參閱第 7.1.9.1 節「系統變數權限」。
如需有關二進位日誌交易壓縮的更多資訊,包括哪些事件會壓縮以及哪些事件不會壓縮的詳細資訊,以及使用交易壓縮時的行為變更,請參閱第 7.4.4.5 節「二進位日誌交易壓縮」。
您可以使用
ndb_log_transaction_compression
系統變數為NDB
啟用此功能。此外,在命令列或my.cnf
檔案中設定--binlog-transaction-compression=ON
會在伺服器啟動時啟用ndb_log_transaction_compression
。請參閱變數說明以取得更多資訊。binlog_transaction_compression_level_zstd
命令列格式 --binlog-transaction-compression-level-zstd=#
系統變數 binlog_transaction_compression_level_zstd
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 整數 預設值 3
最小值 1
最大值 22
設定此伺服器上二進位日誌交易壓縮的壓縮層級,此壓縮層級由
binlog_transaction_compression
系統變數啟用。此值是一個整數,決定壓縮工作量,從 1(最低工作量)到 22(最高工作量)。如果您未指定此系統變數,則壓縮層級設定為 3。設定
binlog_transaction_compression_level_zstd
不會立即生效,而是適用於所有後續的START REPLICA
陳述式。隨著壓縮層級的提高,資料壓縮率會提高,這會減少交易酬載所需的儲存空間和網路頻寬。但是,資料壓縮所需的工作量也會增加,從而占用發起伺服器上的時間、CPU 和記憶體資源。壓縮工作量的增加與資料壓縮率的增加沒有線性關係。
此系統變數無法在交易內容中變更。設定此系統變數的工作階段值是受限制的操作。工作階段使用者必須擁有足夠的權限才能設定受限制的工作階段變數。請參閱第 7.1.9.1 節「系統變數權限」。
此變數對
NDB
資料表的交易記錄沒有影響;請改用ndb_log_transaction_compression_level_zstd
。binlog_transaction_dependency_history_size
命令列格式 --binlog-transaction-dependency-history-size=#
系統變數 binlog_transaction_dependency_history_size
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 25000
最小值 1
最大值 1000000
設定記憶體中保留並用於查詢上次修改給定資料列的交易的資料列雜湊數量上限。達到此雜湊數量後,便會清除歷史記錄。
-
顯示伺服器上二進位日誌記錄的狀態,啟用 (
ON
) 或停用 (OFF
)。啟用二進位日誌記錄後,伺服器會將所有變更資料的陳述式記錄到二進位日誌中,用於備份和複寫。ON
表示二進位日誌可用,OFF
表示未使用。--log-bin
選項可用於指定二進位日誌的基礎名稱和位置。在較早的 MySQL 版本中,二進位日誌記錄預設為停用,如果您指定
--log-bin
選項,則會啟用二進位日誌記錄。二進位日誌記錄預設為啟用,無論您是否指定--log-bin
選項,log_bin
系統變數都會設定為ON
。例外情況是,如果您使用 mysqld 透過使用--initialize
或--initialize-insecure
選項來手動初始化資料目錄,則二進位日誌記錄預設為停用。在這種情況下,可以透過指定--log-bin
選項來啟用二進位日誌記錄。如果在啟動時指定
--skip-log-bin
或--disable-log-bin
選項,則會停用二進位日誌記錄,並且log_bin
系統變數會設定為OFF
。如果指定其中任一選項,並且也指定--log-bin
,則稍後指定的選項會優先。有關二進制日誌的格式和管理資訊,請參閱第 7.4.4 節,「二進制日誌」。
-
系統變數 log_bin_basename
範圍 全域 動態 否 SET_VAR
提示適用否 類型 檔案名稱 保留二進位日誌檔的基礎名稱和路徑,可以使用
--log-bin
伺服器選項設定。最大變數長度為 256。在 MySQL 8.4 中,如果未提供--log-bin
選項,則預設基礎名稱為binlog
。為了與 MySQL 5.7 相容,如果--log-bin
選項未提供字串或提供了空字串,則預設基礎名稱為
,使用主機的名稱。預設位置為資料目錄。host_name
-bin -
命令列格式 --log-bin-index=file_name
系統變數 log_bin_index
範圍 全域 動態 否 SET_VAR
提示適用否 類型 檔案名稱 保留二進位日誌索引檔的基礎名稱和路徑,可以使用
--log-bin-index
伺服器選項設定。最大變數長度為 256。 log_bin_trust_function_creators
命令列格式 --log-bin-trust-function-creators[={OFF|ON}]
已棄用 是 系統變數 log_bin_trust_function_creators
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
此變數在啟用二進位日誌記錄時適用。它控制是否可以信任儲存函數建立者不會建立可能會導致不安全事件寫入二進位日誌的儲存函數。如果設定為 0(預設值),除非使用者除了擁有
CREATE ROUTINE
或ALTER ROUTINE
權限之外,還擁有SUPER
權限,否則不允許他們建立或變更儲存函數。設定為 0 也會強制執行一個限制,即函數必須使用DETERMINISTIC
特性宣告,或者使用READS SQL DATA
或NO SQL
特性宣告。如果變數設定為 1,則 MySQL 不會對儲存函數建立強制執行這些限制。此變數也適用於觸發程序建立。請參閱第 27.7 節「儲存程式二進位日誌記錄」。-
命令列格式 --log-replica-updates[={OFF|ON}]
系統變數 log_replica_updates
範圍 全域 動態 否 SET_VAR
提示適用否 類型 布林值 預設值 ON
log_replica_updates
指定是否應將副本伺服器從複寫來源伺服器接收的更新記錄到副本自己的二進位日誌中。啟用此變數會導致複本將從來源接收並由複寫 SQL 執行緒執行的更新寫入複本自己的二進制日誌。二進制日誌記錄由
--log-bin
選項控制,且預設為啟用,複本也必須啟用二進制日誌記錄才能記錄更新。請參閱第 19.1.6 節「複寫和二進制日誌記錄選項和變數」。log_replica_updates
預設為啟用,除非您指定--skip-log-bin
停用二進制日誌記錄,在這種情況下,MySQL 也預設停用複本更新日誌記錄。如果您需要在啟用二進制日誌記錄時停用複本更新日誌記錄,請在複本伺服器啟動時指定--log-replica-updates=OFF
。啟用
log_replica_updates
可讓複寫伺服器鏈接在一起。例如,您可能想要使用此配置設定複寫伺服器A -> B -> C
在此,
A
作為複本B
的來源,而B
作為複本C
的來源。為了使此配置生效,B
必須同時作為來源 和 複本。在啟用二進制日誌記錄且log_replica_updates
已啟用的情況下(預設設定),從A
收到的更新將由B
記錄到其二進制日誌中,因此可以傳遞到C
。 -
命令列格式 --log-slave-updates[={OFF|ON}]
已棄用 是 系統變數 log_slave_updates
範圍 全域 動態 否 SET_VAR
提示適用否 類型 布林值 預設值 ON
已棄用的
log_replica_updates
別名。 log_statements_unsafe_for_binlog
命令列格式 --log-statements-unsafe-for-binlog[={OFF|ON}]
已棄用 是 系統變數 log_statements_unsafe_for_binlog
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 ON
如果遇到錯誤 1592,則控制是否將產生的警告新增至錯誤日誌。
-
命令列格式 --master-verify-checksum[={OFF|ON}]
已棄用 是 系統變數 master_verify_checksum
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
已棄用的
source_verify_checksum
別名。 -
命令列格式 --max-binlog-cache-size=#
系統變數 max_binlog_cache_size
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 (64 位元平台) 18446744073709547520
預設值 (32 位元平台) 4294967295
最小值 4096
最大值 (64 位元平台) 18446744073709547520
最大值 (32 位元平台) 4294967295
單位 位元組 區塊大小 4096
如果交易需要超過此數量的位元組,伺服器會產生 Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage 錯誤。當
gtid_mode
不是ON
時,建議的最大值為 4GB,原因是在這種情況下,MySQL 無法處理大於 4GB 的二進制日誌位置;當gtid_mode
為ON
時,此限制不適用,並且伺服器可以處理任意大小的二進制日誌位置。如果由於
gtid_mode
不是ON
,或是由於其他原因,您需要保證二進制日誌不超過給定的大小maxsize
,則應根據此處顯示的公式設定此變數max_binlog_cache_size < (((maxsize - max_binlog_size) / max_connections) - 1000) / 1.2
此計算會考慮以下情況
只要開始寫入之前的二進制日誌大小小於
max_binlog_size
,伺服器就會寫入二進制日誌。伺服器不寫入單一交易,而是寫入交易群組。群組中可能的最大交易數等於
max_connections
。伺服器寫入未包含在快取中的資料。這包括每個事件的 4 位元組總和檢查碼;雖然這會使交易大小增加不到 20%,但此數量不可忽略。此外,伺服器還會為每個交易寫入
Gtid_log_event
;這些事件中的每一個都可能會將寫入二進制日誌的內容再增加 1 KB。
max_binlog_cache_size
僅設定交易快取的大小;語句快取的上限由max_binlog_stmt_cache_size
系統變數控制。max_binlog_cache_size
對於工作階段的可見性與binlog_cache_size
系統變數的可見性相符;換句話說,變更其值僅會影響在值變更後啟動的新工作階段。 -
命令列格式 --max-binlog-size=#
系統變數 max_binlog_size
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 1073741824
最小值 4096
最大值 1073741824
單位 位元組 區塊大小 4096
如果寫入二進制日誌導致目前的日誌檔案大小超過此變數的值,則伺服器會輪換二進制日誌(關閉目前的檔案並開啟下一個檔案)。最小值為 4096 位元組。最大值和預設值為 1GB。加密的二進制日誌檔案具有額外的 512 位元組標頭,該標頭包含在
max_binlog_size
中。交易會以一個區塊寫入二進制日誌,因此永遠不會在多個二進制日誌之間分割。因此,如果您有大型交易,您可能會看到二進制日誌檔案大於
max_binlog_size
。如果
max_relay_log_size
為 0,則max_binlog_size
的值也適用於中繼日誌。在伺服器上使用 GTID 時,當達到
max_binlog_size
時,如果無法存取系統資料表mysql.gtid_executed
來寫入目前二進制日誌檔案的 GTID,則無法輪換二進制日誌。在這種情況下,伺服器會根據其binlog_error_action
設定做出回應。如果設定了IGNORE_ERROR
,則會在伺服器上記錄錯誤並停止二進制日誌記錄;如果設定了ABORT_SERVER
,則伺服器會關閉。 -
命令列格式 --max-binlog-stmt-cache-size=#
系統變數 max_binlog_stmt_cache_size
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 18446744073709547520
最小值 4096
最大值 18446744073709547520
單位 位元組 區塊大小 4096
如果交易中的非交易性語句需要超過此數量的記憶體位元組,則伺服器會產生錯誤。最小值為 4096。最大值和預設值在 32 位元平台上為 4GB,在 64 位元平台上為 16EB (exabytes)。
max_binlog_stmt_cache_size
僅設定語句快取的大小;交易快取的上限完全由max_binlog_cache_size
系統變數控制。 -
系統變數 original_commit_timestamp
範圍 工作階段 動態 是 SET_VAR
提示適用否 類型 數值 供複寫內部使用。在複本上重新執行交易時,此設定為交易在原始來源上提交的時間,以自 epoch 以來的微秒為單位。這允許原始提交時間戳記在整個複寫拓樸中傳播。
設定此系統變數的工作階段值是受限制的操作。工作階段使用者必須具有
REPLICATION_APPLIER
權限(請參閱第 19.3.3 節「複寫權限檢查」),或具有設定受限制的工作階段變數的足夠權限(請參閱第 7.1.9.1 節「系統變數權限」)。但是,請注意,此變數不是供使用者設定的;它是由複寫基礎架構自動設定的。 -
命令列格式 --source-verify-checksum[={OFF|ON}]
系統變數 source_verify_checksum
範圍 全域 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 OFF
啟用
source_verify_checksum
會導致來源透過檢查總和檢查碼來驗證從二進制日誌讀取的事件,並在發生不符時停止並產生錯誤。source_verify_checksum
預設為停用;在這種情況下,來源會使用二進制日誌中的事件長度來驗證事件,以便僅從二進制日誌讀取完整事件。 -
系統變數 sql_log_bin
範圍 工作階段 動態 是 SET_VAR
提示適用否 類型 布林值 預設值 ON
此變數控制是否為目前工作階段啟用二進制日誌記錄(假設二進制日誌本身已啟用)。預設值為
ON
。若要停用或啟用目前工作階段的二進制日誌記錄,請將工作階段sql_log_bin
變數設定為OFF
或ON
。將此變數設定為
OFF
可讓工作階段在對您不希望複寫到複本的來源進行變更時暫時停用二進制日誌記錄。設定此系統變數的 Session 值是受限的操作。Session 使用者必須擁有足夠的權限來設定受限的 Session 變數。請參閱第 7.1.9.1 節,「系統變數權限」。
無法在交易或子查詢中設定
sql_log_bin
的工作階段值。將此變數設定為
OFF
會阻止將 GTID 指派給二進制日誌中的交易。如果您正在使用 GTID 進行複寫,則這表示即使稍後再次啟用二進制日誌記錄,從此處寫入日誌的 GTID 也不會說明在此期間發生的任何交易,因此實際上會遺失這些交易。 -
命令列格式 --sync-binlog=#
系統變數 sync_binlog
範圍 全域 動態 是 SET_VAR
提示適用否 類型 整數 預設值 1
最小值 0
最大值 4294967295
控制 MySQL 伺服器將二進制日誌同步到磁碟的頻率。
sync_binlog=0
:停用 MySQL 伺服器將二進位日誌同步到磁碟的功能。相反地,MySQL 伺服器依賴作業系統不時地將二進位日誌刷新到磁碟,就像處理任何其他檔案一樣。此設定提供最佳效能,但在發生電源故障或作業系統當機時,伺服器可能已提交了尚未同步到二進位日誌的交易。sync_binlog=1
:啟用在交易提交之前將二進位日誌同步到磁碟的功能。這是最安全的設定,但由於磁碟寫入次數增加,可能會對效能產生負面影響。在發生電源故障或作業系統當機時,二進位日誌中遺失的交易僅處於預備狀態。這允許自動復原例程回滾這些交易,從而保證二進位日誌中不會遺失任何交易。sync_binlog=
,其中N
N
是 0 或 1 以外的值:在收集N
個二進位日誌提交群組後,二進位日誌會同步到磁碟。在發生電源故障或作業系統當機時,伺服器可能已提交了尚未刷新到二進位日誌的交易。此設定可能會由於磁碟寫入次數增加而對效能產生負面影響。較高的值可以提高效能,但也會增加資料遺失的風險。
為了在使用
InnoDB
和交易的複製設定中獲得最大的持久性和一致性,請使用這些設定注意許多作業系統和一些磁碟硬體會欺騙刷新到磁碟的操作。它們可能會告訴 mysqld 刷新已發生,即使實際上並未發生。在這種情況下,即使使用建議的設定,也無法保證交易的持久性,在最壞的情況下,停電可能會損壞
InnoDB
資料。在 SCSI 磁碟控制器或磁碟本身中使用電池備份的磁碟快取可以加快檔案刷新速度,並使操作更安全。您也可以嘗試停用硬體快取中的磁碟寫入快取。