设为首页 收藏本站
查看: 821|回复: 1

[经验分享] 计算mysql数据库目录中表文件大小并排序

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-11-8 09:18:43 | 显示全部楼层 |阅读模式
最近需要监控数据库每个表的增长量,其实在mysql中的information_schema.TABLES表中有记录表的大小,但是不准,要是计算每天每个表大小的话不是很准确,刚好我的mysql是独享表空间,所以只要计算出数据目录中的表文件大小即可实现这个目的。以下代码实现了计算在独享表空间下,计算数据库中所有表的物理大小,并计算整个mysql数据库目录的大小和数据库目录所在分区的剩余空间。以下是代码:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,time,MySQLdb
'''CREATE TABLE DBA.datasize (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host` varchar(20) NOT NULL COMMENT '服务器IP',
  `dataname` varchar(100) NOT NULL COMMENT '数据库名字',
  `tablename` varchar(100) NOT NULL COMMENT '表名字',
  `datasize` double NOT NULL COMMENT '表大小,单位:M',
  `uptime` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`,`host`,`dataname`,`tablename`,`datasize`,`uptime`),
  KEY `index_uptime` (`uptime`),
  KEY `index_tablename` (`tablename`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8''' #表结构
def log_w(text):#写日志
        logfile = "datasize.txt"
        f = open(logfile,'a+')
        text = text+'\n'
        f.write(text)
        f.close()
def log2db(size_log):#把结果写入数据库
    log_host = '192.168.100.100'
    log_user = 'wangwei'
    log_pass = 'wangwei'
    try:
        conn = MySQLdb.connect(host = log_host,port = 3306,user = log_user,passwd = log_pass,charset='utf8',connect_timeout=20)
        cursor = conn.cursor()
        cursor.executemany("insert into DBA.datasize (`host`,`dataname`,`tablename`,`datasize`,`uptime`) VALUES(%s,%s,%s,%s,%s)",tuple(size_log))
        conn.commit()
        cursor.close()
        conn.close()
    except Exception,e:
        print e
def main():
        uptime = time.strftime("%Y-%m-%d %H:%M:%S")
        text = "========================  %s  ======================" % uptime
        print text
        #log_w(text)
        mysqldir = "/home/mysql/"
        tables = {}
        host = '192.168.100.10'#数据库本地IP
        conm = 'du -sh %s' % mysqldir
        datasize = os.popen(conm).readlines()[0].split('\t')[0]
        dir_list = os.listdir(mysqldir)
        for i in dir_list:
                dirname = os.path.join(mysqldir,i)
                if os.path.isdir(dirname):
                        tb_list = os.listdir(dirname)
                        table_list = list(set([os.path.splitext(ii)[0] for ii in tb_list]))
                        for t_name in table_list:
                                t_size = 0
                                for t in tb_list:
                                        if t_name in t:
                                                f_size = os.path.getsize(os.path.join(dirname,t))
                                                t_size = t_size + f_size
                                t_size = t_size/1024/1024
                                if t_size != 0:
                                        tables[os.path.join(i,t_name)]=t_size
        tables = sorted(tables.iteritems(),key = lambda asd:asd[1],reverse = True)
        size_log = []
        for i in tables:
                text = str(i[0]).ljust(70)+str(i[1])+'M'
                aa = i[0].split("/")
                res = [host,aa[0],aa[1],i[1],uptime]
                size_log.append(res)
                #log_w(text)
                print text
        text = "All DataSize :".ljust(70)+str(datasize)
        size_log.append([host,"all","all",int(datasize.split('G')[0])*1024,uptime])
        diskfree = os.popen("df -h|grep data").readlines()[0].split()[3]
        size_log.append([host,"disk","free",int(diskfree.split('G')[0])*1024,uptime])
        #log_w(text)
        print text
        text = "Data Disk free size:".ljust(70)+diskfree
        #log_w(text)
        print text
        log2db(size_log)
if __name__=='__main__':
        main()



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-10373-1-1.html 上篇帖子: ERROR 2002 mysql连接失败 解决方法 下篇帖子: mysql忘记root密码 破解方法 数据库 mysql

尚未签到

发表于 2013-12-30 20:43:45 | 显示全部楼层
好想与你牵手走在路上即使疲惫也不愿停下直到窒息

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表