在 Oracle 中,V$ARCHIVED_LOG 通过 BLOCKS × BLOCK_SIZE 可以直接计算归档大小,这是很多 DBA 的思维惯性。但在 DM** **V$ARCHIVED_LOG 视图中BLOCKS和BLOCK_SIZE 均为保留列,查询时 始终返回 NULL
无法计算归档大小。
DM 中关于归档文件的视图是:V$ARCH_FILE
它直接记录了归档文件路径、归档状态、创建 / 关闭时间、逻辑归档字节数(LEN)等
直接查询归档文件大小,可以和操作系统上的归档文件对比:du -sh
SELECT
DB_MAGIC,
PMNT_MAGIC,
STATUS,
CREATE_TIME,
CLOSE_TIME,
PATH,
ROUND(LEN / 1024 / 1024, 2) AS ARCH_MB
FROM V$ARCH_FILE
ORDER BY CREATE_TIME;
LEN 是 当前归档文件的逻辑大小(字节),是最直观、最常用的统计字段。
这是在社区回答问题时发现的,开始发现V$ARCHIVED_LOG视图不能用,去找了找函数和存储过程
发现DM 提供了一个专用系统函数:SF_GET_ARCHIVE_SIZE
SF_GET_ARCHIVE_SIZE(
DSC_SEQNO INTEGER, -- 数据守护序号,单机填 '0'
TYPE INTEGER, -- 类型参数:0 为日志号,1 为 LSN
START BIGINT -- 起始日志号或 LSN(根据 TYPE)
) RETURN BIGINT;
**从归档起点开始,到指定归档序号或 LSN 为止的“累计逻辑归档字节量”**也就是说,它返回的是 “累积值”,而不是单个归档文件大小。
利用差值计算单个归档大小
SELECT
DB_MAGIC,
PMNT_MAGIC,
STATUS,
CREATE_TIME,
CLOSE_TIME,
PATH,
ROUND(
(SF_GET_ARCHIVE_SIZE(DSC_SEQNO, 0, ARCH_SEQ)
- SF_GET_ARCHIVE_SIZE(DSC_SEQNO, 0, NEXT_SEQ))
/ 1024 / 1024,
3
) AS SIZE_MB
FROM V$ARCH_FILE
ORDER BY CREATE_TIME;
当开启参数:ENABLE_MONITOR = 1,DM 会启用归档历史监控视图:V$ARCH_FILE_HISTORY
1、V$ARCH_FILE >>>>> ARCH_LSN ARCH_SEQ 2、V$ARCH_FILE_HISTORY 当 INI 参数 ENABLE_MONITOR=1 时,该视图显示因归档空间不足而被服务器主动删除的所有归档文件信息。 1)此视图只能查询到已被服务器主动删除的归档文件信息,对于尚未被删除或者用户手动删除的归档文件则无法查询到; 2)此视图最多能够查询到最近 10000 个被服务器主动删除的归档文件信息; 3)若存在多路本地归档,则该视图的查询结果中将包含每一路本地归档下被删除的归档文件信息; 4)此视图记录的归档文件历史信息是内存值,不会持久化到磁盘,因此服务器重启后将无法再查询到此前被删除的归档文件信息; 5)可以通过系统过程 SP_DYNAMIC_VIEW_DATA_CLEAR 来清空此视图的历史信息。
1、基于 LEN 的日归档量统计
SELECT
TO_CHAR(CLOSE_TIME, 'yyyy-mm-dd') AS ARCH_DATE,
COUNT(*) AS ARCH_CNT,
ROUND(SUM(LEN) / 1024 / 1024, 2) AS MB
FROM V$ARCH_FILE
GROUP BY TO_CHAR(CLOSE_TIME, 'yyyy-mm-dd')
ORDER BY ARCH_DATE DESC;
2、或按创建时间:
SELECT
TO_CHAR(CREATE_TIME, 'yyyy-mm-dd') AS ARCH_DATE,
COUNT(*),
ROUND(SUM(LEN) / 1024 / 1024, 2) AS MB
FROM V$ARCH_FILE
GROUP BY TO_CHAR(CREATE_TIME, 'yyyy-mm-dd')
ORDER BY ARCH_DATE DESC;
3、基于 SF_GET_ARCHIVE_SIZE 的统计
SELECT
TRUNC(CREATE_TIME) AS ARCHIVE_DATE,
ROUND(
SUM(
SF_GET_ARCHIVE_SIZE(DSC_SEQNO, 0, ARCH_SEQ)
- SF_GET_ARCHIVE_SIZE(DSC_SEQNO, 0, NEXT_SEQ)
) / 1024 / 1024,
3
) AS TOTAL_MB
FROM V$ARCH_FILE
GROUP BY TRUNC(CREATE_TIME)
ORDER BY ARCHIVE_DATE;
窗口函数:统计最近 N 天归档趋势
近 3 天归档量滚动统计示例,适合容量预测、归档增长趋势分析、备份窗口评估
WITH arch_day AS (
SELECT
TRUNC(CREATE_TIME) AS ARCH_DATE,
ROUND(SUM(LEN) / 1024 / 1024 / 1024, 2) AS ARCH_GB
FROM V$ARCH_FILE
WHERE STATUS = 'INACTIVE'
GROUP BY TRUNC(CREATE_TIME)
)
SELECT
ARCH_DATE,
ARCH_GB,
SUM(ARCH_GB)
OVER (ORDER BY ARCH_DATE
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS ARCH_GB_3DAY
FROM arch_day
ORDER BY ARCH_DATE;
文章
阅读量
获赞
