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. 最佳实践

  1. 定期监控:周/月
  2. 历史数据:3-12 月
  3. 业务沟通:预测
  4. 留余量 30%:缓冲
  5. 压缩归档:节省
  6. 分区策略:管理
  7. 告警提前:80%
  8. 扩容计划:提前 3 月
  9. 多维度评估:综合
  10. 文档化:记录

15. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Capacity Planning” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/