Oracle 数据库容量规划
Oracle 数据库容量规划
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
容量规划确保数据库资源充足[1]:
详细见:Oracle 数据库健康检查。
2. 评估因素
2.1 业务
- 数据量增长
- 用户数
- 并发
- 保留期
2.2 性能
- 响应时间
- 吞吐量
- 资源利用率
2.3 SLA
- 可用性
- RPO/RTO
- 性能指标
3. 数据增长
3.1 历史
SELECT snap_id,
TO_CHAR(begin_interval_time, 'YYYY-MM-DD') AS day,
ROUND(SUM(size_mb)/1024, 2) AS gb
FROM (
SELECT snap_id, begin_interval_time, tablespace_size/1024 AS size_mb
FROM dba_hist_tbspc_space_usage
)
GROUP BY snap_id, begin_interval_time
ORDER BY day DESC FETCH FIRST 30 ROWS ONLY;
3.2 趋势
SELECT tablespace_name,
ROUND(AVG(size_gb), 2) AS avg_gb,
ROUND(MAX(size_gb), 2) AS max_gb,
ROUND(MIN(size_gb), 2) AS min_gb
FROM (
SELECT tablespace_name, snap_id,
SUM(tablespace_size)/1024/1024 AS size_gb
FROM dba_hist_tbspc_space_usage
GROUP BY tablespace_name, snap_id
)
GROUP BY tablespace_name;
4. 表空间
4.1 当前
SELECT
tablespace_name,
ROUND(SUM(total)/1024/1024/1024, 2) AS total_gb,
ROUND(SUM(used)/1024/1024/1024, 2) AS used_gb,
ROUND(SUM(free)/1024/1024/1024, 2) AS free_gb,
ROUND(SUM(used)/NULLIF(SUM(total),0)*100, 2) AS pct_used
FROM (
SELECT tablespace_name, bytes AS total, 0 AS used, 0 AS free
FROM dba_data_files
UNION ALL
SELECT tablespace_name, 0, bytes, 0 FROM dba_segments
UNION ALL
SELECT tablespace_name, 0, 0, bytes FROM dba_free_space
)
GROUP BY tablespace_name
ORDER BY pct_used DESC;
4.2 增长预测
SELECT tablespace_name,
ROUND(MIN(size_gb), 2) AS min_gb,
ROUND(MAX(size_gb), 2) AS max_gb,
ROUND((MAX(size_gb) - MIN(size_gb)) / COUNT(DISTINCT snap_id), 2) AS daily_growth_gb
FROM (
SELECT tablespace_name, snap_id, SUM(tablespace_size)/1024/1024 AS size_gb
FROM dba_hist_tbspc_space_usage
GROUP BY tablespace_name, snap_id
)
GROUP BY tablespace_name;
4.3 扩展
-- 添加数据文件
ALTER TABLESPACE users ADD DATAFILE '/u01/oradata/users02.dbf' SIZE 10G AUTOEXTEND ON;
-- 自动扩展
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' AUTOEXTEND ON NEXT 1G MAXSIZE 50G;
-- 大文件表空间
CREATE BIGFILE TABLESPACE big_ts DATAFILE '/u01/oradata/big_ts.dbf' SIZE 1T;
5. CPU
5.1 当前使用
SELECT snap_id,
ROUND(AVG(value), 2) AS cpu_usage
FROM dba_hist_sysmetric_history
WHERE metric_name = 'CPU Usage Per Sec'
GROUP BY snap_id
ORDER BY snap_id DESC FETCH FIRST 30 ROWS ONLY;
5.2 容量
- 物理 CPU
- vCPU
- 实例进程
- 并行
5.3 升级
- 增加核数
- NUMA
- CPU 亲和
详细见:Oracle-Linux 调优详解。
6. 内存
6.1 SGA
SELECT * FROM v$sgainfo;
SHOW PARAMETER sga
6.2 PGA
SELECT name, value, unit FROM v$pgastat;
SHOW PARAMETER pga
6.3 容量评估
- 连接数 × PGA/连接
- 缓存命中率
- 解析率
详细见:Oracle 内存管理 SGA/PGA。
7. I/O
7.1 吞吐
SELECT snap_id,
ROUND(SUM(value)/1024/1024, 2) AS mb_per_sec
FROM dba_hist_sysmetric_history
WHERE metric_name IN ('Physical Read Total Bytes Per Sec', 'Physical Write Total Bytes Per Sec')
GROUP BY snap_id
ORDER BY snap_id DESC FETCH FIRST 30 ROWS ONLY;
7.2 IOPS
SELECT snap_id,
ROUND(AVG(value), 2) AS iops
FROM dba_hist_sysmetric_history
WHERE metric_name = 'Physical Read Total IO Requests Per Sec'
GROUP BY snap_id;
7.3 容量
- 磁盘数量
- IOPS 上限
- 吞吐上限
8. 网络
8.1 流量
- 连接数
- 数据传输
- Data Guard 同步
8.2 容量
- 带宽
- 延迟
- 并发
9. 备份
9.1 备份大小
SELECT session_key,
output_bytes/1024/1024/1024 AS backup_gb,
TO_CHAR(start_time, 'YYYY-MM-DD') AS day
FROM v$rman_backup_job_details
ORDER BY start_time DESC;
9.2 FRA
SELECT name,
space_limit/1024/1024/1024 AS limit_gb,
space_used/1024/1024/1024 AS used_gb
FROM v$recovery_file_dest;
9.3 保留
- 恢复窗口
- 冗余
- 长期归档
详细见:Oracle 备份恢复规划。
10. 归档
10.1 速率
SELECT TO_CHAR(completion_time, 'YYYY-MM-DD') AS day,
COUNT(*) AS log_count,
ROUND(SUM(blocks * block_size)/1024/1024/1024, 2) AS gb
FROM v$archived_log
WHERE completion_time > SYSDATE - 30
GROUP BY TO_CHAR(completion_time, 'YYYY-MM-DD')
ORDER BY day DESC;
10.2 容量
- 每日 GB
- 保留天数
- FRA 大小
详细见:Oracle 归档日志管理详解。
11. 增长预测
11.1 历史趋势
SELECT TO_CHAR(begin_interval_time, 'YYYY-MM') AS month,
ROUND(AVG(size_gb), 2) AS avg_size_gb
FROM (
SELECT begin_interval_time, SUM(tablespace_size)/1024/1024 AS size_gb
FROM dba_hist_tbspc_space_usage
GROUP BY begin_interval_time
)
GROUP BY TO_CHAR(begin_interval_time, 'YYYY-MM')
ORDER BY month DESC;
11.2 预测
- 线性回归
- 业务增长
- 季节性
11.3 容量阈值
- 70%:警告
- 80%:紧急
- 90%:扩展
12. 监控
12.1 告警
SELECT tablespace_name,
ROUND(used/total*100, 2) AS pct_used
FROM (
SELECT tablespace_name,
SUM(bytes) AS total,
SUM(CASE WHEN bytes < maxbytes THEN maxbytes - bytes ELSE 0 END) AS free
FROM dba_data_files
GROUP BY tablespace_name
);
-- > 80% 告警
12.2 报告
- 每日容量
- 每周增长
- 每月预测
13. 扩展策略
13.1 垂直
- 增加资源(CPU / 内存)
- 单机增强
13.2 水平
- RAC
- 分片
- 读写分离
13.3 云
- 弹性扩展
- 自动
- 按需
详细见:Oracle Cloud 部署详解。
14. 优化
14.1 数据归档
-- 历史数据归档
ALTER TABLE sales EXCHANGE PARTITION p2020 WITH TABLE sales_archive;
ALTER TABLE sales DROP PARTITION p2020;
详细见:Oracle 分区表设计详解。
14.2 压缩
ALTER TABLE sales MOVE COMPRESS FOR OLTP;
ALTER TABLE sales_archive MOVE COMPRESS FOR ARCHIVE HIGH;
详细见:Oracle 表压缩技术 SQL。
14.3 清理
- 临时表
- 旧数据
- 日志
15. 常见坑与排错
15.1 空间不足
- 监控
- 提前扩展
- 自动扩展
15.2 增长异常
- 业务分析
- 异常数据
- 调整
15.3 性能下降
- I/O 瓶颈
- 内存不足
- 扩展
16. 最佳实践
- 历史数据:基线
- 趋势分析:预测
- 容量阈值:告警
- 自动扩展:保护
- 归档压缩:优化
- 垂直 + 水平:扩展
- 云弹性:现代
- 定期评审:调整
- 业务沟通:增长
- 文档化:规划
17. 参考资料
[1] Oracle Database 2 Day DBA 19c, “Capacity Planning” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/