查看数据库磁盘占用情况的方法因数据库类型(MySQL/PostgreSQL/Oracle)不同而略有差异,其中你之前操作的是MySQL,下面我会以MySQL为核心,结合系统层面和数据库内置方法,给出清晰、可操作的步骤,同时补充其他主流数据库的简要方法。

一、MySQL 查看磁盘占用(重点)

MySQL的磁盘占用主要包含:数据文件、日志文件、索引文件、临时文件等,可通过「系统命令」和「MySQL内置查询」两种方式查看。

1. 系统层面:查看MySQL数据目录的磁盘占用

MySQL的数据默认存储在 /var/lib/mysql(Linux)或 C:\ProgramData\MySQL\MySQL Server X.X\Data(Windows),先通过系统命令查看整体占用:

# 1. 查看磁盘整体挂载情况(确认数据盘剩余空间)
df -h

# 2. 查看MySQL数据目录总占用(替换为你的MySQL数据目录)
du -sh /var/lib/mysql/

# 3. 查看MySQL数据目录下各数据库的占用(按大小排序)
du -h --max-depth=1 /var/lib/mysql/ | sort -hr
2. MySQL内置查询:精准查看库/表级磁盘占用

通过 information_schema 系统库的 TABLES 表(存储表的元数据),可以精准查询单个库、单个表的磁盘占用(包含数据+索引)。

(1)查看单个数据库的总占用
-- 替换为你要查询的数据库名(如agent_qcs)
SELECT 
  TABLE_SCHEMA AS '数据库名',
  CONCAT(ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '总占用大小',
  CONCAT(ROUND(SUM(DATA_LENGTH) / 1024 / 1024, 2), ' MB') AS '数据大小',
  CONCAT(ROUND(SUM(INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '索引大小'
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'agent_qcs'  -- 数据库名
GROUP BY TABLE_SCHEMA;
(2)查看单个数据库中各表的磁盘占用(按大小排序)
-- 替换为你要查询的数据库名
SELECT 
  TABLE_NAME AS '表名',
  CONCAT(ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '总占用大小',
  CONCAT(ROUND(DATA_LENGTH / 1024 / 1024, 2), ' MB') AS '数据大小',
  CONCAT(ROUND(INDEX_LENGTH / 1024 / 1024, 2), ' MB') AS '索引大小'
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'agent_qcs'  -- 数据库名
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;
(3)查看所有数据库的磁盘占用(按大小排序)
SELECT 
  TABLE_SCHEMA AS '数据库名',
  CONCAT(ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '总占用大小'
FROM information_schema.TABLES 
GROUP BY TABLE_SCHEMA
ORDER BY SUM(DATA_LENGTH + INDEX_LENGTH) DESC;
3. 查看MySQL日志文件的占用(可选)

MySQL的日志(慢查询日志、二进制日志、错误日志)也会占用磁盘,可通过以下方式查看:

# 查看二进制日志(binlog)大小(替换日志目录)
du -h /var/lib/mysql/mysql-bin.*

# 查看慢查询日志大小(先通过my.cnf找到慢查询日志路径)
grep 'slow_query_log_file' /etc/my.cnf
du -h /var/log/mysql/slow.log

二、PostgreSQL 查看磁盘占用

-- 查看单个数据库大小
SELECT 
  datname AS "数据库名",
  pg_size_pretty(pg_database_size(datname)) AS "占用大小"
FROM pg_database
ORDER BY pg_database_size(datname) DESC;

-- 查看单个表大小(包含索引)
SELECT 
  relname AS "表名",
  pg_size_pretty(pg_total_relation_size(relname)) AS "总占用大小"
FROM pg_stat_user_tables
WHERE schemaname = 'public'  -- 模式名
ORDER BY pg_total_relation_size(relname) DESC;

三、Oracle 查看磁盘占用

-- 查看表空间占用
SELECT 
  tablespace_name AS "表空间名",
  total_size / 1024 / 1024 AS "总大小(MB)",
  used_size / 1024 / 1024 AS "已用大小(MB)",
  free_size / 1024 / 1024 AS "剩余大小(MB)",
  ROUND(used_size / total_size * 100, 2) AS "使用率(%)"
FROM (
  SELECT 
    t.tablespace_name,
    SUM(t.bytes) AS total_size,
    SUM(t.bytes) - SUM(f.bytes) AS used_size,
    SUM(f.bytes) AS free_size
  FROM dba_data_files t
  LEFT JOIN dba_free_space f ON t.tablespace_name = f.tablespace_name
  GROUP BY t.tablespace_name
);

总结

  1. MySQL核心方法:系统层面用 df -h/du -sh 看整体,数据库内用 information_schema.TABLES 查库/表级占用;
  2. 关键指标:区分「数据大小」和「索引大小」,索引通常会占10%-50%的总空间;
  3. 排查重点:若磁盘占用突增,优先检查大表、二进制日志(binlog)或慢查询日志。

这些方法都是行业通用的最佳实践,命令可直接复制执行,新手只需替换对应的数据库名/目录路径即可。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐