天天看点

计算mysql数据库目录中表文件大小并排序

最近需要监控数据库每个表的增长量,其实在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>