關於purge master logs的一個小實驗

  • 2019 年 10 月 4 日
  • 筆記

原理部分來自《MariaDB原理與實現》 Page109-111

purge刪除binlog的過程如下:

1、檢查to_log在mysql-bin.index中是否存在,避免非法的purge操作

2、創建一個purge_index_file,用於保存待刪除的binlog文件名稱

3、遍歷index文件,將可刪除的binlog添加到purge_index_file中(purge刪除時候,只會把未使用到的binlog之前的文件刪除掉)

4、將purge_index_file的內容寫入到磁碟

5、更新mysql-bin.index文件,將待刪除的binlog文件名從index文件中刪除掉

6、刪除所有待刪除的binlog文件

7、刪除purge_index_file文件

實驗在主庫上能否刪除從庫正在讀取的binlog:

1、在從庫上stop slave 暫停複製。

2、主庫上造幾個大的binlog,並多次flush logs切割下binlog。

3、在從庫上start  slave 開啟複製。

4、在主庫上執行purge master logs 操作清理掉全部的binlog(如下圖):

上圖中間部分,我們可以看到purge操作有一個warning。並且最終清理掉的binlog沒有我們預期的效果。

下圖是主庫中記錄的關於purge的警告資訊:

可以清楚的看到:從庫的IO執行緒正在讀取文件的情況下,主庫purge master 不會全部清理binlog。