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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

最近需要监控数据库每个表的增长量,其实在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,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
自然语言处理 关系型数据库 MySQL
如何在mysql数据库里进行文本的相似度排序?
【8月更文挑战第28天】如何在mysql数据库里进行文本的相似度排序?
757 62
|
5月前
|
存储 关系型数据库 MySQL
MySQL中实施排序(sorting)及分组(grouping)操作的技巧。
使用这些技巧时,需要根据实际的数据量、表的设计和服务器性能等因素来确定最合适的做法。通过反复测试和优化,可以得到最佳的查询性能。
373 0
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
170 3
|
存储 缓存 关系型数据库
阿里云数据库 SelectDB 多计算集群核心设计要点揭秘与场景应用
在云原生存算分离架构下,多计算集群的实现从技术方案上看似乎并不存在过多难题。但从产品的角度而言,具备成熟易用的多计算集群能力且能运用于用户实际业务场景中,还有较多核心要点需要深度设计
460 23
阿里云数据库 SelectDB 多计算集群核心设计要点揭秘与场景应用
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
MySQL高级篇——排序、分组、分页优化
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
本文详细解析了MySQL中`ORDER BY`的实现原理及优化方法。通过解析与优化、执行及多种优化技术,如索引利用、内存排序、外部排序等,帮助你提升排序性能。了解其背后的机制,可显著优化查询效率。
829 4
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
在实际开发中,我们经常会使用 MySQL 的 `ORDER BY`进行排序,那么,`ORDER BY`是如何实现的排序的?我们该如何优化 `ORDER BY`的排序性能?这篇文章,我们来聊一聊。
202 4

推荐镜像

更多