Oracle 数据库容量规划
Oracle 数据库容量规划
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
容量规划是数据库运维基础[1]:
关键指标:
- 存储容量
- CPU 容量
- 内存容量
- 网络带宽
- I/O 吞吐
2. 存储容量
2.1 当前使用
-- 表空间使用
SELECT
df.tablespace_name,
ROUND(SUM(df.bytes) / 1024 / 1024 / 1024, 2) AS size_gb,
ROUND(SUM(df.bytes - NVL(fs.bytes, 0)) / 1024 / 1024 / 1024, 2) AS used_gb,
ROUND((SUM(df.bytes) - SUM(NVL(fs.bytes, 0))) / SUM(df.bytes) * 100, 2) AS pct_used
FROM dba_data_files df, dba_free_space fs
WHERE df.file_id = fs.file_id(+)
GROUP BY df.tablespace_name
ORDER BY pct_used DESC;
2.2 增长趋势
SELECT
TO_CHAR(snapshot_time, 'YYYY-MM-DD') AS day,
ROUND(SUM(size_mb) / 1024, 2) AS size_gb
FROM dba_hist_tbspc_space_usage
GROUP BY TO_CHAR(snapshot_time, 'YYYY-MM-DD')
ORDER BY day DESC;
2.3 段增长
SELECT
segment_name,
ROUND(bytes / 1024 / 1024) AS mb,
TO_CHAR(created, 'YYYY-MM-DD') AS created
FROM dba_segments
ORDER BY bytes DESC
FETCH FIRST 10 ROWS ONLY;
3. 存储预测
3.1 平均增长率
当前 1TB
3 个月前 800GB
增长率 = (1000 - 800) / 3 = 67GB/月
1 年后:1000 + 67*12 = 1804GB
3.2 业务增长
- 用户数增长
- 数据量增长
- 历史数据保留
3.3 留余量
- 推荐 30-50% 余量
4. CPU 容量
4.1 当前 CPU
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name LIKE 'CPU%'
ORDER BY begin_time DESC;
4.2 AAS
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name = 'Average Active Sessions';
4.3 评估
- AAS < CPU 数:健康
- AAS = CPU 数:瓶颈
- AAS > CPU 数:过载
5. 内存容量
5.1 当前使用
SELECT * FROM v$sgainfo;
SELECT * FROM v$pgastat WHERE name IN ('aggregate PGA target parameter', 'total PGA allocated');
5.2 命中率
-- Buffer Cache
SELECT 1 - SUM(decode(name, 'physical reads cache', value, 0)) /
SUM(decode(name, 'consistent gets from cache', value, 0) +
decode(name, 'db block gets from cache', value, 0)) AS buffer_hit
FROM v$sysstat WHERE name IN ('physical reads cache', 'consistent gets from cache', 'db block gets from cache');
-- Library Cache
SELECT SUM(gets - getmisses) / NULLIF(SUM(gets), 0) AS lib_hit
FROM v$librarycache;
6. I/O 容量
6.1 当前 IOPS
SELECT
metric_name,
value
FROM v$sysmetric
WHERE metric_name LIKE '%I/O%';
6.2 吞吐
SELECT
metric_name,
value / 1024 / 1024 AS mbps
FROM v$sysmetric
WHERE metric_name IN ('Physical Read Bytes Per Sec', 'Physical Write Bytes Per Sec');
6.3 文件 I/O
SELECT
df.file_name,
fs.phyrds,
fs.phywrts,
fs.avgiotim
FROM v$filestat fs, dba_data_files df
WHERE fs.file# = df.file_id
ORDER BY phyrds + phywrts DESC;
7. 容量规划方法
7.1 历史 + 预测
1. 收集历史数据(3-12 月)
2. 计算增长率
3. 考虑业务计划
4. 预测未来(6-12 月)
5. 留余量
7.2 业务驱动
1. 业务量增长预测
2. 用户数增长
3. 数据保留策略
4. 新功能上线
7.3 容量评估
当前 + 预测增长 = 未来需求
未来需求 / 当前容量 = 利用率
利用率 > 80% = 扩容
8. 监控指标
8.1 存储告警
-- 表空间 80%
SELECT
tablespace_name,
used_pct
FROM (
SELECT
tablespace_name,
ROUND((1 - SUM(NVL(fs.bytes, 0)) / SUM(df.bytes)) * 100, 2) AS used_pct
FROM dba_data_files df, dba_free_space fs
WHERE df.file_id = fs.file_id(+)
GROUP BY tablespace_name
)
WHERE used_pct > 80;
8.2 CPU 告警
AAS / CPU 数 > 0.7:警告
AAS / CPU 数 > 0.9:严重
9. 扩容方案
9.1 垂直扩容
- 加 CPU
- 加内存
- 加磁盘
9.2 水平扩容
- RAC 节点
- 分库分表
- 读写分离
9.3 数据归档
-- 归档历史数据
CREATE TABLESPACE archive_data DATAFILE '...' SIZE 100G;
ALTER TABLE sales MOVE PARTITION p_old TABLESPACE archive_data;
10. 压缩节省
10.1 表压缩
-- OLTP 压缩 2-3x
ALTER TABLE sales COMPRESS FOR OLTP;
ALTER TABLE sales MOVE COMPRESS FOR OLTP;
-- 归档压缩 5-15x
ALTER TABLE sales_old MOVE COMPRESS FOR ARCHIVE HIGH;
10.2 LOB 压缩
ALTER TABLE t MODIFY LOB(data) (COMPRESS HIGH);
11. 数据生命周期
11.1 在线数据
- 高性能存储
- 索引完整
- 不压缩
11.2 归档数据
- 低成本存储
- 压缩
- 分区
11.3 备份
- 长期备份
- 离线存储
12. 容量报告
12.1 月度报告
存储使用:1TB / 2TB (50%)
增长率:50GB/月
预计 1 年后:1.6TB
CPU:60% 平均
内存:80%
建议:暂无
12.2 季度评估
- 业务变化
- 容量调整
- 扩容计划
13. 常见坑与排错
13.1 容量预估不足
- 增长率低估
- 业务突发
- 季节性高峰
13.2 资源浪费
- 过度扩容
- 单节点超配
- 监控不足
14. 最佳实践
- 定期监控:周/月
- 历史数据:3-12 月
- 业务沟通:预测
- 留余量 30%:缓冲
- 压缩归档:节省
- 分区策略:管理
- 告警提前:80%
- 扩容计划:提前 3 月
- 多维度评估:综合
- 文档化:记录
15. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Capacity Planning” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/