阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle RMAN 自动恢复

191次阅读
没有评论

共计 5175 个字符,预计需要花费 13 分钟才能阅读完成。

在日常工作中, 有时会需要进行 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

 

 

 

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 hh24: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 users

 

2. recover 命令中使用 FROM 选项

RECOVER AUTOMATIC TABLESPACE users FROM “/tmp”

 

–End.–

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-09/146693.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5175字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中