天天看點

MySQL專題和技巧——正确清理binlog日志

作者:賀浦力特

binlog(二進制日志)主要記錄 MySQL 資料庫的變化. 它會記錄所有更改表資料和表結構的事件。

使用binlog日志主要有兩種用途

  • 主從備份. 主庫上的二進制日志記錄主庫的所有變更, 主庫會把日志包含的事件發給從庫, 從庫執行這些事件, 進而與主庫的資料保持一緻
  • 從二進制日志恢複資料庫.

9de7bb31d0644e7393039222babfed10 歡迎收藏。

清理前的準備

檢視主庫和從庫正在使用的binlog是哪個檔案

show master status
show slave status\G           

方法1 手動清理binlog

删除指定日期以前的日志

purge master logs before '2023-04-18 17:20:00';           

删除指定日志檔案的日志索引中binlog日志檔案(不含指定的序号,000419)

purge master logs to 'binlog.000419';           

方法2 通過設定binlog過期時間,使系統自動删除binlog檔案

1. 在mysql中修改

檢視binlog過期時間,這個值預設是0天,也就是說不自動清理,本例修改為7天

mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.01 sec)
mysql> set global expire_logs_days = 7;

-- 如果  binlog_expire_logs_seconds 已經設定會報錯如下
3683 - The option expire_logs_days and binlog_expire_logs_seconds cannot be used together. Please use binlog_expire_logs_seconds to set the expire time (expire_logs_days is deprecated)           

設定之後不會立即清除,觸發條件是以下之一:

● binlog 大小超過 max_binlog_size,max_binlog_size 預設為 1G

● 手動執行flush logs

2. 在配置檔案my.cnf中修改

mysqld在每個二進制日志名後面添加一個數字擴充名. 每次啟動伺服器或重新整理日志時該數字則增加. 如果目前日志大小達到 max_binlog_size 還會自動建立新的二進制日志. 如果你正在使用大的事務,二進制日志還會超過 max_binlog_size 事務全寫入一個二進制日志中,絕對不要寫入不同的二進制日志中.

expire_logs_days: 定義了mysql清除過期日志的時間. 預設值為0,表示 "沒有自動删除"

max_binlog_size: 二進制日志最大大小,如果二進制日志寫入的内容超出給定值,日志就會發生滾動. 變量可設定範圍是 4096 位元組 和 1GB 之間

在my.cnf中添加配置,設定過期時間為30天

expire_logs_days = 30
max_binlog_size使用預設值即可           

方法3 通過設定binlog過期時間,使系統自動删除binlog檔案

MySQL8.0 版本中新增參數 binlog_expire_logs_seconds 可以精确到秒,而此前版本中 expire_logs_days 的機關為天,最小值為1,MySQL8.0 GA中此參數标記為 deprecated. 在 MySQL8.0 GA版本預設使用 binlog_expire_logs_seconds 時間為2592000秒(30天)

若在啟動時 inlog_expire_logs_seconds 和 expire_logs_days 都沒設定值,則使用預設值的 binlog_expire_logs_seconds 值,即30天

若在啟動時 binlog_expire_logs_seconds 或 expire_logs_days 其中一個設定為非0值則非0值的參數作為 binlog 日志失效期

若在啟動時 binlog_expire_logs_seconds 和 expire_logs_days 參數都設定為非0值則使用 binlog_expire_logs_seconds 值,expire_logs_days 值則失效并發出告警資訊

若要關閉自動清除binlog檔案的功能則需要顯示指定 binlog_expire_logs_seconds=0 并且不設定 expire_logs_days 的值

為了相容早期版本若顯式指定了 expire_logs_days =0 而沒有指定 binlog_expire_logs_seconds 的值,此時自動清理 binlog 日志則是禁用 的,并且此時 binlog_expire_logs_seconds 的預設值不适用

該參數支援動态修改,并且支援持久話到配置檔案:

mysql> set global binlog_expire_logs_seconds=60*60*24;
mysql> set persist binlog_expire_logs_seconds=60*60*24;           

補充

reset master: 将删除日志索引檔案中記錄的所有binlog檔案,建立一個新的日志檔案,起始值從000001開始. 不要輕易使用該指令,這個指令通常僅僅用于第一次用于搭建主從關系的時的主庫

reset slave: 清除master.info檔案, relay-log.info檔案,以及所有的relay log檔案,并重新啟用一個新的relaylog檔案

使用reset slave之前必須使用stop slave 指令将複制程序停止

繼續閱讀