您好,登錄后才能下訂單哦!
在日常工作中,有時(shí)會(huì)需要進(jìn)行Oracle數(shù)據(jù)庫(kù)恢復(fù),比如搭建測(cè)試環(huán)境、查找歷史數(shù)據(jù)、恢復(fù)測(cè)試等.
可以通過(guò)計(jì)劃任務(wù)或nohup等方式來(lái)執(zhí)行恢復(fù)腳本從而提高整個(gè)操作的效率,特此記錄.
這里使用的測(cè)試環(huán)境如下:
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. 在需要恢復(fù)數(shù)據(jù)庫(kù)的機(jī)子(本文中為testsvr01)上安裝Oracle軟件
2. 將Oracle數(shù)據(jù)庫(kù)的RMAN備份文件及相應(yīng)的歸檔日志傳輸?shù)侥繕?biāo)機(jī)子(testsvr01),
并確保oracle用戶有權(quán)限訪問(wèn),可以通過(guò) chown-R oracle:oinstall /backup_dir命令
改變備份文件的屬主
3. 在$ORACLE_HOME/dbs目錄下編輯參數(shù)文件pfile以便于啟動(dòng)Oracle實(shí)例, 本文的pfile為initmydb.ora
可以在源庫(kù)中通過(guò)create pfile 命令來(lái)創(chuàng)建pfile, 然后傳到目標(biāo)機(jī)子,修改相應(yīng)的參數(shù)值
在pfile中, 注意以下幾個(gè)參數(shù)的值
*.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中使用到的目錄已經(jīng)存在, 并且屬主為oracle
5. 在/home/oracle目錄下創(chuàng)建auto_recovery.sh腳本, 并賦予可執(zhí)行權(quán)限
auto_recovery.sh 內(nèi)容示例:
[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平臺(tái),可以參考以下批處理,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內(nèi)容示例:
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內(nèi)容示例:
[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目錄下編輯用于創(chuàng)建控制文件的腳本${ORACLE_SID}_control.sql,本文為mydb_control.sql
mydb_control.sql內(nèi)容示例:
[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. 通過(guò)crontab或nohup在后臺(tái)執(zhí)行auto_recovery.sh腳本
nohup /home/oracle/auto_recovery.sh mydb &
注:
本文只是恢復(fù)了部分?jǐn)?shù)據(jù)文件, 所以需要重建控制文件, 如果是全庫(kù)恢復(fù),可以不用重建控制文件,將本文腳本進(jìn)行適當(dāng)?shù)男薷募纯?/span>.
要點(diǎn)梳理
一、在recover時(shí), 如何自動(dòng)應(yīng)用歸檔日志
根據(jù)Oracle官方文檔的介紹, 使用sqlplus實(shí)現(xiàn)自動(dòng)recover有兩種方法:
1. 使用set autorecovery on命令, 即本文中使用的方法
2. 在recover命令中使用automatic選項(xiàng)
STARTUP MOUNT RECOVER AUTOMATIC DATABASE ALTER DATABASE OPEN |
二、歸檔日志的路徑
一般來(lái)講, recover時(shí)所需要應(yīng)用的歸檔日志默認(rèn)存在于LOG_ARCHIVE_DEST_n及LOG_ARCHIVE_FORMAT這兩個(gè)初始化參數(shù)所定義的路徑及文件名.如果相應(yīng)的歸檔日志存在,Oracle可以自動(dòng)應(yīng)用它們.
如果目標(biāo)庫(kù)與源庫(kù)中的路徑不一樣, 可以通過(guò)以下方法來(lái)修改LOG_ARCHIVE_DEST_n及LOG_ARCHIVE_FORMAT這兩個(gè)參數(shù)的值
1. 修改pfile中對(duì)應(yīng)參數(shù)的值
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 |
如果不想修改以上兩個(gè)參數(shù)的值, 也可以通過(guò)以下方法來(lái)指定recover所需要用到的歸檔日志的路徑
1. 設(shè)定LOGSOURCE參數(shù)
set logsource ‘/tmp’ RECOVER AUTOMATIC TABLESPACE user |
2. 在recover命令中使用FROM選項(xiàng)
RECOVER AUTOMATIC TABLESPACE users FROM "/tmp |
--End.--
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。