当前位置 博文首页 > LuciferLiu_DBA:【Oracle数据库】RMAN备份恢复脚本分享,附SQL

    LuciferLiu_DBA:【Oracle数据库】RMAN备份恢复脚本分享,附SQL

    作者:[db:作者] 时间:2021-08-06 16:03

    作者简介

    • 作者:LuciferLiu,中国DBA联盟(ACDU)成员。
    • 目前主要从事Oracle DBA工作,曾从事 Oracle 数据库开发工作,主要服务于生产制造,汽车金融等行业。
    • 现拥有Oracle OCP,OceanBase OBCA认证,擅长Oracle数据库运维开发,备份恢复,安装迁移,Linux自动化运维脚本编写等。

    前言

    • 使用rman进行备份恢复时,通过客户端执行记录无法直观看出进度如何,可以通过SQL进行查询。

    一、RMAN备份

    • 以下命令,直接复制执行即可。

    1 配置备份路径和计划任务

    • 备份路径设置
    SCRIPTSDIR=/home/oracle/scripts
    BACKUPDIR=/backup
    mkdir -p $BACKUPDIR $SCRIPTSDIR
    
    • 写入计划任务
    cat <<EOF>>/var/spool/cron/oracle
    30 00 * * 0 ${SCRIPTSDIR}/dblevel0_backup.sh
    30 00 * * 1-6 ${SCRIPTSDIR}/dbleve1_backup.sh
    EOF
    

    2 全备脚本

    {
    	echo '#!/bin/sh'
    	echo 'source ~/.bash_profile'
    	echo 'backtime=`date +"20%y%m%d%H%M%S"`'
    	echo "rman target / log=${BACKUPDIR}/full_backup_\${backtime}.log<<EOF"
    	echo 'run {'
    	echo 'allocate channel c1 device type disk;'
    	echo 'allocate channel c2 device type disk;'
    	echo 'crosscheck backup;'
    	echo 'crosscheck archivelog all; '
    	echo 'sql"alter system switch logfile";'
    	echo 'delete noprompt expired backup;'
    	echo 'delete noprompt obsolete device type disk;'
    	echo "backup database include current controlfile format '${BACKUPDIR}/backfull_%d_%T_%t_%s_%p';"
    	echo 'backup archivelog all DELETE INPUT format '${BACKUPDIR}/archivelog_%d_%T_%t_%s_%p';'
    	echo 'release channel c1;'
    	echo 'release channel c2;'
    	echo '}'
    	echo 'EOF'
    } >>${SCRIPTSDIR}/dbbackup_full.sh
    

    注意:全备脚本和增量0级备份等同。

    3 增量备份脚本

    • 每周日00:30 做0级增量备份脚本
    {
    	echo '#!/bin/sh'
    	echo 'source ~/.bash_profile'
    	echo 'backtime=`date +"20%y%m%d%H%M%S"`'
    	echo "rman target / log=${BACKUPDIR}/level0_backup_\${backtime}.log<<EOF"
    	echo 'run {'
    	echo 'allocate channel c1 device type disk;'
    	echo 'allocate channel c2 device type disk;'
    	echo 'crosscheck backup;'
    	echo 'crosscheck archivelog all; '
    	echo 'sql"alter system switch logfile";'
    	echo 'delete noprompt expired backup;'
    	echo 'delete noprompt obsolete device type disk;'
    	echo "backup incremental level 0 database include current controlfile format '${BACKUPDIR}/backlv0_%d_%T_%t_%s_%p';"
    	echo 'backup archivelog all DELETE INPUT format '${BACKUPDIR}/archivelog_%d_%T_%t_%s_%p';'
    	echo 'release channel c1;'
    	echo 'release channel c2;'
    	echo '}'
    	echo 'EOF'
    } >>${SCRIPTSDIR}/dbbackup_lv0.sh
    
    • 每周一至周六00:30 做1级增量备份脚本
    {
    	echo '#!/bin/sh'
    	echo 'source ~/.bash_profile'
    	echo 'backtime=`date +"20%y%m%d%H%M%S"`'
    	echo "rman target / log=${BACKUPDIR}/level1_backup_\${backtime}.log<<EOF"
    	echo 'run {'
    	echo 'allocate channel c1 device type disk;'
    	echo 'allocate channel c2 device type disk;'
    	echo 'crosscheck backup;'
    	echo 'crosscheck archivelog all; '
    	echo 'sql"alter system switch logfile";'
    	echo 'delete noprompt expired backup;'
    	echo 'delete noprompt obsolete device type disk;'
    	echo "backup incremental level 1 database include current controlfile format '${BACKUPDIR}/backlv1_%d_%T_%t_%s_%p';"
    	echo 'backup archivelog all DELETE INPUT format '${BACKUPDIR}/archivelog_%d_%T_%t_%s_%p';'
    	echo 'release channel c1;'
    	echo 'release channel c2;'
    	echo '}'
    	echo 'EOF'
    } >>${SCRIPTSDIR}/dbbackup_lv1.sh
    

    4 查看rman备份进度sql

        SELECT sid,
               serial#,
               CONTEXT,
               sofar,
               totalwork,
               round(sofar / totalwork * 100,
                     2) "%_COMPLETE"
          FROM gv$session_longops
         WHERE opname LIKE 'RMAN%'
           AND opname NOT LIKE '%aggregate%'
           AND totalwork != 0
           AND sofar <> totalwork;
    

    二、RMAN恢复

    1 恢复脚本

    • 数据库开启到nomount
    sqlplus / as sysdba
    startup nomount
    
    • rman恢复控制文件,开启数据库到mount
    rman target /
    restore controlfile from '/backup/control.bak';
    alter database mount;
    
    • rman 恢复数据库
    rman target /
    restore database;
    recover database;
    
    • 打开数据库到resetlogs
    alter database open resetlogs;
    

    2 查看rman恢复进度sql

    SELECT sid,
           serial#,
           CONTEXT,
           sofar,
           totalwork,
           round(sofar / totalwork * 100,
                 2) "% Complete"
      FROM v$session_longops
     WHERE opname LIKE 'RMAN:%'
       AND opname NOT LIKE 'RMAN: aggregate%';
    

    本次分享到此结束啦~

    如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

    ?
    技术交流可以 关注公众号:Lucifer三思而后行
    Lucifer三思而后行

    ?

    cs