Oracle / 表空间
Oracle 永久表空间近365天增长趋势分析(基于AWR快照)
利用AWR历史快照统计近365天永久表空间的总使用量,计算容量增长量、日均增长量和增长率,辅助空间容量规划与趋势判断。
SQL#表空间增长#AWR分析#容量规划#Oracle监控#趋势分析
适用版本:Oracle 10g及以上(依赖AWR历史视图)
上生产前,先在测试库跑一遍,确认版本、权限和影响范围。涉及数据或配置变更时,先备份,备好回退方案。
脚本使用说明
这些脚本供学习和日常运维参考。执行前请自行验证脚本是否适合你的环境,做好必要备份,并承担执行风险。因使用脚本造成的损失,本站在法律允许的范围内不承担责任。依法应承担的责任仍由本站承担。
oracle-tablespace-growth-analysis-awr.sql
环境与权限
需要具备查询DBA_HIST_SNAPSHOT、DBA_HIST_TBSPC_SPACE_USAGE、V$TABLESPACE、DBA_TABLESPACES视图的权限;AWR已启用且历史快照保留覆盖所需时间段。
使用方式
- 下载脚本,在具备 AWR 历史视图查询权限的环境启动 SQL*Plus。
使用方式 · bash
sqlplus -L /nolog- 按现场认证方式连接目标库,再执行下载的文件。
使用方式 · sql
@oracle-tablespace-growth-analysis-awr.sql完整脚本
Oracle · sql
SET LINESIZE 220
SET PAGESIZE 100
COLUMN START_DATE FORMAT A12
COLUMN END_DATE FORMAT A12
COLUMN START_GB FORMAT 999,999,990.00
COLUMN END_GB FORMAT 999,999,990.00
COLUMN GROWTH_GB FORMAT 999,999,990.00
COLUMN GROWTH_TB FORMAT 999,990.00
COLUMN AVG_GB_PER_DAY FORMAT 999,990.00
COLUMN GROWTH_PCT FORMAT 999,990.00
-- 统计近365天永久表空间的每日使用量及容量增长指标
WITH SNAP_TIME AS (
SELECT DBID,
SNAP_ID,
TRUNC(MIN(BEGIN_INTERVAL_TIME)) SNAP_DATE
FROM DBA_HIST_SNAPSHOT
WHERE BEGIN_INTERVAL_TIME >= SYSDATE - 365
GROUP BY DBID, SNAP_ID
),
DAILY_TBS AS (
SELECT ST.SNAP_DATE,
U.TABLESPACE_ID,
MAX(U.TABLESPACE_USEDSIZE * DT.BLOCK_SIZE) USED_BYTES
FROM DBA_HIST_TBSPC_SPACE_USAGE U
JOIN SNAP_TIME ST
ON ST.DBID = U.DBID
AND ST.SNAP_ID = U.SNAP_ID
JOIN V$TABLESPACE V
ON V.TS# = U.TABLESPACE_ID
JOIN DBA_TABLESPACES DT
ON DT.TABLESPACE_NAME = V.NAME
WHERE DT.CONTENTS = 'PERMANENT'
GROUP BY ST.SNAP_DATE,
U.TABLESPACE_ID
),
DAILY_USAGE AS (
SELECT SNAP_DATE,
SUM(USED_BYTES) / POWER(1024, 3) USED_GB
FROM DAILY_TBS
GROUP BY SNAP_DATE
),
R AS (
SELECT SNAP_DATE,
USED_GB,
ROW_NUMBER() OVER (ORDER BY SNAP_DATE) RN_FIRST,
ROW_NUMBER() OVER (ORDER BY SNAP_DATE DESC) RN_LAST
FROM DAILY_USAGE
),
S AS (
SELECT MAX(CASE WHEN RN_FIRST = 1 THEN SNAP_DATE END) START_DATE,
MAX(CASE WHEN RN_FIRST = 1 THEN USED_GB END) START_GB,
MAX(CASE WHEN RN_LAST = 1 THEN SNAP_DATE END) END_DATE,
MAX(CASE WHEN RN_LAST = 1 THEN USED_GB END) END_GB
FROM R
)
SELECT TO_CHAR(START_DATE, 'YYYY-MM-DD') START_DATE,
TO_CHAR(END_DATE, 'YYYY-MM-DD') END_DATE,
ROUND(START_GB, 2) START_GB,
ROUND(END_GB, 2) END_GB,
ROUND(END_GB - START_GB, 2) GROWTH_GB,
ROUND((END_GB - START_GB) / 1024, 2) GROWTH_TB,
ROUND(
(END_GB - START_GB) /
NULLIF(END_DATE - START_DATE, 0),
2
) AVG_GB_PER_DAY,
ROUND(
(END_GB - START_GB) /
NULLIF(START_GB, 0) * 100,
2
) GROWTH_PCT
FROM S;