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 指令将複制程序停止