最近需要监控数据库每个表的增长量,其实在mysql中的information_schema.TABLES表中有记录表的大小,但是不准,要是计算每天每个表大小的话不是很准确,刚好我的mysql是独享表空间,所以只要计算出数据目录中的表文件大小即可实现这个目的。以下代码实现了计算在独享表空间下,计算数据库中所有表的物理大小,并计算整个mysql数据库目录的大小和数据库目录所在分区的剩余空间。以下是代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<code>#!/usr/bin/env python</code>
<code># -*- coding: utf-8 -*-</code>
<code>import os,time,MySQLdb</code>
<code>''</code><code>'CREATE TABLE DBA.datasize (</code>
<code> </code><code>`id` int(11) NOT NULL AUTO_INCREMENT,</code>
<code> </code><code>`host` varchar(20) NOT NULL COMMENT </code><code>'服务器IP'</code><code>,</code>
<code> </code><code>`dataname` varchar(100) NOT NULL COMMENT </code><code>'数据库名字'</code><code>,</code>
<code> </code><code>`tablename` varchar(100) NOT NULL COMMENT </code><code>'表名字'</code><code>,</code>
<code> </code><code>`datasize` double NOT NULL COMMENT </code><code>'表大小,单位:M'</code><code>,</code>
<code> </code><code>`uptime` datetime NOT NULL COMMENT </code><code>'更新时间'</code><code>,</code>
<code> </code><code>PRIMARY KEY (`id`,`host`,`dataname`,`tablename`,`datasize`,`uptime`),</code>
<code> </code><code>KEY `index_uptime` (`uptime`),</code>
<code> </code><code>KEY `index_tablename` (`tablename`)</code>
<code>) ENGINE=InnoDB DEFAULT CHARSET=utf8</code><code>''</code><code>' #表结构</code>
<code>def log_w(text):#写日志</code>
<code> </code><code>logfile = </code><code>"datasize.txt"</code>
<code> </code><code>f = open(logfile,</code><code>'a+'</code><code>)</code>
<code> </code><code>text = text+</code><code>'\n'</code>
<code> </code><code>f.write(text)</code>
<code> </code><code>f.close()</code>
<code>def log2db(size_log):#把结果写入数据库</code>
<code> </code><code>log_host = </code><code>'192.168.100.100'</code>
<code> </code><code>log_user = </code><code>'wangwei'</code>
<code> </code><code>log_pass = </code><code>'wangwei'</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>conn = MySQLdb.connect(host = log_host,port = 3306,user = log_user,passwd = log_pass,charset=</code><code>'utf8'</code><code>,connect_timeout=20)</code>
<code> </code><code>cursor = conn.cursor()</code>
<code> </code><code>cursor.executemany(</code><code>"insert into DBA.datasize (`host`,`dataname`,`tablename`,`datasize`,`uptime`) VALUES(%s,%s,%s,%s,%s)"</code><code>,tuple(size_log))</code>
<code> </code><code>conn.commit()</code>
<code> </code><code>cursor.close()</code>
<code> </code><code>conn.close()</code>
<code> </code><code>except Exception,e:</code>
<code> </code><code>print</code> <code>e</code>
<code>def main():</code>
<code> </code><code>uptime = time.</code><code>strftime</code><code>(</code><code>"%Y-%m-%d %H:%M:%S"</code><code>)</code>
<code> </code><code>text = </code><code>"======================== %s ======================"</code> <code>% uptime</code>
<code> </code><code>print</code> <code>text</code>
<code> </code><code>#log_w(text)</code>
<code> </code><code>mysqldir = </code><code>"/home/mysql/"</code>
<code> </code><code>tables = {}</code>
<code> </code><code>host = </code><code>'192.168.100.10'</code><code>#数据库本地IP</code>
<code> </code><code>conm = </code><code>'du -sh %s'</code> <code>% mysqldir</code>
<code> </code><code>datasize = os.popen(conm).readlines()[0].split(</code><code>'\t'</code><code>)[0]</code>
<code> </code><code>dir_list = os.listdir(mysqldir)</code>
<code> </code><code>for</code> <code>i in dir_list:</code>
<code> </code><code>dirname = os.path.join(mysqldir,i)</code>
<code> </code><code>if</code> <code>os.path.isdir(dirname):</code>
<code> </code><code>tb_list = os.listdir(dirname)</code>
<code> </code><code>table_list = list(set([os.path.splitext(ii)[0] </code><code>for</code> <code>ii in tb_list]))</code>
<code> </code><code>for</code> <code>t_name in table_list:</code>
<code> </code><code>t_size = 0</code>
<code> </code><code>for</code> <code>t in tb_list:</code>
<code> </code><code>if</code> <code>t_name in t:</code>
<code> </code><code>f_size = os.path.getsize(os.path.join(dirname,t))</code>
<code> </code><code>t_size = t_size + f_size</code>
<code> </code><code>t_size = t_size/1024/1024</code>
<code> </code><code>if</code> <code>t_size != 0:</code>
<code> </code><code>tables[os.path.join(i,t_name)]=t_size</code>
<code> </code><code>tables = sorted(tables.iteritems(),key = lambda asd:asd[1],reverse = True)</code>
<code> </code><code>size_log = []</code>
<code> </code><code>for</code> <code>i in tables:</code>
<code> </code><code>text = str(i[0]).ljust(70)+str(i[1])+</code><code>'M'</code>
<code> </code><code>aa = i[0].split(</code><code>"/"</code><code>)</code>
<code> </code><code>res = [host,aa[0],aa[1],i[1],uptime]</code>
<code> </code><code>size_log.append(res)</code>
<code> </code><code>#log_w(text)</code>
<code> </code><code>print</code> <code>text</code>
<code> </code><code>text = </code><code>"All DataSize :"</code><code>.ljust(70)+str(datasize)</code>
<code> </code><code>size_log.append([host,</code><code>"all"</code><code>,</code><code>"all"</code><code>,int(datasize.split(</code><code>'G'</code><code>)[0])*1024,uptime])</code>
<code> </code><code>diskfree = os.popen(</code><code>"df -h|grep data"</code><code>).readlines()[0].split()[3]</code>
<code> </code><code>size_log.append([host,</code><code>"disk"</code><code>,</code><code>"free"</code><code>,int(diskfree.split(</code><code>'G'</code><code>)[0])*1024,uptime])</code>
<code> </code><code>text = </code><code>"Data Disk free size:"</code><code>.ljust(70)+diskfree</code>
<code> </code><code>log2db(size_log)</code>
<code>if</code> <code>__name__==</code><code>'__main__'</code><code>:</code>
<code> </code><code>main()</code>
<code></code><code></code>
<code></code><code>本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1321517,如需转载请自行联系原作者</code>
<code></code>