玩命加载中 . . .

Oracle归档日志清理


Oracle归档日志清理

背景

连接数据库时,提示:ORA-00257:archiver error.Connect internal only, until freed。表示归档日志满了。

处理方法

  1. 连接数据库

    sqlplus / as sysdba --连接
    sql> select name from v$database; --查询当前实例,如果不是自己的实例,查看环境变量
    
  2. 查询是否开启归档模式

    sql> archive log list;   --查看是否开启归档模式
    
  3. 查询闪回区和归档区使用情况

    --查询闪回区
    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,可能是归档区满了,目前不知道归档区的限制大小是多少。

  4. 清除归档日志(作用:可让闪回区、归档区的日志都得以释放)

    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;

  5. 尝试连接,如果还连不上,就重启数据库实例

    sql> shutdown immediate; --如果长时间没反应,因为有大事务要回滚,导致数据库一直在等待回滚执行完成,ctrl+c取消
    sql> alter system checkpoint; --设置检查点。一般在shutdown前,为了防止类似情况发生而丢失数据
    sql> shutdown abort; --强制关闭数据库
    sql> startup; --启动数据库
    恢复正常
    

设置自动清除归档定时任务

  1. 创建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
    
  2. 设置定时任务

    进入root用户
    vi /etc/crontab #编辑系统任务计划
    0 2 * * * oracle /home/oracle/arch_clean_log/clean_arch.sh #每天凌晨2点执行
    
  3. 重启定时服务

    [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;

文章作者: 小苏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小苏 !
评论
  目录