zoukankan      html  css  js  c++  java
  • Linux shell 脚本清除归档日志

      有些时候,数据库处于同步数据的状态,archive归档日志不停的增长会导致磁盘空间被大量耗用,以至于归档空间占满,而是导致数据库实例挂起。对于这种情形,可以使用一个shell脚本来定时自动清除这些归档日志,使数据库能正常运行。

    1.清除归档日志shell脚本

    #!/bin/bash


    #定义运行环境

    . ~/.bash_profile

    ARCH_MAX_VALUE=75
    DEL_lOGS_INST=49
    KEEP_ARCH_DAYS=5
    ARCH_USED=0

    echo "================"
    echo "================"

    echo `date +%Y%m%d%t%T`
    echo ""


    #获取当前归档使用率
    function getArchUsage() {
    ARCH_USED=`
    sqlplus -S /nolog << EOF
    connect / as sysdba
    set echo off feedback off heading off underline off
    select PERCENT_SPACE_USED from v\$flash_recovery_area_usage where FILE_TYPE='ARCHIVED LOG';
    exit;
    EOF`
    }

    #删除N天前的归档
    function delArchLogDaysAgo() {
    rman target / nocatalog log /dev/null <<EOF
    crosscheck archivelog all;
    delete noprompt force archivelog until time 'sysdate-$KEEP_ARCH_DAYS';
    exit
    EOF
    }

    function getArchLogSeq() {
    sqlplus -s /nolog <<EOF
    connect /as sysdba
    spool /tmp/applied.log
    set pagesize 0
    set head off
    set feedback off
    set linesize 120
    select thread#||':'||min(sequence#+$DEL_lOGS_INST) from v$archived_log where status='A' and first_time<sysdate-1/3 group by thread#;
    spool off
    EOF
    }

    function CompareArchMaxValue() {
    getArchUsage

    #比较归档使用率与阈值
    #AIX系统推荐使用if判断,Linux系统推荐使用awk辅助判断
    ARCH=`awk -v num1="$ARCH_USED" -v num2="$ARCH_MAX_VALUE" 'BEGIN{print(num1>num2)?"0":"1"}'`
    if [ $ARCH -eq 0 ];then
    echo -e " "`date +%Y%m%d%t%T` Event_Message: flash_recovery_area_usage is $ARCH_USED% larger than $ARCH_MAX_VALUE%.Waiting to delete archive log ...

    getArchLogSeq

    DelArchLogs

    #如果归档使用率小于阈值,输出当前归档使用率,结束该脚本
    else
    echo -e " "`date +%Y%m%d%t%T` Event_Message: flash_recovery_area_usage is $ARCH_USED% lower than $ARCH_MAX_VALUE%.
    fi

    }

    #删除归档到指定sequence
    function DelArchLogs() {
    while read line
    do
    thread=`echo $line |awk -F ":" '{print $1}'`
    sequence=`echo $line |awk -F ":" '{print $2}'`
    echo "thread:$thread sequence:$sequence"
    $ORACLE_HOME/bin/rman target / nocatalog <<EOF
    #crosscheck archivelog all;
    delete noprompt force archivelog until sequence $sequence thread $thread;
    EOF
    echo -e " "`date +%Y%m%d%t%T` Event_Message:Have deleted `echo $DEL_lOGS_INST+1|bc` archive logs.
    done < /tmp/applied.log

    CompareArchMaxValue
    }


    ############################
    #Main()
    ############################
    delArchLogDaysAgo
    CompareArchMaxValue

    2. 脚本说明
    2.1) 数据库的ORACLE_HOME,ORACLE_BASE,ORACLE_SID变量不妨在.bash_profile中设定;
    2.2) 该脚本先执行一次归档删除,仅保留N天的归档日志;
    2.3) 然后,检查flash_recovery_area_usage_dest的空间使用率,与设定的阈值(ARCH_MAX_VALUE)进行对比;
    2.4) 如果,归档使用率小于阈值,则打印当前flash_recovery_area_usage_dest使用率,并结束脚本运行;
    2.5) 如果,归档使用率小于阈值,则提取当前实例最旧的归档日志sequence,并加上一个值(DEL_lOGS_INST,该值加1就是每次每实例删除的归档个数),得到一个新的logseq,接下来我们就删除该logseq之前的所有归档日志(包括该logseq号的日志也删除);
    2.6) 删除完一轮后,重新检查flash_recovery_area_usage_dest的空间使用率,继续2.3到2.6的步骤。
    2.7) 根据需要将脚本部署到crontab。

     

  • 相关阅读:
    emberjs 循环中设置model的不同属性值
    FUTURE .get 异常抛出会如何提示
    cpu ,鲲鹏,x86,主频,门电路,目录
    复制两个类的相同属性
    【深入Java虚拟机(1)】:Java内存区域与内存溢出
    RPC web service
    webservice
    django中配置Pymsql
    定义函数和调用函数的方式,函数形参和实参的介绍
    python名称空间与作用域
  • 原文地址:https://www.cnblogs.com/caoyibin/p/15390430.html
Copyright © 2011-2022 走看看