温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Oracle RMAN 自动恢复

发布时间:2020-02-28 06:10:39 来源:网络 阅读:417 作者:MrChase 栏目:关系型数据库


在日常工作中,有时会需要进行Oracle数据库恢复,比如搭建测试环境、查找历史数据、恢复测试等.

可以通过计划任务或nohup等方式来执行恢复脚本从而提高整个操作的效率,特此记录.

这里使用的测试环境如下:

OS PlatformRed Hat Enterprise Linux Server release 5.4 (Tikanga)- 64bit
DatabaseOracle Database 11g Enterprise Edition Release 11.2.0.1.0- 64bit


1. 在需要恢复数据库的机子(本文中为testsvr01)上安装Oracle软件

2. Oracle数据库的RMAN备份文件及相应的归档日志传输到目标机子(testsvr01),

  并确保oracle用户有权限访问,可以通过 chown-R oracle:oinstall /backup_dir命令

  改变备份文件的属主

3. $ORACLE_HOME/dbs目录下编辑参数文件pfile以便于启动Oracle实例, 本文的pfileinitmydb.ora

  可以在源库中通过create pfile 命令来创建pfile, 然后传到目标机子,修改相应的参数值

pfile, 注意以下几个参数的值

*.control_files='/data1/oradata/mydb/control01.ctl','/data1/oradata/mydb/control02.ctl','/data1/oradata/mydb/control03.ctl' *.log_archive_dest_1='LOCATION=/data3/rman_bak/mydb/Arc' *.log_archive_format='ARC%s_%t_%r.dbf' *.db_name='mydb' *.undo_tablespace='UNDOTBS1' *.undo_management=auto *.job_queue_processes=0


4. 确保pfile中使用到的目录已经存在, 并且属主为oracle

5. /home/oracle目录下创建auto_recovery.sh脚本, 并赋予可执行权限

auto_recovery.sh 内容示例:

[root@ testsvr01 oracle]# cat auto_recovery.sh #!/bin/bash source /home/oracle/.bash_profile   SHELL_NAME=$(basename $0) if [ $# -ne 1 ]; then   echo -e "\n Usage:  ${SHELL_NAME} ORACLE_SID \n"   exit fi   ORACLE_SID=$1 SCRIPT_PATH=/home/oracle RMAN_SQL=${SCRIPT_PATH}/${ORACLE_SID}_rman.sql RMAN_LOG=${SCRIPT_PATH}/${ORACLE_SID}_rman.log SQLPLUS_SQL=${SCRIPT_PATH}/${ORACLE_SID}_sqlplus.sql SQLPLUS_LOG=${SCRIPT_PATH}/${ORACLE_SID}_sqlplus.log CONTROL_SQL=${SCRIPT_PATH}/${ORACLE_SID}_control.sql   if [ ! -s ${RMAN_SQL} ]; then   echo "${RMAN_SQL}  doesn't exist!"   exit elif [ ! -s ${SQLPLUS_SQL} ]; then   echo "${SQLPLUS_SQL}  doesn't exist!"   exit elif [ ! -s ${CONTROL_SQL} ]; then   echo "${CONTROL_SQL}  doesn't exist!"   exit else   ls -lrth  ${SCRIPT_PATH}/${ORACLE_SID}*.sql fi     su - oracle <<EOF source /home/oracle/.bash_profile export ORACLE_SID=$1 export ORACLE_HOME=/u01/app/oracle/11.2.0/db_1 export PATH=$PATH:$ORACLE_HOME/bin   echo -e "RMAN Part Begin... \n" echo `date +'%Y%m%d %H:%M:%S'` rman target / log='${RMAN_LOG}' cmdfile=${RMAN_SQL} echo `date +'%Y%m%d %H:%M:%S'` echo -e "RMAN Parat End. \n"   echo -e "SQLPLUS Part Begin... \n" echo `date +'%Y%m%d %H:%M:%S'` sqlplus -s / as sysdba @${SQLPLUS_SQL} $ORACLE_SID >  ${SQLPLUS_LOG} echo `date +'%Y%m%d %H:%M:%S'` echo -e "SQLPLUS Part End. \n" EOF


 如果是Windows平台,可以参考以下批处理,auto_recovery.bat:

@echo Oracle Auto Recovery @set ORACLE_SID=mydb @set ORACLE_BASE=C:\app @set ORACLE_HOME=C:\app\product\11.2.0\dbhome_1 @set SCRIPT_PATH=D:\scripts @set RMAN_SQL=%SCRIPT_PATH%\%ORACLE_SID%_rman.sql @set RMAN_LOG=%SCRIPT_PATH%\%ORACLE_SID%_rman.log @set SQLPLUS_SQL=%SCRIPT_PATH%\%ORACLE_SID%_sqlplus.sql @set SQLPLUS_LOG=%SCRIPT_PATH%\%ORACLE_SID%_sqlplus.log @set CONTROL_SQL=%SCRIPT_PATH%\%ORACLE_SID%_control.sql date /t time /t @echo Creating Oracle Service... oradim -new -sid %ORACLE_SID% -srvc OracleService%ORACLE_SID% -syspwd oracle -startmode manual -srvcstart demand -pfile %ORACLE_HOME%/database/init%ORACLE_SID%.ora @REM echo Starting Oracle service... @REM oradim -startup -sid %ORACLE_SID% -starttype srvc -pfile %ORACLE_HOME%/database/init%ORACLE_SID%.ora %ORACLE_HOME%\Bin\rman target / log='%RMAN_LOG%' cmdfile=%RMAN_SQL% %ORACLE_HOME%\Bin\sqlplus -s / as sysdba @%SQLPLUS_SQL% %ORACLE_SID% >  %SQLPLUS_LOG% date /t time /t exit


6. /home/oracle目录下编辑RMAN脚本${ORACLE_SID}_rman.sql,本文为mydb_rman.sql

mydb_rman.sql内容示例:

run{ startup nomount; restore controlfile from '/data3/rman_bak/mydb/datafile/ MYDB_20170823_46007_1_CONTROL'; alter database mount; crosscheck backup; delete noprompt expired backup; catalog start with '/data3/rman_bak/mydb/' noprompt; allocate channel c1 device type disk; allocate channel c2 device type disk; set newname for datafile 1   to  '/data1/oradata/mydb/datafile/system.dbf'; set newname for datafile 2   to  '/data1/oradata/mydb/datafile/sysaux.dbf'; set newname for datafile 3   to  '/data1/oradata/mydb/datafile/undotbs1.dbf'; set newname for datafile 4   to  '/data1/oradata/mydb/datafile/users.dbf'; restore datafile 1; restore datafile 2; restore datafile 3; restore datafile 4; switch datafile all; release channel c1; release channel c2; shutdown immediate; }


7. /home/oracle目录下编辑${ORACLE_SID}_sqlplus.sql脚本, 本文为mydb_sqlplus.sql

mydb_sqlplus.sql内容示例:

[root@ testsvr01 oracle]# cat mydb_sqlplus.sql startup nomount; @/home/oracle/&1._control.sql set autorecovery on; recover database using backup controlfile until cancel; set autorecovery off; alter database open resetlogs; alter tablespace TEMP add tempfile '/data1/oradata/mydb/datafile/temp01.dbf'  size 1G autoextend off; shutdown immediate; startup; alter session set nls_date_format='yyyy-mm-dd hh34:mi:ss'; select instance_name,status,startup_time from v$instance; select name,open_mode,log_mode,sysdate from v$database; shutdown immediate; exit;


8. /home/oracle目录下编辑用于创建控制文件的脚本${ORACLE_SID}_control.sql,本文为mydb_control.sql

mydb_control.sql内容示例:

[root@testsvr01 oracle]# cat mydb_control.sql CREATE CONTROLFILE REUSE DATABASE "MYDB" RESETLOGS  noARCHIVELOG     MAXLOGFILES 20     MAXLOGMEMBERS 5     MAXDATAFILES 1000     MAXINSTANCES 8     MAXLOGHISTORY 4927 LOGFILE   GROUP 1 (     '/data1/oradata/mydb/onlinelog/REDO1.log'   ) SIZE 400M BLOCKSIZE 512,   GROUP 2 (     '/data1/oradata/mydb/onlinelog/REDO2.log'   ) SIZE 400M BLOCKSIZE 512,   GROUP 3 (     '/data1/oradata/mydb/onlinelog/REDO3.log'   ) SIZE 400M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE '/data1/oradata/mydb/datafile/system.dbf', '/data1/oradata/mydb/datafile/sysaux.dbf', '/data1/oradata/mydb/datafile/users.dbf', '/data1/oradata/mydb/datafile/undotbs1.dbf' CHARACTER SET WE8MSWIN1252 ;


9. 通过crontabnohup在后台执行auto_recovery.sh脚本

nohup /home/oracle/auto_recovery.sh mydb &

 

:

本文只是恢复了部分数据文件, 所以需要重建控制文件, 如果是全库恢复,可以不用重建控制文件,将本文脚本进行适当的修改即可.

 


 

要点梳理

一、在recover, 如何自动应用归档日志

Oracle RMAN 自动恢复

根据Oracle官方文档的介绍, 使用sqlplus实现自动recover有两种方法:

1. 使用set autorecovery on命令, 即本文中使用的方法

2. recover命令中使用automatic选项

STARTUP MOUNT

RECOVER AUTOMATIC DATABASE

ALTER DATABASE OPEN

 

二、归档日志的路径

一般来讲, recover时所需要应用的归档日志默认存在于LOG_ARCHIVE_DEST_nLOG_ARCHIVE_FORMAT这两个初始化参数所定义的路径及文件名.如果相应的归档日志存在,Oracle可以自动应用它们.

如果目标库与源库中的路径不一样, 可以通过以下方法来修改LOG_ARCHIVE_DEST_nLOG_ARCHIVE_FORMAT这两个参数的值

1. 修改pfile中对应参数的值

2. 使用alter system 命令修改

alter system set LOG_ARCHIVE_DEST_1 = 'LOCATION =  /oracle/oradata/trgt/arch/';

alter system set LOG_ARCHIVE_FORMAT =’ arcr_%t_%s.arc

 

如果不想修改以上两个参数的值, 也可以通过以下方法来指定recover所需要用到的归档日志的路径

1. 设定LOGSOURCE参数

set logsource ‘/tmp’

RECOVER AUTOMATIC TABLESPACE user

 

2. recover命令中使用FROM选项

RECOVER AUTOMATIC TABLESPACE users FROM "/tmp

 

--End.--

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI