天天看點

計算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>