- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業務經營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯網協會理事單位
- 安全聯盟認證網站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網數碼
對于 MySQL 來說,日志文件尤為重要。MySQL 常見的日志文件有二進制日志(Binlog)、通用查詢日志(General Log)、慢查詢日志(Slow Log)、錯誤日志(Error Log)、重做日志(Redo Log)、回滾日志(Undo Log)等。今天藍隊云會詳細介紹這些日志文件。
Binlog
Binlog包含描述數據庫修改的語句,如create table、update等數據變更語句,不會記錄類似select、show 等不修改數據的語句。如果想記錄所有的 SQL 語句,則可以使用General Log,此部分內容將在下一節進行詳細講解。下面通過例子(在沒有其他會話正在修改數據的MySQL環境中操作)展開介紹。查看當前Binlog的位點:
創建一張表:
查看Binlog信息(其中的Binlog文件和位點都是通過執行上面的show master status語句獲取的):
從上面的例子中可以看出,執行的create table語句會記錄到Binlog中。
如果要開啟Binlog,就需要在配置文件的[mysqld]中加上如下語句:
表示 Binlog 的存放路徑為“/data/mysql/binlog/”,文件名為 mysql-bin 后接 Binlog的序列號。例如:
為了跟蹤使用了哪些Binlog文件,mysqld還創建了一個Binlog索引文件,其中包含Binlog文件的名稱。在默認情況下,該名稱與Binlog文件具有相同的基本名稱,擴展名為“.index”。如上面查詢的內容為mysql-bin.index。在本例中,其內容為如下形式:
如果沒有指定文件名和路徑,在[mysqld]中的配置如下:
log-bin
則默認存放在datadir下,Binlog的文件名為主機名后接Binlog的序列號,如datadir為“/data/mysql/data/”,主機名為node1,Binlog的全路徑為如下形式:
一般建議指定一個基本名稱,防止更改主機名時出現 Binlog 的文件名與之前不一致的現象。如果要關閉Binlog,就需要在配置文件中加上如下語句:
skip_log_bin
或者:
disable_log_bin
如果要關閉當前會話的Binlog,則可以執行如下語句
set sql_log_bin=0;
Binlog的作用主要有以下兩個。
復制:主庫的變更先寫入Binlog,然后傳到從庫進行回放。主從的具體原理會在第9章中詳細介紹。
災備:當誤操作后,可以先把全備導入某個新的實例中,然后通過全備時間點到誤操作中間的Binlog解析出所有事務(需要注意的是,把誤操作這條SQL語句排除掉),并在新實例中執行這些事務,達到恢復到誤操作前一刻的狀態。
Binlog可以設置為以下幾種日志格式。
statement(基于 SQL 語句的格式):每條會修改數據的 SQL 語句都會記錄在Binlog中,不需要記錄每行的變化。
row(基于行):會非常清楚地記錄每行數據被修改的細節。
mixed(混合模式):以上兩種格式的混合使用,默認采用的 statement 格式保存Binlog,statement格式無法準確復制的操作可以使用row格式保存Binlog。
MySQL會根據執行的SQL語句選擇保存日志的方式。
幾種日志格式的優點和缺點如表所示。
Binlog記錄的格式由參數binlog_format控制,如果要設置為row格式,則在[mysqld]中加上如下語句:
當然,也支持動態修改,修改參數binlog_format的全局值的方法如下:
修改參數binlog_format的會話級別的方法如下:
Binlog文件不能直接查看,需要通過mysqlbinlog工具解析。例如,在row格式下,解析Binlog的方法如下。首先執行create語句:
解析Binlog:
其中,--start-position表示開始位點,-vv表示顯示詳細信息。查看解析結果:
由上述內容可以看出,執行 create table test.b(id int)語句后,該語句就會記錄在Binlog中。
從MySQL 8.0.14開始,可以對Binlog文件和中繼日志文件進行加密,從而保護敏感數據。可以通過在配置文件的[mysqld]中加上如下語句開啟Binlog加密:
查看Binlog列表:
由此可以發現,最新的Binlog Encrypted已經變為Yes。下面嘗試通過mysqlbinlog解析最新的Binlog,具體如下:
由此可以發現,已經解析不出結果。應該使用MySQL的用戶密碼進行解析才可以,具體如下:
--read-from-remote-server參數表示從MySQL服務中讀取Binlog,而不是讀取本地日志文件。讀取遠程MySQL的Binlog要求遠程MySQL實例正在運行。
對于一個繁忙的MySQL實例,其Binlog增長也是比較快的,因此,需要設置其保留天數,如果磁盤即將滿,那么可能還要單獨刪除歷史 Binlog。本節主要介紹 Binlog的清除。可以使用 purge binary logs 語句來刪除指定 Binlog 的文件名或指定時間之前的Binlog文件,具體示例如下。
示例一,刪除指定Binlog之前的文件:
示例二,刪除指定時間之前的Binlog文件。查看Binlog文件:
刪除指定時間之前的Binlog文件:
當然,一般還是建議設置expire_logs_days參數或binlog_expire_logs_seconds參數。expire_logs_days參數定義了日志保留天數。binlog_expire_logs_seconds參數定義了日志保留秒數,MySQL 8.0建議設置這個參數,在未來的版本中可能會廢除expire_logs_days參數。
當Binlog存在的時間超過binlog_expire_logs_seconds參數設置的時間時,則自動刪除。有
時Binlog占用的磁盤空間會過大,如果要降低其保留時間,則可以進行如下操作:
如上所示,縮短保留時間后,需要執行flush logs語句才能刪除之前的Binlog
Binlog同步到磁盤的頻率由sync_binlog參數控制。sync_binlog參數大致有以下幾種配置。
sync_binlog=0,禁用MySQL服務將Binlog同步到磁盤的功能,是由操作系統控制 Binlog 的刷盤。在這種情況下,性能比較好,但是當操作系統崩潰時可能會丟失部分事務。- sync_binlog=1,每個事務都會同步到磁盤。這是最安全的設置,但是磁盤寫入次數的增加可能會導致性能下降。
sync_binlog=N,表示每N個事務Binlog同步一次到磁盤。當操作系統崩潰時,服務器提交的事務可能沒有被刷新到 Binlog 中,此時可能會丟失部分事務,雖然設置比較大的值可以提高性能,但是數據丟失的風險也會增加。
max_binlog_size:單個Binlog文件大小的最大值。
log-slave-update:從庫從主庫接收的更新是否記錄到從庫自身的Binlog中,如果從庫后面又接了從庫,或者在從庫上做備份,或者MySQL 5.6主從復制使用了GTID模式(具體原因見9.2.1節),那么建議開啟這個參數。
binlog-do-db:后面接庫名,表示當前數據庫只記錄該參數設置的庫的 Binlog,其他庫都不記錄。
binlog-ignore-db:后面接庫名,表示當前數據庫不記錄該參數設置的庫的Binlog,其他庫都記錄。
綜上所述,二進制日志(Binlog)在 MySQL 中扮演著極為重要的角色,無論是主從復制、數據災備,還是日常的數據管理,都離不開它。了解 Binlog 的各項特性、配置方法及相關操作,有助于數據庫管理員更好地管理 MySQL 數據庫,保障數據的安全與穩定。
想了解更多相關技術小分享可以上藍隊云官網查閱,更多技術問題,也可以直接咨詢。同時,藍隊云整理了運維必備的工具包免費分享給大家使用,需要的朋友可以直接咨詢。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP