注册
DM 数据库查询归档日志大小
技术分享/ 文章详情 /

DM 数据库查询归档日志大小

codePanda 2025/12/31 123 0 0

在 Oracle 中,V$ARCHIVED_LOG 通过 BLOCKS × BLOCK_SIZE 可以直接计算归档大小,这是很多 DBA 的思维惯性。但在 DM** **V$ARCHIVED_LOG 视图中BLOCKSBLOCK_SIZE 均为保留列,查询时 始终返回 NULL

无法计算归档大小。

正确方式:V$ARCH_FILE

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当前归档文件的逻辑大小(字节),是最直观、最常用的统计字段。

SF_GET_ARCHIVE_SIZE 函数

这是在社区回答问题时发现的,开始发现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;

归档历史视图:V$ARCH_FILE_HISTORY

当开启参数: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 来清空此视图的历史信息。

常用SQL

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;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服