1. 程式人生 > >Oracle RMAN 自動恢復

Oracle RMAN 自動恢復

oracle rman recover 歸檔日誌 自動


在日常工作中,有時會需要進行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 內容示例:

[[email protected] 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內容示例:

[[email protected] 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內容示例:

[[email protected] 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官方文檔的介紹, 使用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.--

本文出自 “12435293” 博客,請務必保留此出處http://12445293.blog.51cto.com/12435293/1961901

Oracle RMAN 自動恢復