Oracle, RMAN restores database data to the specified time, RMAN does not fully restore the shell script

Oracle, RMAN restores database data to the specified time, RMAN does not fully restore the shell script

RMAN backup configuration, see the shell script: https://blog.csdn.net/weixin_43614067/article/details/109647639

su - oracle
sqlplus / as sysdba

#设置时间格式
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
#查看数据库原型(当前原型为2)
SQL> SELECT INCARNATION#,STATUS,RESETLOGS_TIME FROM V$DATABASE_INCARNATION;

INCARNATION# STATUS  RESETLOGS_TIME
------------ ------- -------------------
           1 PARENT  2009-08-15 00:16:43
           2 CURRENT 2020-10-22 10:13:52
           3 ORPHAN  2020-11-13 09:31:38
           4 ORPHAN  2020-11-16 17:09:12
           5 ORPHAN  2020-11-16 17:11:07
           6 ORPHAN  2020-11-16 17:25:57
           7 ORPHAN  2020-11-16 17:29:44
           8 ORPHAN  2020-11-16 17:34:25
           9 ORPHAN  2020-11-16 17:39:11
          10 ORPHAN  2020-11-16 17:51:56
          11 ORPHAN  2020-11-16 17:54:40

INCARNATION# STATUS  RESETLOGS_TIME
------------ ------- -------------------
          12 ORPHAN  2020-11-16 17:57:59

12 rows selected.
#另起会话窗口
su - oracle 
rman target/
#切换数据库原型至11(需在mount状态)
#强制关闭数据库
#SQL>shutdown abort;
#将数据库以mount方式启动
#SQL>startup mount; 

RMAN> reset database to incarnation 11;

using target database control file instead of recovery catalog
database reset to incarnation 11

#在rman查看当前的数据库原型(当前数据库原型为11)
#orcl为数据库名
RMAN>  list incarnation of  database "orcl";

List of Database Incarnations
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1       1       ORCL     1582243166       PARENT  1          15-AUG-09
2       2       ORCL     1582243166       PARENT  945184     22-OCT-20
3       3       ORCL     1582243166       PARENT  2659636    13-NOV-20
4       4       ORCL     1582243166       PARENT  2858078    16-NOV-20
5       5       ORCL     1582243166       ORPHAN  2858279    16-NOV-20
6       6       ORCL     1582243166       PARENT  2858279    16-NOV-20
7       7       ORCL     1582243166       ORPHAN  2858501    16-NOV-20
10      10      ORCL     1582243166       ORPHAN  2858501    16-NOV-20
8       8       ORCL     1582243166       ORPHAN  2858569    16-NOV-20
11      11      ORCL     1582243166       CURRENT 2858575    16-NOV-20
12      12      ORCL     1582243166       ORPHAN  2858575    16-NOV-20
9       9       ORCL     1582243166       ORPHAN  2878961    16-NOV-20

Restore database data to the specified time

#恢复数据库数据至指定时间
#在第一步中查到数据库原型11的具体日期 11 ORPHAN  2020-11-16 17:54:40
#切换数据库原型至11后 11 CURRENT 2020-11-16 17:54:40;
#注意:下面命令中time='2020-11-16 17:55:00'只能在当前数据库原型时间之后。
#若在当前时间前,会报UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time。
#举个栗子:time='2020-11-16 17:53:00'时间在11号原型时间2020-11-16 17:54:40之前,
#就会报UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time

RMAN>run {
    
    
shutdown abort;
startup mount; 
allocate channel ch1 type disk;
allocate channel ch2 type disk;
sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';
set until time='2020-11-16 17:55:00';
restore database;
recover database;
alter database open resetlogs;
}

rman does not fully restore shell scripts

#!/bin/bash
rmanbakDir=/u01/rmanbak
#日志输出路径
logDir=$rmanbakDir/log
recoverdata(){
    
    
        echo "恢复数据到日期:${1}"
        su - oracle -c "
        rman target / <<EOF
        run{
        shutdown abort;
        startup mount;
        allocate channel ch1 type disk;
        allocate channel ch2 type disk;
        sql 'alter session set nls_date_format=\"yyyy-mm-dd hh24:mi:ss\"';
        set until time='${1}';
        restore database;
        recover database;
        alter database open resetlogs;
        }
        exit;
        EOF"
        opendatabase
}

startRecover(){
    
    
        read -p  "请输入恢复到的日期(如2020-11-16 17:55:00):" inputdate
        if [ -z '$inputdate' ]
        then
                echo "输入日期为空,请重新输入!"
                startRecover
        else
                echo "输入参数为:$inputdate"
                date -d "$inputdate" +%Y-%m-%d\ %H:%M:%S
                if test $? -eq 0
                then
                        echo "输入的日期格式合法!"
                        recoverdata "${inputdate}" | log
                else
                        echo "输入的日期格式不合法,请重新输入!"
                        startRecover
                fi
        fi
}
opendatabase(){
    
    
        if test $? -ne 0
        then
                echo "rman恢复非正常运行,重新打开数据库!"
                su - oracle -c "
                sqlplus  / as sysdba <<EOF
                alter database open;
                exit;
                EOF"
        else 
                echo "rman恢复正常运行,数据库已启动!"
        fi;
}

log(){
    
    
        tee -a $logDir/rmanrecover_$backtime.log
}

isDirectory(){
    
    
        if test -d $1
        then
                echo "日志目录:$1目录已存在!"
                else
                        echo "日志目录:$1目录不存在!,创建目录!"
                        mkdir -p $1
        fi
}

isDirectory $logDir | log
startRecover  | log

Guess you like

Origin blog.csdn.net/weixin_43614067/article/details/109735499