共计 5175 个字符,预计需要花费 13 分钟才能阅读完成。
在日常工作中, 有时会需要进行 Oracle 数据库恢复, 比如搭建测试环境、查找历史数据、恢复测试等。可以通过计划任务或 nohup 等方式来执行恢复脚本从而提高整个操作的效率, 特此记录.
这里使用的测试环境如下:
OS Platform | Red Hat Enterprise Linux Server release 5.4 (Tikanga)- 64bit |
Database | Oracle 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 实例 , 本文的 pfile 为initmydb.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. 通过 crontab 或nohup在后台执行 auto_recovery.sh 脚本
nohup /home/oracle/auto_recovery.sh mydb &
注:
本文只是恢复了部分数据文件 , 所以需要重建控制文件 , 如果是全库恢复 , 可以不用重建控制文件 , 将本文脚本进行适当的修改即可.
要点梳理
一、在 recover 时, 如何自动应用归档日志
根据 Oracle 官方文档的介绍 , 使用 sqlplus 实现自动 recover 有两种方法:
1. 使用 set autorecovery on 命令 , 即本文中使用的方法
2. 在 recover 命令中使用 automatic 选项
STARTUP MOUNT RECOVER AUTOMATIC DATABASE ALTER DATABASE OPEN; |
二、归档日志的路径
一般来讲 , recover 时所需要应用的归档日志默认存在于 LOG_ARCHIVE_DEST_n 及LOG_ARCHIVE_FORMAT这两个初始化参数所定义的路径及文件名 . 如果相应的归档日志存在 ,Oracle 可以自动应用它们.
如果目标库与源库中的路径不一样 , 可以通过以下方法来修改 LOG_ARCHIVE_DEST_n 及LOG_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