oracle归档日志长什么样?
如果数据库的服务器中出现大量的如上文件,别慌,这就是归档日志,需要备份和删除清理,避免服务器资源爆掉,导致数据库宕机。
如何查找归档日志的存储位置?
用有管理权限的账号登录数据库(我用的是system)。
select destination from v$archive_dest;
执行结果:
比如我这边,归档日志存储的位置就在 /DATA2 这个目录。
归档日志过多,超过上线,该如何处理?
![](https://img-blog.csdnimg.cn/fb1f2efe525f4b348554f5ad25010c79.png)
如何清理?
登录oracle数据库服务器,执行如下命令。
su - oracle
rman target /
一般的都只有一个实例,用如上命令即可,如果数据库中有多个实例,可以选择如下命令:
rman target sysdba/password@orcl
解释下,sysdba 是用户名,password是密码,oracl是实例。
进入rman。
然后执行如下命令,查看归档日志列表。
list archivelog all;
结果如下:
比如我这边,查询到的最早日期为2022-05-18号的,而/DATA2 里的日志则有该日期之前的,则需要手动删除系统上的文件。
查询无效日志。
list expired archivelog all;
删除的方法?
按照截止日期删除,删除yyyyMMdd日期之前的日志,命令如下:
DELETE NOPROMPT ARCHIVELOG UNTIL TIME "TO_DATE('2021-01-01','YYYY-MM-DD')";
删除7天之前的归档日志,命令如下:
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
删除无效的日志,命令如下:
delete expired archivelog all;
按照需要进行日志删除,命令如下:
删除截止到到n号之前的日志。
delete archivelog until sequnce n;
或者
delete archivelog until sequence 9310 thread 1;
如果RMAN无法删除归档日志?
如果rman 无法连接数据库,可以先手工使用rm命令清理日志,然后做crosscheck。
rm -f <归档日志>
rman target /
crosscheck archivelog all;
delete obsolete achivelog all;
delete expired achivelog all;
如果RMAN无法使用,可以考虑如下策略。
#使用SQLPlus先登录本地 sys 账号
sqlplus /nolog
SQL> conn /as sysdba
# 查看日志分配的空间,以及空间占比。
SQL> show parameter db_recovery_file_dest;
SQL> select * from v$flash_recovery_area_usage;
# 如果太小可以重新分配,我这里分配了16G
SQL> alter system set db_recovery_file_dest_size=16g;
# 尝试下数据库状态是否正常,如果报错可以看错误码
SQL> alter database open;
SQL> select * from all_users;
# 看看日志是否正常,不正常的话状态一般都是 NO
SQL> select group#,sequence#,archived,status from v$log;
# 尝试清理并重建日志
SQL> alter database clear logfile group 3;
# 如果是该日志组还没有归档,则需要用
SQL> alter database clear unarchived logfile group 3;
其他问题
如果在执行语句时遇到如下错误:
这时就该考虑语句内容错了,一般都是;的原因,检查下中英文,英文状态下才可以。