国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql expire_logs_days是如何生效和計算出來的

2024-07-24 12:35:18
字體:
來源:轉載
供稿:網友
  mysql主備復制是通過binlog完成的。在開啟binlog的情況下,expire_logs_days參數可以讓mysql自動清理若干天前的binlog。
 
  那么expire_logs_days是在什么時候生效的呢?初步猜想實在每次產生一個新的binlog的時候去判斷一次。查了一下具體的實現,確實是這樣的:
 
  源碼(5.1.58, log.cc)
 
  int MYSQL_BIN_LOG::rotate_and_purge(uint flags)  
 
  {  
 
  ...  
 
    if (!error && check_purge && expire_logs_days)  
 
    {  
 
      time_t purge_time= my_time(0) - expire_logs_days*24*60*60;  
 
      if (purge_time >= 0)  
 
        purge_logs_before_date(purge_time);  
 
    }  
 
  ...  
 
  }  
 
  如果設置了expire_logs_days,每次binlog rotate的時候都去計算一下purge_time(當前時間-expire_logs_days;
 
  這個計算似乎是可以省去的: expire_logs_days是以天為單位,范圍是0~99, 0表示不會清理,自然不會進入if塊內:),
 
  以99來計算,my_time(0) - 99*24*60*60>=0也是恒真的了),調用purge_logs_before_date(purge_time),
 
  purge_logs_before_date會從log index文件中的第一個binlog文件開始循環: 比較文件的最后修改時間,如果小于purge_time,
 
  就放入數組to_log中。然后調用purge_logs,清理所有滿足條件的binlog。
 
  int MYSQL_BIN_LOG::purge_logs_before_date(time_t purge_time)  
 
  {  
 
  ...  
 
    MY_STAT stat_area;  
 
  ...  
 
    pthread_mutex_lock(&LOCK_index);  
 
    to_log[0]= 0;  
 
    if ((error=find_log_pos(&log_info, NullS, 0 /*no mutex*/)))  
 
      goto err;  
 
    
 
    while (strcmp(log_file_name, log_info.log_file_name) &&  
 
       !is_active(log_info.log_file_name) &&  
 
           !log_in_use(log_info.log_file_name))  
 
    {  
 
  ...  
 
        if (stat_area.st_mtime < purge_time)   
 
          strmake(to_log,   
 
                  log_info.log_file_name,   
 
                  sizeof(log_info.log_file_name) - 1);  
 
        else  
 
          break;  
 
  ...  
 
     }  
 
     
 
  下面看一下purge_logs的實現:
 
  int MYSQL_BIN_LOG::purge_logs(const char *to_log,   
 
                            bool included,  
 
                            bool need_mutex,   
 
                            bool need_update_threads,   
 
                            ulonglong *decrease_log_space)  
 
  {  
 
  ...  
 
    while ((strcmp(to_log,log_info.log_file_name) || (exit_loop=included)) &&  
 
           !is_active(log_info.log_file_name) &&  
 
           !log_in_use(log_info.log_file_name))  
 
    {  
 
      if ((error= register_purge_index_entry(log_info.log_file_name)))  
  
         my_delete調用unlink()刪除binlog文件。至此,完成了自動清理binlog的過程。另外當mysql啟動的時候,mysql也會執行purge_logs_before_date(purge_time)的過程(其它的操作,如果會引起binlog rotate,自然也會觸發這個過程,如flush logs)。
 
         梳理一下整個過程,不難發現,在壓力比較大的mysql上或生產環境,我們不應該啟動這個參數(my.cnf中不顯式設置該參數或設置expire_logs_days=0):mysql每天產生十幾個或更多的binlog文件,啟用這個參數后,一次清理這么多文件,必定會導致磁盤io被占滿,mysql出現抖動或hang住。因此建議自己編寫腳本,每次purge完一個binlog后,sleep幾秒。

(編輯:武林網)

上一篇:mysql -e細說

下一篇:mysqlsla迅速入門

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 革吉县| 威海市| 肇东市| 德庆县| 遂川县| 乐平市| 丰原市| 大新县| 定兴县| 白沙| 喀喇沁旗| 青阳县| 枣庄市| 西乌珠穆沁旗| 许昌市| 孟津县| 金溪县| 阿坝| 宜都市| 阿克| 永康市| 景宁| 仪陇县| 临湘市| 兴城市| 贺兰县| 沈丘县| 乐山市| 德昌县| 麻栗坡县| 九龙坡区| 乌拉特前旗| 大姚县| 桓台县| 集贤县| 柳河县| 鹿邑县| 获嘉县| 远安县| 乐平市| 齐齐哈尔市|