關於Relay Log沒法自動刪除的問題

本文介紹了一次運維實踐中relay-log長期沒法自動刪除的緣由和解決過程mysql

 

 

背景: 今天在運維一個mysql實例時,發現其數據目錄下的relay-log 長期沒有刪除,已經堆積了幾十個relay-log。 然而其餘做爲Slave服務器實例卻沒有這種狀況。sql

 

現象分析

經過收集到的信息,綜合分析後發現relay-log沒法自動刪除和如下緣由有關。服務器

  • 該實例原先是一個Slave:致使relay-log 和 relay-log.index的存在
  • 該實例目前已經不是Slave:因爲沒有了IO-Thread,致使relay-log-purge 沒有起做用( 這也是其餘Slave實例沒有這種狀況的緣由,由於IO-thread會作自動rotate操做)。
  • 該實例天天會進行平常備份:Flush logs的存在,致使天天會生成一個relay-log
  • 該實例沒有配置expire-logs-days:致使flush logs時,也不會作relay-log清除

簡而言之就是: 一個實例若是以前是Slave,而以後停用了(stop slave),且沒有配置expire-logs-days的狀況下,會出現relay-log堆積的狀況。運維

深刻分析

順帶也和你們分享下MySQL 內部Logrotate的機制fetch

Binary Log rotate機制:

  • Rotate:每一條binary log寫入完成後,都會判斷當前文件是否超過max_binlog_size ,若是超過則自動生成一個binlog file
  • Delete:expire-logs-days 只在 實例啓動時 和 flush logs 時判斷,若是文件訪問時間早於設定值,則purge file

Relay Log rotate 機制:

  • Rotate:每從Master fetch一個events後,判斷當前文件是否超過max_relay_log_size 若是超過則自動生成一個新的relay-log-file
  • Delete: purge-relay-log 在SQL Thread每執行完一個events時判斷,若是該relay-log 已經再也不須要則自動刪除
  • Delete: expire-logs-days 只在 實例啓動時 和 flush logs 時判斷,若是文件訪問時間早於設定值,則purge file (同Binlog file) (updated: expire-logs-days和relaylog的purge沒有關係) 
    PS: 所以仍是建議配置 expire-logs-days , 不然當咱們的外部腳本因意外而中止時,還能有一層保障。

所以建議當slave再也不使用時,經過reset slave來取消relaylog,以避免出現relay-log堆積的狀況。code

相關文章
相關標籤/搜索