應用場景:服務器A為正常運行的生產環境,需要在服務器B上部署一套相同環境做測試。
數據庫環境:RHEL6.4 + Oracle 11.2.0.4.7
一、 服務器A備份數據庫
二、 服務器B恢復數據庫
一、 服務器A備份數據庫
1.1 在線備份(數據庫運行在歸檔模式)
``` nohup /bin/bash backup_all.sh & ``` 備份完將所有備份介質傳到服務器B(如果兩台機器是內連網絡,可以考慮結合NFS服務從一開始就備份到服務器B上)。1.2 備份腳本內容
``` #!/bin/bash #ScriptName:backup_all.sh #Usage: backup all files in oracle user environment. #ex: nohup /bin/bash backup_all.sh > backup.log & #Author: Alfred Zhao #Creation: 2015-09-11 #Version: 1.0.0Define variable
basedir=/u01/orabak
date=date +%Y%m%d
Create pfile
sqlplus / as sysdba <<EOF
create pfile='$basedir/pfile$date.ora' from spfile;
EOF
RMAN BACKUP
rman target / log=$basedir/backup_all_$date.log <<EOF
run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup database filesperset 4 format '$basedir/full_%d_%T_%s_%p';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup archivelog all format '$basedir/arch_%d_%T_%s_%p' delete input;
backup current controlfile format '$basedir/ctl_%d_%T_%s_%p';
release channel c1;
release channel c2;
}
EOF
<h1 id="2">2. 服務器B恢復數據庫</h1>
<h2 id="2.1">2.1 服務器B安裝數據庫軟件</h2>
參考[http://www.cnblogs.com/jyzhao/p/3891769.html](http://www.cnblogs.com/jyzhao/p/3891769.html)安裝數據庫軟件及之前的相關配置。
然后創建密碼文件:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle force=y entries=5
<h2 id="2.2">2.2 啟動實例到nomount狀態(指定pfile文件)</h2>
將`$basedir/pfile$date.ora`文件復制到`$ORACLE_HOME/dbs/init$ORACLE_SID.ora`,根據實際服務器B的情況修改。然后啟動實例到nomount狀態(指定pfile文件)。
startup nomount pfile='$ORACLE_HOME/dbs/init$ORACLE_SID.ora'
<h2 id="2.3">2.3 RMAN恢復控制文件,確定備份集有效性</h2>
### 2.3.1 RMAN恢復控制文件,啟動數據庫到mount狀態,確定備份集有效性 ###
backupControlFile=/u01/orabak/backup/ctl_JINGYU_20150911_46_1
rman target / > crosscheck.log <<EOF
restore controlfile from '$backupControlFile';
alter database mount;
crosscheck backupset;
EOF
### 2.3.2 如果備份集無效,刪除無效備份集,手工注冊備份集 ###
一般是兩台主機的備份目錄不一樣,控制文件記錄的備份集路徑找不到對應的備份集,狀態為'EXPIRED',此時應該刪除這些過期的備份集,catalog新的備份集,再次確認備份集有效性。
rman target / > catalog.log <<EOF
catalog backuppiece '/u01/orabak/backup/full_JINGYU_20150911_39_1';
catalog backuppiece '/u01/orabak/backup/full_JINGYU_20150911_40_1';
catalog backuppiece '/u01/orabak/backup/full_JINGYU_20150911_41_1';
catalog backuppiece '/u01/orabak/backup/full_JINGYU_20150911_42_1';
catalog backuppiece '/u01/orabak/backup/arch_JINGYU_20150911_43_1';
catalog backuppiece '/u01/orabak/backup/arch_JINGYU_20150911_44_1';
catalog backuppiece '/u01/orabak/backup/arch_JINGYU_20150911_45_1';
crosscheck backupset;
delete noprompt expired backupset;
EOF
<h2 id="2.4">2.4 RMAN恢復數據庫</h2>
### 2.4.1 restore數據文件 ###
如果數據文件存放目錄已經更改,需要重命名還原。
rman target / log=restore.log <<EOF
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
set newname for datafile 1 to '/u01/oradata02/o1_mf_system_01.dbf';
set newname for datafile 2 to '/u01/oradata02/o1_mf_sysaux_01.dbf';
set newname for datafile 3 to '/u01/oradata02/o1_mf_undotbs1_01.dbf';
set newname for datafile 4 to '/u01/oradata02/o1_mf_users_01.dbf';
set newname for datafile 5 to '/u01/oradata02/o1_mf_dbs_d_ji_01.dbf';
set newname for datafile 6 to '/u01/oradata02/o1_mf_dbs_d_lu_01.dbf';
set newname for datafile 7 to '/u01/oradata02/o1_mf_dbs_d_xx_01.dbf';
set newname for datafile 8 to '/u01/oradata02/o1_mf_dbs_i_xx_01.dbf';
restore database;
switch datafile all;
release channel c1;
release channel c2;
}
EOF
### 2.4.2 recover數據文件 ###
#### 2.4.2.1 recover database; ####
rman target / log=recover.log <<EOF
recover database;
EOF
#### 2.4.2.2 recover database until scn xxxxxxx; ####
scn=1463689
rman target / log=recover$scn.log <<EOF
recover database until scn $scn;
EOF
這個scn根據上一步的日志信息獲取。
### 2.4.3 修改日志文件路徑 ###
new_dest=/usr3/oradata/sysdata/redo_file
sqlplus / as sysdba > logfile.log<<EOF
set linesize 180 pagesize 100
select 'alter database rename file '''||member||''' to ''$new_dest/redoXXX.log'';' from v$logfile;
EOF
**注意:**可以用UE列編輯模式快速處理下新的redo文件名字(即redoXXX.log改為對應的實際值)。
### 2.4.4 修改臨時文件路徑 ###
new_dest=/usr3/oradata/sysdata
sqlplus / as sysdba > tempfile.log<<EOF
set linesize 180 pagesize 100
select 'alter database rename file '''||name||''' to ''$new_dest/tempXXX.dbf'';' from v$tempfile;
EOF
**注意:**同樣處理下新的temp文件名字(即tempXXX.dbf改為對應的實際值)。
### 2.4.5 打開數據庫(resetlogs) ###
sqlplus / as sysdba > dbopen.log<<EOF
alter database open resetlogs;
EOF
啟動過程中會自動創建redo文件,temp文件。
<h2 id="2.5">2.5 恢復后操作</h2>
### 2.5.1 查看數據庫基本信息 ###
查看數據庫實例和庫的狀態,數據文件、臨時文件、日志文件、控制文件、參數文件路徑信息。
sqlplus / as sysdba > dbstatus.log <<EOF
select instance_name, status from v$instance;
select dbid, open_mode from v$database;
select file_name from dba_data_files;
select file_name from dba_temp_files;
select member from v$logfile;
show parameter control
show parameter pfile
EOF
### 2.5.2 創建spfile文件,重啟數據庫 ###
創建spfile文件
sqlplus / as sysdba > createSpfile.log <<EOF
create spfile from pfile;
EOF
關閉數據庫
sqlplus / as sysdba > shutdownDB.log <<EOF
shutdown immediate
EOF
啟動數據庫
sqlplus / as sysdba > startDB.log <<EOF
startup
EOF
### 2.5.3 監聽的配置 ###
修改監聽配置文件:`$ORACLE_HOME/network/admin/listener.ora`
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = JY-DB02)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
對應服務器主機名相關的3處修改:
- hostname顯示正確主機名
- /etc/sysconfig/network中HOSTNAME配置
- /etc/hosts中IP地址和主機名的對應關系
啟動監聽及查看監聽狀態:
lsnrctl start
lsnrctl status