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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

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

本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1321517,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
38 2
|
6天前
|
关系型数据库 MySQL
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
16 0
|
4天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之mysql通过flink cdc同步数据,有没有办法所有表共用一个dump线程
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
8 0
|
5天前
|
存储 关系型数据库 MySQL
MySQL各字符集、排序规则的由来、用法,区别和联系
MySQL支持多种字符集和排序规则,这些在数据库设计和数据处理中起着重要作用。下面是它们的由来、用法、区别和联系: 1. **字符集(Character Set)**: - **由来**:字符集定义了数据库中可以存储的字符集合,以及这些字符在数据库中的存储方式。 - **用法**:在创建数据库或表时,可以指定所需的字符集。常见的字符集包括UTF-8、UTF-16、Latin1等。 - **区别和联系**:不同的字符集支持不同的字符范围和存储方式,选择合适的字符集可以确保数据的正确存储和处理。例如,UTF-8支持全球范围内的大多数字符,而Latin1只支持西欧语言字符集。
|
6天前
|
SQL 前端开发 Java
【个人博客系统网站】框架升级 · 工程目录 · 数据库设计
【个人博客系统网站】框架升级 · 工程目录 · 数据库设计
14 0
|
6天前
|
关系型数据库 MySQL Unix
MySQL 计算时间差分钟
【5月更文挑战第3天】
|
6天前
|
存储 算法 关系型数据库
MySQL怎样处理排序⭐️如何优化需要排序的查询?
MySQL怎样处理排序⭐️如何优化需要排序的查询?
|
6天前
|
SQL 存储 数据挖掘
数据库数据恢复—数据库ndf文件大小变为0KB的数据恢复案例
存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后,用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件,该SQL Server数据库包含两个LDF文件。
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-排序查询-语法&注意事项&可cv例题语句
【MySQL】DQL-排序查询-语法&注意事项&可cv例题语句
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句
【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句