mysql主從的binlog定時刪除是很重要的,一般是通過expire_logs_days = 10來設定binlog保留的天數mysql5.0一下版本不支援),但有時這還不夠,假如有幾天的日誌量非常大,硬碟可能會滿,所以不但要設定保留的天數,還要監控硬碟的空間使用方式。寫了一個指令碼,適合各個版本的mysql,保留3天的日誌,當存放日誌的硬碟使用率超過80%,則保留2天,但至少會保留一天的binlog記錄檔。
- #!/bin/env python
- # -*- coding: utf-8 -*-
- ##############################################################
- #查看存在binlog的目錄位置並找出3天前的最後一個bin-log檔案名稱字
- #刪除3天以前的binlog檔案,刪除之後data1目錄掛載的硬碟使用率超
- #過的80%的話,繼續刪除2天前的記錄檔,至少保留一天的日誌。
- ##############################################################
-
- import os,sys,time,MySQLdb
-
- def log_w(text):
- logfile = "/usr/local/zabbix/bin/delet.log"
- now = time.strftime("%Y-%m-%d %H:%M:%S")
- tt = now + "\t" + str(text) + "\n"
- f = open(logfile,'a+')
- f.write(tt)
- f.close()
-
- def mysql_conn(port,lastlog,days):
- try:
- center_ip = '127.0.0.1'
- center_user = 'repl_monitor'
- center_passwd = 'VQMQLGwTaw3k0UV8'
- sql = "PURGE MASTER LOGS TO '%s';" % lastlog
- conn = MySQLdb.connect(host = center_ip,port = int(port),user = center_user,passwd = center_passwd,connect_timeout=5)
- cursor = conn.cursor()
- cursor.execute(sql)
- alldata = cursor.fetchall()
- cursor.close()
- conn.close()
- text = "Deltet before %s days binlog,deltet %s before !" % (days,lastlog)
- log_w(text)
- except Exception,e:
- log_w(e)
-
- def find_logdir():
- conn = "find / -name binlog|grep -v usr"
- logdir_list = os.popen(conn).readlines()
- if len(logdir_list) != 0:
- for logdir in logdir_list:
- datadir = logdir.strip().split("/")[1]
- if "mysql_log" in logdir.strip():
- port = 3306
- else:
- port = logdir.strip().split("/")[3].split("-")[-1]
- days = 3
- while 1:
- conn = "find %s -mtime %s|sort" % (logdir.strip(),days)
- count = os.popen(conn).readlines()
- if len(count) != 0:
- lastlog = count[-1].strip().split("/")[-1]
- mysql_conn(port,lastlog,days)
-
- df = "df -h|grep -e '%s$'|awk '{print $5}'|awk -F '%%' '{print $1}'" % datadir
- disk = os.popen(df).read().strip()
- if not disk:
- break
- else:
- if int(disk) < 80:
- break
- else:
- days = days - 1
- if days == 1:
- break
- else:
- sys.exit()
-
- if __name__ == "__main__":
- find_logdir()
本文出自 “王偉” 部落格,請務必保留此出處http://wangwei007.blog.51cto.com/68019/1123088