2017-06-28 DBA日记,查询v$rman_status缓慢诊断与优化

本文针对一条由SYS用户在后台调用的SQL语句“selectp,NULL,NULLfrom(selectcount(*)pfromv$rman_statuswhereoperation='BLOCKMEDIARECOVERY')”运行缓慢的问题进行了解析。通过收集数据、生成执行计划并参照Oracle官方文档,最终找到了解决方案:删除特定统计信息,有效提升了SQL执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:
发现有一条由SYS用户在后台调用的SQL语句“select p, NULL, NULL from (select count(*) p from v$rman_status where operation = 'BLOCK MEDIA RECOVERY')”运行缓慢约5分钟,为什么呢?
第一次分析:
1)收集数据:
1.1 查询v$active_session_history,获得该语句运行时信息。
1.2 生成该SQL语句的执行计划
1.3 查找相关案例 support.oracle.com ,QUERIES ON V$RMAN_STATUS are very slow even after GATHER_FIXED_OBJECTS_STATS is run (文档 ID 1525917.1)
2) 数据分析
从1.1中得知该SQL语句在运行时没有发生等待,全程使用CPU,与1.3的文章描述比较接近
3)结论:
按照oracle提供的方案SQL> exec dbms_stats.DELETE_TABLE_STATS('SYS','X$KCCRSR') 在测试环境上试了一下,发现只有在用sys用户继续执行问题SQL语句,性能才有所提升,其它用户执行,依然很慢。
为确保生产环境的稳定,最后在闲时执行,并观察数据库的反应,如有不良反应,则执行
exec SYS.DBMS_STATS.GATHER_FIXED_OBJECTS_STATS();
附录一:
QUERIES ON V$RMAN_STATUS are very slow even after GATHER_FIXED_OBJECTS_STATS is run (文档 ID 1525917.1)
This document is being delivered to you via Oracle Support's Rapid Visibility (RaV) process and therefore has not been subject to an independent technical review.
APPLIES TO:
Oracle Database - Enterprise Edition - Version 11.2.0.2 and later
Information in this document applies to any platform.
***Checked for relevance on 17-Jul-2014***
SYMPTOMS
QUERIES ON V$RMAN_STATUS are very slow even after running GATHER_FIXED_OBJECTS_STATS
Getting SQL 10046 trace and running the trace file through TKPROF shows the problem query:
select *
from
v$rman_status
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.04 0.20 7 128 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 17 2488.40 2525.34 0 0 0 233
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 19 2488.44 2525.55 7 128 0
Almost all the elapsed time is spent on CPU.
CAUSE
Bug 14078947 - SELECT FROM V$RMAN_STATUS VERY SLOW WHEN DATABASE IS OPEN
The problem only occurs when database is open.
SOLUTION
Delete the following statistics in the target:
SQL> exec dbms_stats.DELETE_TABLE_STATS('SYS','X$KCCRSR')
REFERENCES
BUG:14078947 - SELECT FROM V$RMAN_STATUS VERY SLOW WHEN DATABASE IS OPEN
<think>我们面对的问题是:当v$rman_configuration视图为空时,如何查询Oracle数据库归档日志的保留策略和保留天数? 根据引用[1]和[2],我们知道Oracle有两种主要的保留策略:基于恢复窗口(RECOVERY WINDOW)和基于冗余数量(REDUNDANCY)。但若v$rman_configuration视图为空,说明没有显式配置RMAN保留策略,此时我们需要了解默认策略。 根据引用[2]中的说明: - 默认情况下,如果没有配置保留策略,则使用`REDUNDANCY 1`策略(即保留到被备份覆盖)。 - 另外,归档日志的删除还受到备份状态的影响(引用[1]:只有当满足归档日志删除策略的日志,才可以从磁盘上删除)。 因此,我们可以通过以下步骤来确定归档保留策略和天数: 步骤1:查询控制文件中的备份保留策略 即使v$rman_configuration为空,我们还可以尝试从控制文件中获取备份保留策略信息: ```sql SELECT * FROM v$backup_archivelog_details; ``` 这个视图会显示归档日志备份的详细信息,包括备份时间和保留状态。 步骤2:检查实际归档日志的保留情况 通过计算现有归档日志的时间跨度来确定实际保留天数: ```sql SELECT MIN(completion_time) AS oldest_log_time, MAX(completion_time) AS newest_log_time, ROUND(MAX(completion_time) - MIN(completion_time)) AS actual_retention_days FROM v$archived_log WHERE deleted = 'NO' AND status = 'A'; ``` 步骤3:检查默认策略 如果v$rman_configuration为空,则说明没有显式配置保留策略,那么默认策略是`REDUNDANCY 1`。这意味着: - 每个数据文件至少有一个可用的备份(包括归档日志备份)时,旧的备份才会被标记为可删除。 - 归档日志的保留时间不是固定的天数,而是取决于备份的覆盖情况。 步骤4:检查归档日志删除策略(引用[1]) 虽然v$rman_configuration为空,但可能通过命令配置过归档日志删除策略(如`configure archivelog deletion policy to ...`),我们可以通过以下方式查看: ```sql SELECT value FROM v$rman_configuration WHERE name = 'ARCHIVELOG DELETION POLICY'; ``` 如果这个查询返回空,则说明没有配置归档日志删除策略,那么归档日志的删除将遵循备份保留策略(即默认的`REDUNDANCY 1`)。 步骤5:通过RMAN报告确认 我们可以使用RMAN命令来生成一份报告,查看保留策略: ``` RMAN> REPORT OBSOLETE; ``` 如果没有配置保留策略,这个命令可能不会返回过期的备份(因为默认冗余数为1,所以只要有一个备份,更旧的备份就会被标记为过期)。 步骤6:检查初始化参数 另外,还可以检查一个初始化参数`control_file_record_keep_time`(控制文件中可重复使用的记录所能保存的最少天数),它也会影响归档日志的保留。因为控制文件中记录归档日志的信息,如果这个时间设置得较长,那么即使没有备份,归档日志也不能被覆盖。 ```sql SELECT value FROM v$parameter WHERE name = 'control_file_record_keep_time'; ``` 这个参数的默认值是7天(单位是天)。也就是说,控制文件中的归档记录至少保留7天,因此即使没有备份,7天内的归档日志也不能被覆盖。 总结: 当v$rman_configuration为空时,归档日志的保留策略为默认的`REDUNDANCY 1`,但实际保留时间还受以下因素影响: 1. 控制文件记录保留时间(`control_file_record_keep_time`参数,默认7天) 2. 备份情况:如果归档日志已经被备份(且满足冗余数1),那么旧的归档日志可能被删除;如果没有备份,则可能一直保留直到控制文件记录被覆盖(至少7天)或磁盘空间不足。 因此,在没有配置保留策略的情况下,实际保留天数通常是由`control_file_record_keep_time`参数和备份操作共同决定的。我们可以通过以下方式确定: - 查询`control_file_record_keep_time`的值,得到最少保留天数(保证控制文件中有记录)。 - 通过实际归档日志的时间跨度(步骤2的查询)来验证。 注意:如果从未进行过备份,那么归档日志会一直保留直到控制文件记录被覆盖(即超过`control_file_record_keep_time`设置的天数)或者归档目的地空间不足而被删除。 示例查询: ```sql -- 查询控制文件记录保留时间 SELECT value AS control_file_retention_days FROM v$parameter WHERE name = 'control_file_record_keep_time'; -- 查询实际保留的归档日志时间范围 SELECT MIN(completion_time) AS oldest_log_time, MAX(completion_time) AS newest_log_time, ROUND(MAX(completion_time) - MIN(completion_time)) AS actual_retention_days FROM v$archived_log WHERE deleted = 'NO' AND status = 'A'; ``` 通过这两个查询,我们可以得到: 1. 控制文件要求的最少保留天数(例如7天) 2. 当前数据库中实际存在的归档日志的时间跨度(实际保留天数) 如果实际保留天数大于控制文件记录保留时间,可能是因为还没有备份,或者空间充足没有自动删除。 结论:在没有配置RMAN保留策略的情况下,归档日志至少保留`control_file_record_keep_time`参数指定的天数(默认7天),但实际保留天数可能更长(取决于备份和空间情况)。 注意:如果数据库使用了快速恢复区(FRA),那么FRA的空间压力也会导致归档日志被删除,即使未达到控制文件记录保留时间。 因此,要全面了解归档保留,还需检查FRA的使用情况: ```sql SELECT * FROM v$recovery_area_usage; ``` 通过以上方法,我们可以综合判断归档日志的保留情况。</think>### 当 `v$rman_configuration` 为空时的归档保留策略查询方法 当 `v$rman_configuration` 视图为空(表示未显式配置 RMAN 策略)时,可通过以下方法确定归档日志保留策略和天数: #### 1. **检查默认保留策略** Oracle 默认使用 **`REDUNDANCY 1`** 策略(引用[2]): ```sql SELECT 'DEFAULT POLICY: REDUNDANCY 1' AS retention_info FROM dual; ``` **说明**: - 归档日志至少保留到被 **至少1次备份覆盖** - 实际保留天数取决于 **备份频率**(如每周备份则保留约7天) - 未备份的归档日志会永久保留在磁盘上(引用[1]) #### 2. **通过控制文件记录时间确认** ```sql -- 查看控制文件记录的最短保留时间(单位:天) SELECT value AS control_file_retention_days FROM v$parameter WHERE name = 'control_file_record_keep_time'; ``` **结果解读**: - 默认值通常为 **7天**(Oracle 标准配置) - 表示归档日志元数据在控制文件中至少保留该天数(引用[2]) #### 3. **验证实际归档保留时间** ```sql SELECT MIN(first_time) AS oldest_log_time, MAX(next_time) AS newest_log_time, ROUND(MAX(next_time) - MIN(first_time)) AS actual_retention_days FROM v$archived_log WHERE deleted = 'NO'; ``` 此查询直接显示**磁盘上现存归档日志的时间跨度**(最可靠的实际保留天数) #### 4. **检查备份元数据** ```sql -- 查看最近备份的时间范围 SELECT MIN(completion_time) AS oldest_backup_time, MAX(completion_time) AS newest_backup_time FROM v$backup_archivelog_details; ``` **关联分析**: - 若 `oldest_backup_time > oldest_log_time`,说明存在未备份的归档 - 实际保留天数 = `MAX(实际日志时间跨度, 控制文件保留天数)` #### 5. **快速恢复区(FRA)空间策略** ```sql SELECT * FROM v$recovery_area_usage; ``` **关键指标**: - `PERCENT_SPACE_RECLAIMABLE` > 0 表示有可清理的归档 - 空间压力会导致早于 `control_file_record_keep_time` 的归档被优先删除 ### 保留策略总结表 | 判断依据 | 默认值 | 实际影响 | |-------------------------|--------------|--------------------------------------------------------------------------| | `REDUNDANCY` 策略 | 1 (未配置时) | 归档保留到被至少1次备份覆盖 | | `control_file_record_keep_time` | 7天 | 归档元数据的最短保留时间(引用[2]) | | FRA空间使用率 | 90%阈值 | 空间不足时自动删除最早归档 | | 备份状态 | - | **未备份的归档永久保留**(引用[1]) | > **关键结论**:当未配置 RMAN 策略时,归档日志至少保留 `control_file_record_keep_time` 参数定义的天数(通常7天),但未备份的归档会永久保留,实际保留天数需通过 `v$archived_log` 查询验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值