国产探花免费观看_亚洲丰满少妇自慰呻吟_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迅速入門

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淄博市| 崇仁县| 广西| 多伦县| 乌恰县| 广昌县| 明溪县| 景泰县| 榆中县| 林州市| 彭州市| 阜平县| 油尖旺区| 桦南县| 唐河县| 华阴市| 上饶县| 木兰县| 葫芦岛市| 呼和浩特市| 陆川县| 高淳县| 高碑店市| 定日县| 屏边| 南乐县| 聂拉木县| 武山县| 都安| 河间市| 浦县| 清徐县| 改则县| 敦化市| 奎屯市| 普安县| 柳河县| 东台市| 乐平市| 兴化市| 岳西县|