MySQL 8.0與MySQL 5.7的binlog差異小結(jié)
MySQL是一個(gè)廣泛使用的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它提供了許多強(qiáng)大的功能,如事務(wù)、存儲(chǔ)過(guò)程、觸發(fā)器、視圖、全文索引等。但是,MySQL也有一些不足之處,比如數(shù)據(jù)的安全性和可靠性。如果數(shù)據(jù)庫(kù)發(fā)生故障或損壞,如何恢復(fù)數(shù)據(jù)?如果數(shù)據(jù)庫(kù)需要進(jìn)行主從復(fù)制或讀寫分離,如何保證數(shù)據(jù)的一致性?這些問(wèn)題都需要借助一個(gè)特殊的機(jī)制來(lái)解決,那就是binlog。
1. binlog的主要用途
binlog是MySQL的一個(gè)重要特性,它是一個(gè)用于記錄數(shù)據(jù)庫(kù)變更的二進(jìn)制日志文件,每一條會(huì)修改數(shù)據(jù)的SQL語(yǔ)句都會(huì)被記錄在binlog中。通過(guò)binlog,我們可以實(shí)現(xiàn)以下幾個(gè)目的:
數(shù)據(jù)恢復(fù):如果數(shù)據(jù)庫(kù)發(fā)生故障或損壞,我們可以通過(guò)binlog來(lái)恢復(fù)數(shù)據(jù),只需要將binlog中的SQL語(yǔ)句按照順序重新執(zhí)行一遍,就可以將數(shù)據(jù)庫(kù)恢復(fù)到故障發(fā)生前的狀態(tài)。
主從復(fù)制:如果數(shù)據(jù)庫(kù)需要進(jìn)行主從復(fù)制,我們可以通過(guò)binlog來(lái)實(shí)現(xiàn),只需要將主庫(kù)的binlog傳輸?shù)綇膸?kù),并在從庫(kù)上執(zhí)行binlog中的SQL語(yǔ)句,就可以將從庫(kù)的數(shù)據(jù)與主庫(kù)保持一致。
審計(jì):如果數(shù)據(jù)庫(kù)需要進(jìn)行審計(jì),我們可以通過(guò)binlog來(lái)實(shí)現(xiàn),只需要分析binlog中的SQL語(yǔ)句,就可以了解數(shù)據(jù)庫(kù)的變更歷史,如何操作,何時(shí)操作,操作了哪些數(shù)據(jù)等。
可以看出,binlog是MySQL的一個(gè)非常重要的特性,它對(duì)于數(shù)據(jù)庫(kù)的安全性和可靠性有著重要的作用。但是,隨著MySQL的版本更新,binlog也發(fā)生了一些變化,這些變化可能會(huì)影響我們對(duì)binlog的使用和理解。在本文中,我們將介紹MySQL 8.0版本與MySQL 5.7版本在binlog方面的主要差異,以及這些差異的原因和影響。
2. binlog格式的變化
binlog的格式?jīng)Q定了binlog中記錄的內(nèi)容和形式,MySQL支持三種binlog格式,分別是:
STATEMENT:每一條會(huì)修改數(shù)據(jù)的SQL語(yǔ)句都會(huì)記錄在binlog中,不記錄具體的數(shù)據(jù)變化,而是記錄SQL語(yǔ)句的上下文信息,如執(zhí)行時(shí)間、用戶、數(shù)據(jù)庫(kù)、表等。
ROW:每一條會(huì)修改數(shù)據(jù)的SQL語(yǔ)句都會(huì)記錄在binlog中,不記錄SQL語(yǔ)句本身,而是記錄每一行數(shù)據(jù)的變化,如插入、更新、刪除等。
MIXED:根據(jù)SQL語(yǔ)句的類型和特性,自動(dòng)選擇STATEMENT或ROW格式來(lái)記錄binlog,以達(dá)到最佳的效果。
MySQL 8.0版本與MySQL 5.7版本在binlog格式方面的主要差異是:
- MySQL 8.0版本引入了一個(gè)新的系統(tǒng)變量binlog_expire_logs_seconds,用來(lái)設(shè)置binlog的過(guò)期時(shí)間,單位是秒。這個(gè)變量比MySQL 5.7的expire_logs_days更精確,可以根據(jù)需要?jiǎng)討B(tài)調(diào)整。
- MySQL 8.0版本支持了事務(wù)性數(shù)據(jù)字典,這意味著數(shù)據(jù)字典的變更也會(huì)記錄在binlog中,以保證主從復(fù)制的一致性。
- MySQL8.0版本增加了一個(gè)新的binlog事件類型TRANSACTION_PAYLOAD_EVENT,用來(lái)存儲(chǔ)事務(wù)的元數(shù)據(jù),如事務(wù)ID,事務(wù)大小,是否只讀等。這些信息可以用來(lái)優(yōu)化復(fù)制性能和監(jiān)控事務(wù)活動(dòng)。
- MySQL8.0版本改進(jìn)了binlog的壓縮算法,使用了zstd壓縮庫(kù),可以提高壓縮比和壓縮速度,同時(shí)減少CPU的開(kāi)銷。
原因:
- MySQL 8.0版本引入了binlog_expire_logs_seconds變量,是為了提供更靈活的binlog管理,避免binlog文件過(guò)多占用磁盤空間,也避免binlog文件過(guò)少導(dǎo)致數(shù)據(jù)恢復(fù)或復(fù)制失敗。
- MySQL 8.0版本支持了事務(wù)性數(shù)據(jù)字典,是為了提高數(shù)據(jù)庫(kù)的可靠性和一致性,避免數(shù)據(jù)字典的損壞或不同步導(dǎo)致的問(wèn)題。
- MySQL 8.0版本增加了TRANSACTION_PAYLOAD_EVENT事件類型,是為了提高復(fù)制的效率和穩(wěn)定性,避免復(fù)制延遲或丟失數(shù)據(jù)的問(wèn)題。
- MySQL 8.0版本改進(jìn)了binlog的壓縮算法,是為了提高binlog的傳輸和存儲(chǔ)性能,節(jié)省網(wǎng)絡(luò)和磁盤資源,降低系統(tǒng)的負(fù)載。
影響:
- MySQL 8.0版本引入了binlog_expire_logs_seconds變量,對(duì)于用戶來(lái)說(shuō),可以更靈活地設(shè)置binlog的過(guò)期時(shí)間,根據(jù)業(yè)務(wù)需求和資源情況進(jìn)行調(diào)整,提高binlog的管理效率。
- MySQL8.0版本支持了事務(wù)性數(shù)據(jù)字典,對(duì)于用戶來(lái)說(shuō),可以更放心地使用MySQL,不用擔(dān)心數(shù)據(jù)字典的損壞或不同步導(dǎo)致的問(wèn)題,也可以更方便地查看和修改數(shù)據(jù)字典的信息。
- MySQL 8.0版本增加了TRANSACTION_PAYLOAD_EVENT事件類型,對(duì)于用戶來(lái)說(shuō),可以更快速地進(jìn)行主從復(fù)制,也可以更清晰地監(jiān)控事務(wù)的活動(dòng),提高數(shù)據(jù)庫(kù)的性能和可觀察性。
- MySQL8.0版本改進(jìn)了binlog的壓縮算法,對(duì)于用戶來(lái)說(shuō),可以更節(jié)省網(wǎng)絡(luò)和磁盤資源,也可以更快地傳輸和存儲(chǔ)binlog,提高數(shù)據(jù)庫(kù)的性能和可靠性。
3. binlog管理的變化
binlog的管理主要涉及到binlog的生成、傳輸、存儲(chǔ)、刪除等操作,MySQL提供了一些命令和變量來(lái)進(jìn)行binlog的管理,如:
- show master logs:查看所有binlog的日志列表。
- show master status:查看binlog日志狀態(tài)。
- flush logs:刷新binlog日志文件,刷新之后會(huì)創(chuàng)建一個(gè)新的binlog日志文件。
- reset master:清空所有的binlog日志文件。
- mysqlbinlog:查看或解析binlog日志文件的內(nèi)容。
- log_bin:binlog的開(kāi)關(guān)。
- binlog_format:binlog日志的格式。
- expire_logs_days:binlog日志的過(guò)期天數(shù)。
- sync_binlog:binlog日志的同步策略。
MySQL 8.0版本與MySQL 5.7版本在binlog管理方面的主要差異是:
- MySQL 8.0版本引入了一個(gè)新的系統(tǒng)變量binlog_expire_logs_seconds,用來(lái)設(shè)置binlog的過(guò)期時(shí)間,單位是秒。這個(gè)變量比MySQL 5.7的expire_logs_days更精確,可以根據(jù)需要?jiǎng)討B(tài)調(diào)整
- MySQL8.0版本引入了一個(gè)新的系統(tǒng)變量binlog_rotate_encryption_master_key_at_startup,用來(lái)設(shè)置是否在啟動(dòng)時(shí)旋轉(zhuǎn)加密的binlog主鍵。如果這個(gè)變量設(shè)置為ON,那么每次服務(wù)器重啟時(shí),都會(huì)生成一個(gè)新的binlog加密密鑰,并用作新的binlog主鍵。這樣可以增強(qiáng)binlog的安全性,防止密鑰泄露或被破解
- MySQL 8.0版本支持使用ALTER INSTANCE ROTATE BINLOG MASTER KEY語(yǔ)句手動(dòng)旋轉(zhuǎn)binlog主鍵。當(dāng)使用這個(gè)語(yǔ)句時(shí),服務(wù)器會(huì)執(zhí)行以下操作:生成一個(gè)新的binlog加密密鑰并存儲(chǔ)在密鑰環(huán)上,用作新的binlog主鍵;旋轉(zhuǎn)所有通道上的binlog和中繼日志文件;使用新的binlog主鍵加密新的和現(xiàn)有的binlog和中繼日志文件的文件密碼;刪除不再使用的binlog加密密鑰
- MySQL8.0版本支持使用binlog_row_event_max_size系統(tǒng)變量設(shè)置row格式的binlog事件的最大大小,單位是字節(jié)。這個(gè)變量是一個(gè)軟限制,盡可能地將binlog中的行分組到不超過(guò)這個(gè)值的事件中。如果一個(gè)事件無(wú)法分割,那么最大大小可以超過(guò)。這個(gè)變量的值必須是(或者會(huì)被向下取整到)256的倍數(shù)。默認(rèn)值是8192字節(jié)
4. 小結(jié)
MySQL 8.0和MySQL 5.7之間的二進(jìn)制日志(binlog)主要的變化如下:
默認(rèn)的binlog格式:MySQL 8.0默認(rèn)使用ROW格式,ROW格式記錄每行數(shù)據(jù)的變化,而STATEMENT格式記錄SQL語(yǔ)句的執(zhí)行
新的binlog緩沖機(jī)制:MySQL 8.0引入了一種新的binlog緩沖機(jī)制,可以提高性能并減少磁盤I/O。在MySQL 5.7中,使用了基于磁盤的binlog緩沖
binlog加密:MySQL 8.0引入了二進(jìn)制日志的加密功能,可以在傳輸過(guò)程中對(duì)binlog進(jìn)行加密。MySQL 5.7沒(méi)有原生支持二進(jìn)制日志的加密
在線binlog重置:MySQL 8.0支持在線重置二進(jìn)制日志,而MySQL 5.7需要停止和啟動(dòng)MySQL服務(wù)進(jìn)行重置
新的事務(wù)描述事件:MySQL 8.0引入了新的ANONYMOUS_GTID_EVENT事務(wù)描述事件,用于記錄匿名GTID的信息。MySQL 5.7中沒(méi)有這個(gè)事件
GTID的一些改進(jìn):MySQL 8.0對(duì)GTID的處理進(jìn)行了一些改進(jìn),提高了復(fù)制的可靠性和易用性其他性能和安全性的改進(jìn):
MySQL 8.0包含許多其他性能和安全性的改進(jìn),包括更好的并行復(fù)制支持、更好的崩潰安全性等