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()