深色模式
数据库容量规划
摘要:容量规划回答三个问题:现在用了多少、按当前增速还能撑多久、撑不住时怎么扩。本文用系统表统计空间占用,建立增长基线,并给出扩容与归档的可选路径。
适用环境
bash
df -h /data # 数据盘余量
free -g # 内存余量
mysql -uroot -p -e "SELECT @@datadir;"1
2
3
2
3
操作步骤
1. 统计当前占用(MySQL)
sql
-- 各库大小
SELECT table_schema AS db,
ROUND(SUM(data_length + index_length) / 1024 / 1024 / 1024, 2) AS size_gb
FROM information_schema.tables
GROUP BY table_schema ORDER BY size_gb DESC;
-- Top 20 大表(含数据量与索引量)
SELECT table_schema, table_name,
ROUND(data_length/1024/1024/1024, 2) AS data_gb,
ROUND(index_length/1024/1024/1024, 2) AS idx_gb,
table_rows
FROM information_schema.tables
ORDER BY data_length DESC LIMIT 20;1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
2. 建立增长基线
bash
# 每天记录一次总量,写入历史文件用于计算日增
mysql -uroot -p -N -e "SELECT ROUND(SUM(data_length+index_length)/1024/1024/1024,2)
FROM information_schema.tables WHERE table_schema='shopdb'" >> /var/log/db_size.log1
2
3
2
3
bash
# 由历史数据估算日增与可支撑天数
awk 'NR>1{print $1-prev} {prev=$1}' /var/log/db_size.log | tail -n 71
2
2
单次快照没有参考价值,至少连续采样 7~30 天才能得出可信的日均增长。
3. 计算还能撑多久
可支撑天数 = (磁盘可用空间 - 安全余量) / 日均增长1
安全余量建议不少于总容量的 20%,并预留备份与临时表空间。
4. 内存容量评估
sql
-- 热点数据规模决定缓冲池是否够用
SELECT ROUND(SUM(index_length)/1024/1024/1024, 2) AS total_index_gb
FROM information_schema.tables WHERE table_schema='shopdb';1
2
3
2
3
原则:热表索引与常用数据应能放进 innodb_buffer_pool_size,否则随机读会大量落到磁盘。
5. 三种应对手段
| 手段 | 适用场景 | 代价 |
|---|---|---|
| 归档冷数据 | 订单/日志类只查近期 | 需开发配合,历史查询变复杂 |
| 清理与收缩 | 大量无效/重复数据 | 需评估业务影响,注意碎片回收 |
| 垂直/水平扩容 | 归档后仍增长快 | 成本高,需改造 |
sql
-- 归档示例:先导出再删除,切勿只删不导
-- mysqldump -uroot -p shopdb orders --where="created_at < '2025-01-01'" > orders_2024.sql
DELETE FROM orders WHERE created_at < '2025-01-01' LIMIT 5000; -- 分批删,避免大事务1
2
3
2
3
危险
一次性 DELETE 百万行会产生超大事务、长时间持锁并撑爆 undo/binlog,必须分批执行并观察主从延迟。
6. 磁盘扩容(垂直扩容)
bash
# 云盘扩容后扩展文件系统(ext4/xfs 示例)
sudo growpart /dev/vdb 1
sudo xfs_growfs /data # xfs;ext4 用 resize2fs /dev/vdb1
df -h /data1
2
3
4
2
3
4
验证
- [ ] 已连续多天记录库大小,能给出日均增长与可支撑天数
- [ ] 磁盘、内存、连接数三项都有水位告警(建议 80% 预警)
- [ ] 归档方案在测试库验证过,删除后业务查询正常
常见坑
WARNING
information_schema.tables 的 table_rows 是估算值(InnoDB 采样),不要用它做容量结算,只能看量级。
WARNING
DELETE 后空间不会自动归还操作系统,InnoDB 只是标记为可复用;需要收缩时用 OPTIMIZE TABLE(会锁表,低峰执行)。
DANGER
扩容操作(尤其是缩容、文件系统调整)有数据风险,必须先备份并在低峰期执行,且准备好回滚方案。