在日常工作中,有时会需要进行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
如果是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. 通过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 user |
2. 在recover命令中使用FROM选项
RECOVER AUTOMATIC TABLESPACE users FROM "/tmp |
--End.--
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。