Oracle归档日志清理
背景
连接数据库时,提示:ORA-00257:archiver error.Connect internal only, until freed
。表示归档日志满了。
处理方法
连接数据库
sqlplus / as sysdba --连接 sql> select name from v$database; --查询当前实例,如果不是自己的实例,查看环境变量
查询是否开启归档模式
sql> archive log list; --查看是否开启归档模式
查询闪回区和归档区使用情况
--查询闪回区 select * from v$recovery_file_dest; --查看归档日志大小及使用情况 select * from v$flash_recovery_area_usage; --查看闪回区空间占用率,如果 ARCHIVED LOG 超过90%,Oracle随时有宕机的危险 --查询归档区 select * from v$archived_log; --查看v$archive_log SELECT SUM(BLOCKS*BLOCK_SIZE)/1024/1024 AS "ARCHIVE LOG SIZE (MB)" FROM V$ARCHIVED_LOG; --查看归档日志的总大小
查询结果:该电脑闪回区和归档区存储路径不同,所以分开判断:
闪回区使用为0,不用管。
归档区使用4G,可能是归档区满了,目前不知道归档区的限制大小是多少。
清除归档日志(作用:可让闪回区、归档区的日志都得以释放)
rman target sys/密码@数据库实例名称 RMAN> crosscheck archivelog all; --检查所有日志 RMAN> delete noprompt expired archivelog all; --删除过期日志 RMAN> delete noprompt ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; --删除7天前的归档日志
若闪回区满了,还有另一种方式,增大闪回区空间:
SQL>alter system set DB_RECOVERY_FILE_DEST_SIZE=8G;
尝试连接,如果还连不上,就重启数据库实例
sql> shutdown immediate; --如果长时间没反应,因为有大事务要回滚,导致数据库一直在等待回滚执行完成,ctrl+c取消 sql> alter system checkpoint; --设置检查点。一般在shutdown前,为了防止类似情况发生而丢失数据 sql> shutdown abort; --强制关闭数据库 sql> startup; --启动数据库 恢复正常
设置自动清除归档定时任务
创建shell脚本
[root@orcldb4 arch_clean_log]$ su - oracle [oracle@orcldb4 arch_clean_log]$ mkdir /home/oracle/arch_clean_log [oracle@orcldb4 arch_clean_log]$ cd /home/oracle/arch_clean_log [oracle@orcldb4 arch_clean_log]$ vi clean_arch.sh
#! /bin/bash source ~/.bash_profile exec >> /home/oracle/arch_clean_log/del_arch`date +%F-%H`.log $ORACLE_HOME/bin/rman target / <<EOF crosscheck archivelog all; delete noprompt expired archivelog all; delete noprompt archivelog until time 'sysdate-7'; exit; EOF
删除过期日志和7天前归档日志
[oracle@orcldb4 ORACLE]$ chmod +x clean_arch.sh
设置定时任务
进入root用户 vi /etc/crontab #编辑系统任务计划 0 2 * * * oracle /home/oracle/arch_clean_log/clean_arch.sh #每天凌晨2点执行
重启定时服务
[root@db ~]# systemctl restart crond.service 或者 [root@db ~]# service crond restart
其余记录
1.关闭/打开归档日志
1.1关闭归档日志
1 sql> archive log list; #查看是否关闭归档模式
2 sql> alter system set log_archive_start=false scope=spfile; #禁用自动归档
3 sql> shutdown immediate; #立即关闭数据库
4 sql> startup mount; #启动实例并加载数据库,但不打开
5 sql> alter database noarchivelog; #将数据库切换为非归档模式
6 sql> alter database open; #打开数据库
7 sql> archive log list; #查看此时便处于非归档模式
1.2开启归档日志
1 sql> archive log list; #查看是否开启归档模式
2 sql> alter system set log_archive_start=true scope=spfile; #启用主动归档(可设置归档路径,自行学习)
3 sql> shutdown immediate; #立即关闭数据库
4 sql> startup mount; #启动实例并加载数据库,但不打开
5 sql> alter database archivelog; #将数据库切换为归档模式
6 sql> alter database open; #打开数据库
7 sql> archive log list; #查看此时是否处于归档模式
8 查询以确定数据库位于archivelog模式中且归档过程正在运行
sql> select log_mode from v$database;
sql> select archiver from v$instance;