解决Oracle RMAN删除归档日志不释放问题的方法
前言
当Oracle 归档日志满了后,将无法正常登入oracle,需要删除一部分归档日志才能正常登入ORACLE。
最近同事在工作中遇到一个问题,他那边的一套Oracle 11g数据库使用RMAN没办法删除旧的归档,导致磁盘使用率很高。
oracle@ps251n2s:[/opt/oracle/archive/db] ls -ltr |more total 3059881082 -rw-r----- 1 oracle oinstall 725320704 May 20 2016 1_1_91233774.dbf -rw-rw---- 1 oracle oinstall 1756937216 Jun 7 2016 1_2_91233774.dbf -rw-rw---- 1 oracle oinstall 1756731392 Jun 21 2016 1_3_91233774.dbf -rw-rw---- 1 oracle oinstall 1758001152 Jul 3 2016 1_4_91233774.dbf -rw-rw---- 1 oracle oinstall 1756729344 Jul 15 2016 1_5_91233774.dbf -rw-rw---- 1 oracle oinstall 1765750784 Jul 26 22:00 1_6_91233774.dbf -rw-rw---- 1 oracle oinstall 1760346112 Aug 6 14:04 1_7_91233774.dbf ......
使用RMAN list archivelog all;查看日志也没有显示旧归档日志的记录
RMAN list archivelog all; using target database control file instead of recovery catalog List of Archived Log Copies for database with db_unique_name DBS ===================================================================== Key Thrd Seq S Low Time ------- ---- ------- - --------- 1206 1 1206 A 14-JAN-17 Name: /opt/oracle/archive/db/1_1206_91233774.dbf 1207 1 1207 A 14-JAN-17 Name: /opt/oracle/archive/db/1_1207_91233774.dbf 1208 1 1208 A 14-JAN-17 Name: /opt/oracle/archive/db/1_1208_91233774.dbf ......
使用crosscheck检查也没有查到旧归档日志记录
RMAN crosscheck archivelog all; using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=16 device type=DISK validation succeeded for archived log archived log file name=/opt/oracle/archive/db/1_1206_91233774.dbf RECID=1206 STAMP=933244655 validation succeeded for archived log archived log file name=/opt/oracle/archive/db/1_1207_91233774.dbf RECID=1207 STAMP=933249510 validation succeeded for archived log archived log file name=/opt/oracle/archive/db/1_1208_91233774.dbf RECID=1208 STAMP=933254500 validation succeeded for archived log archived log file name=/opt/oracle/archive/db/1_1209_91233774.dbf RECID=1209 STAMP=933259445 validation succeeded for archived log
查看v$archived_log视图也没有旧归档日志记录
解决过程
于是在网上找到一篇文章,大体意思是MAN删除归档日志的依据是controlfile中记录的归档日志,而不是你磁盘上实际存在的归档日志,如果你的归档日志已经不在controlfile中就无法被RMAN识别到,也就无法被删除。而致于归档信息何时在控制文件中被覆盖,这由一个参数control_file_record_keep_time来控制。
查看数据库中的参数是默认的7天
SYS@db show parameter CONTROL_FILE_RECORD_KEEP_TIME NAME TYPE VALUE ------------------------------------ -------------------------------- ------------------------------ control_file_record_keep_time integer 7
难道是在控制文件中归档日志的记录条数只能保留7天的么?于是到MOS去找相关文档找到一篇Why Are Controlfile Entries For Archived Logs Not Overwritten After CONTROL_FILE_RECORD_KEEP_TIME (文档 ID 1056085.1),文档介绍CONTROL_FILE_RECORD_KEEP_TIME参数并不是强制在控制文件中保留多少天的归档日志条目,而是由V$CONTROLFILE_RECORD_SECTION视图中的ARCHIVED LOG条目去控制的,当RECORDS_TOTAL=RECORDS_USED时旧的归档日志就会被覆盖掉。
于是查数据库中的V$CONTROLFILE_RECORD_SECTION视图,看到ARCHIVED LOG行的records_total=224意味着控制文件中只能保留224条归档日志文件信息。
SYS@dbs select * from v$controlfile_record_section where type="ARCHIVED LOG"; TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX LAST_INDEX LAST_RECID ---------------------------- ----------- ------------- ------------ ----------- ---------- ---------- ARCHIVED LOG 584 224 224 88 87 1235
查询v$archived_log视图,总数为224条
SYS@dbs select count(*) from v$archived_log; COUNT(*) ---------- 224
这时应该可以推断出由于控制文件中只能保留224条归档日志数据,所以以前的归档信息已经被控制文件刷出,RMAN无法识别到这些归档文件,所以就无法删除这些归档日志。
那么现在如果使用RMAN删除这些旧的归档日志呢?我想到使用catalog start with 命令重新注册这些文件到控制文件中
RMAN catalog start with "/opt/oracle/archive/db"; ...... File Name: /opt/oracle/archive/db/1_1005_91233774.dbf File Name: /opt/oracle/archive/db/1_1006_91233774.dbf File Name: /opt/oracle/archive/db/1_1007_91233774.dbf Do you really want to catalog the above files (enter YES or NO) yes cataloging files... cataloging done ...... RMAN list archivelog all; ..... 1236 1 301 A 22-OCT-16 Name: /opt/oracle/archive/db/1_301_91233774.dbf 1237 1 302 A 22-OCT-16 Name: /opt/oracle/archive/db/1_302_91233774.dbf ......
旧的归档日志文件已经注册到控制文件中了,再使用RMAN进行删除就可以了
delete archivelog until logseq 1007;
再次查询v$controlfile_record_section视图,records_total也被“撑”大了
SYS@db select * from v$controlfile_record_section where type="ARCHIVED LOG"; TYPE RECORD_SIZE RECORDS_TOTAL RECORDS_USED FIRST_INDEX LAST_INDEX LAST_RECID ---------------------------- ----------- ------------- ------------ ----------- ---------- ---------- ARCHIVED LOG 584 896 742 807 652 1800
至此问题结束。
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 解决Oracle RMAN删除归档日志不释放问题的方法
相关文章
- Oracle CRS 重启指南(oracle重启crs)
- Oracle 执行最佳实践:节省时间、加快响应(oracle执行方法)
- Oracle写入日志中的一段经历(oracle写日志)
- 提升数据效率:Oracle高级数据库应用.(高级数据库oracle)
- 解决Oracle数据库闪回查询的简单方法(oracle闪回查询)
- Oracle中定义集合的简易方法(oracle定义集合)
- 如何使用Oracle授权控制访问(oracle授权方式)
- 使用Oracle数据库建立时间戳表(oracle建表时间戳)
- 创建Oracle 带参数游标的创建方法(oracle带参数游标)
- 深入探讨Oracle数据库中的时间维度创建和管理方法(oracle时间维度)
- 如何在Oracle中查找库?(oracle查找库)
- 掌握Oracle内存使用情况介绍查看命令(oracle内存查看命令)
- Oracle 联合判空的建模方法(oracle 关联 判空)
- 深入了解h3c如何和Oracle配合高效使用(h3c怎么用oracle)
- Oracle数据库中保存URL的方法(oracle保存url)
- 最佳Oracle SGA优化实践研究(oracle 优化sga)
- Oracle中使用左外连接实现信息查询(oracle中左外连接)
- Oracle中快速导出表数据的方法(oracle中导出表数据)
- Oracle中使用正则表达式匹配字符串的方法(oracle中匹配字符串)
- 方法如何在Oracle中判断空值(oracle中判断是空的)
- Oracle POS 全能的零售管理解决方案(oracle中pos)
- table方法利用Oracle中的dicttable方法进行表结构管理(oracle中dict)
- 探索Oracle与甲骨文的完美结合(oracle与甲骨文)
- Oracle SP报告助力业务发展(oracle sp 报告)
- Oracle CPU核数优化提升实践(oracle cpu核数)