最近需要監控資料庫每個表的增長量,其實在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>