最近一年,手头上负责的项目要部署到不少个地方,因为项目组里没有人对oracle比较熟悉,只能给本身增长一个DBA的角色了。因为短期内要部署不少单位,备份策略没有设置好,结果过了一个月,用户报告程序开始连不上数据库了,而且发给我错误报告。主要是ora-1603八、 ora-1980九、 ora-00312三个错误,意思很明确,就是归档日志写满了,无法继续写入归档日志了,致使数据库被暂停了,等待继续写入归档日志到硬盘。sql
因为用户业务比较紧张,先考虑紧急处理方案,先将数据库恢复正常,而后再给用户数据库设计合理的备份方案,使数据库之后再也不出现相似错误了。数据库
(为保护用户信息,使用密码,链接 指示符使用manager和orcl代替用户实际数据)安全
rman target sys/manager@orcl
crosscheck backup;
crosscheck archivelog all;
crosscheck copy;
delete expired backup;
delete expired archivelog all;
delete expired copy;
delete obsolete;
若是使用了快速恢复区,检查db_recovery_file_dest和db_recovery_file_dest_size,若是目录所在位置还有空间,只需增大db_recovery_file_dest_size就可使数据库恢复正常。markdown
若是没有使用快速恢复区,检查 show parameter
log_archive_dest,根据目录位置,看可不能够增大归档的目录的大小,好比删除目录所在分区的其余文件。若是能够清理出空间,数据库应该就能够恢复正常了oracle
若是不想使用上面的方法,想要删除之前的归档日志来释放空间,为安全起见,首先将要删除的归档日志复制到其余地方,而后使用rman删除刚刚备份的日志。数据库设计
若是归档日志保存在文件系统上,则根据上面获取的归档日志目录的位置,将准备删除的归档日志拷贝到指定位置,若是归档日志存储在asm里,就稍微麻烦一点,须要在asmcmd里使用cp命令将归档日志备份。spa
rman target sys/manager@orcl
--查看归档日志文件信息
list archivelog all;
--而后使用如下方法中的任意一种删除刚刚已经备份过的归档日志文件。
--删除从序列号为xxx开始的全部归档日志文件
delete archivelog from sequence xxx;
--或者,删除序列号在xxx和yyy之间的全部归档日志文件
delete archivelog sequence between xxx and yyy;
--或者删除序列号一直到xxx的全部归档日志文件
delete archivelog until sequence xxx --或者使用时间来指定要删除的归档日志文件 --删除从datestring指定的时间开始的全部归档日志 delete archivelog from time 'datestring' --或者,删除时间在datestring1和datestring2之间的全部归档日志文件 delete archivelog time between 'datestring1' and 'datestring2' --或者删除时间一直到datestring的全部归档日志文件 delete archivelog until time 'datestring'
删除归档日志文件后,立刻对数据库作全备份。而后就可使用如下代码清理归档日志文件了。设计
rman target sys/manager@orcl
crosscheck backup;
crosscheck archivelog all;
crosscheck copy;
delete expired backup;
delete expired archivelog all;
delete expired copy;
delete obsolete;
整体来讲,这个错误是由数据库空间规划和备份策略没有提早设计好致使,作完应急处理后应该尽快从新对数据库空间和备份策略从新进行设计,以防再次出现以上问题,影响用户使用。日志
ps
若是在数据库hold的时候使用了强制关闭数据库时,可能在开机时会遇到其它的问题,此时须要先清理待归档的日志文件,方法为code
sqlplus sys/manager@orcl as sysdba
startup mount;
--获取inactive且没有归档的组
select group#,sequence#,archived,status from v$log;
--清理上一步获取的归档日志组
alter database clear unarchived logfile group x;
alter database open;