使用RMAN遷移資料庫到異機
遷移資料庫的方法有多種,較為常用的則是使用RMAN來遷移。使用RMAN遷移資料庫屬於資料庫的物理備份與恢復範疇,整個過程中資料庫的相關資訊是完整地映象。因此,基於此種方式還原恢復的資料庫用於測試會使得與真實的生產環境差異相對較小。本文描述了使用RMAN來還原Oracle 10g資料庫的過程。
一、主要步驟
1、備份資料庫
2、ftp備份到目的伺服器
3、為目標資料庫建立專案目錄
4、為目標資料庫建立pfile或spfile(使用RMAN還原或複製原pfile到目的伺服器)
5、還原控制檔案
6、還原資料檔案
7、OPEN 資料庫
其實,這幾個步驟比較好理解,整個實質是對資料庫體系結構以及資料庫整個啟動過程的理解。
關於體系結構和啟動過程可以參考
Oracle例項和Oracle資料庫(Oracle體系結構)
Oracle 資料庫例項啟動關閉過程
下面對此進行一下描述
a、首先需要為例項的執行環境建立相應的目錄,如dump位置,datafile位置,以及archive位置等等
如果是恢復到不同的路徑,則後續RMAN時需要使用set newname for datafile 方式更新到控制檔案
b、例項需要pfile來啟動,因此需要恢復pfile或spfile,然後將資料庫切換到nomount狀態
c、接下來的一步是透過控制檔案將資料庫切換到mount狀態,因此需要恢復控制檔案,然後再mount
d、mount之後就可以對資料庫進行還原(restore)操作
e、還原完畢之後是對資料庫進行恢復(recovery)操作(restore和recover需要基於控制檔案的備份資訊或恢復目錄)
f、最後是open資料庫
二、遷移演示
- 1、備份原資料庫
- 此處演示的源資料庫與目標資料庫使用相同的版本為Oracle 10g R2(10.2.0.3),作業系統都為suse 10 +Sp3
- 備份過程略,有關備份指令碼,請參考:linux 下RMAN備份shell指令碼 http://blog.csdn.net/robinson_0612/article/details/8029245
- 2、ftp所有的備份檔案到需要恢復的伺服器上
- 打包整個備份集ftp到目標伺服器或scp到目標伺服器
- 下面是ftp到目標伺服器解壓後包含的檔案
- oracle@2go-devDB01uv:/u02/database/SY5221_RMAN/20121013> ls -hltr
- total 9.4G
- -rw-r--r-- 1 oracle oinstall 3.0K 2012-10-16 09:48 initSY5221.ora
- -rw-r--r-- 1 oracle oinstall 2.7G 2012-10-16 10:02 SY5221_lev0_201210130630_4unnkjvi_1_1
- -rw-r--r-- 1 oracle oinstall 3.1G 2012-10-16 10:04 SY5221_lev0_201210130630_4vnnkjvi_1_1
- -rw-r--r-- 1 oracle oinstall 938M 2012-10-16 10:07 SY5221_lev0_201210130630_arc_51nnkk2h_1_1
- -rw-r--r-- 1 oracle oinstall 935M 2012-10-16 10:08 SY5221_lev0_201210130630_arc_52nnkk2h_1_1
- -rw-r--r-- 1 oracle oinstall 930M 2012-10-16 10:10 SY5221_lev0_201210130630_arc_53nnkk31_1_1
- -rw-r--r-- 1 oracle oinstall 15M 2012-10-16 10:10 SY5221_lev0_cntl_bak_c-1468911009-20121013-00
- -rw-r--r-- 1 oracle oinstall 15M 2012-10-16 10:10 SY5221_lev0_cntl_bak_c-1468911009-20121013-01
- -rw-r--r-- 1 oracle oinstall 910M 2012-10-16 10:11 SY5221_lev0_201210130630_arc_54nnkk32_1_1
- 3、建立所需的目錄(使用oracle使用者)
- oracle@2go-devDB01uv:~> more mkdir_sy5221.sh
- mkdir -p /u02/database/SY5221/flash_recovery_area
- mkdir -p /u02/database/SY5221
- mkdir -p /u02/database/SY5221/archive
- mkdir -p /u02/database/SY5221/backup
- mkdir -p /u02/database/SY5221/bdump
- mkdir -p /u02/database/SY5221/cdump
- mkdir -p /u02/database/SY5221/udump
- mkdir -p /u02/database/SY5221/controlf
- mkdir -p /u02/database/SY5221/oradata
- mkdir -p /u02/database/SY5221/redolog
- mkdir -p /u02/database/SY5221/undo
- mkdir -p /u02/database/SY5221/temp
- mkdir -p /u02/database/SY5221/ref_data
- mkdir -p /u02/database/SY5221/BNR
- mkdir -p /u02/database/SY5221/BNR/full
- mkdir -p /u02/database/SY5221/BNR/dump
- mkdir -p /u02/database/SY5221/dbcreatelogs
- ORACLE_SID=SY5221; export ORACLE_SID
- oracle@2go-devDB01uv:~> chmod u+x mkdir_sy5221.sh
- oracle@2go-devDB01uv:~> ./mkdir_sy5221.sh
- 4、建立密碼檔案
- oracle@2go-devDB01uv:~> cd $ORACLE_HOME/dbs
- oracle@2go-devDB01uv:~/OraHome10g/dbs> orapwd file=orapwSY5221 password=oracle force=y entries=10
- # Author : Robinson
- # Blog : http://blog.csdn.net/robinson_0612
- 3、使用pfile啟動例項到nomount狀態
- oracle@2go-devDB01uv:~> cp /u02/database/SY5221_RMAN/20121013/initSY5221.ora $ORACLE_HOME/dbs
- oracle@2go-devDB01uv:~> export ORACLE_SID=SY5221
- oracle@2go-devDB01uv:~> sqlplus / as sysdba
- SQL> startup nomount;
- 4、恢復控制檔案並切換到mount狀態
- #再開一個session
- oracle@2go-devDB01uv:~> export ORACLE_SID=SY5221
- oracle@2go-devDB01uv:~> $ORACLE_HOME/bin/rman target /
- RMAN> restore controlfile from '/u02/database/SY5221_RMAN/20121013/SY5221_lev0_cntl.bak_c-1468911009-20121013-01';
- RMAN> alter database mount;
- 5、指定備份檔案所在目錄
- RMAN> catalog start with '/u02/database/SY5221_RMAN/20121013'; #此命令用於掃描整個目錄的備份片或者歸檔日誌檔案等
- 6、還原資料庫
- RMAN> restore database;
- 7、恢復資料庫
- RMAN> recover database;
- unable to find archive log
- archive log thread=1 sequence=143388
- RMAN-00571: ===========================================================
- RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
- RMAN-00571: ===========================================================
- RMAN-03002: failure of recover command at 10/16/2012 11:32:54
- RMAN-06054: media recovery requesting unknown log: thread 1 seq 143388 lowscn 608805162
- #由於未複製聯機日誌檔案,此時提示需要seqence 143388,scn 608805162
- #在sqlplus提示符下繼續介質恢復
- SQL> conn / as sysdba
- Connected.
- idle> recover database until cancel;
- ORA-00283: recovery session canceled due to errors
- ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
- SQL> recover database using backup controlfile until cancel;
- ORA-00279: change 608805162 generated at 10/13/2012 06:31:44 needed for thread 1
- ORA-00289: suggestion : /u02/database/SY5221/archive/arch_668881377_1_143388.arc
- ORA-00280: change 608805162 for thread 1 is in sequence #143388
-
Specify log: {
=suggested | filename | AUTO | CANCEL} - cancel #輸入cancel,完成介質恢復
- Media recovery cancelled.
- 8、open 資料庫
- #如果open 不成功,請嘗試shutdown 之後再次open,如果仍然不成功使用隱藏引數_allow_resetlogs_corruption開啟資料庫
- SQL> alter database open resetlogs;
- Database altered.
- 9、一致性關閉資料庫並重啟資料庫
- SQL> shutdown immediate;
- SQL> startup
恢復到異機不同目錄的情形(補充內容@20130906)
步驟基本上與使用的相同目錄差不多,有些需要注意的,下面一一列出
1、備份資料及ftp到目的伺服器,同之前
2、建立相應的目錄
此處的目錄有別於原目錄,如下面的示例
原目錄: /u02/database/SY5221 原資料庫名: SY5221 (主機: Linux1, ORACLE_SID=SY5221)
新目錄: /u02/database/SY5223 新資料庫名:SY5223 (主機: Linux2, ORACLE_SID=SY5223)
3、建立pfile檔案並啟動例項
從原庫提取引數檔案到目的伺服器,根據需要修改相應的引數,如增加sga大小等
其次修改pfile檔案中的相關路徑使之指向新的位置,即引數檔案中所有含SY5221目錄的應修改為SY5223
注意db_name引數不變,為原來的db_name,待恢復完成後使用nid修改
使用pfile檔案啟動到nomount狀態
3、還原控制檔案
RMAN> restore controlfile from '/u02/database/bak/SY5221cntl.bak';
--切換到mount狀態,注,db_name務必保持原db_name,否則切換到mount時提示
--ORA-01103: database name 'SY5221' in control file is not 'SY5223'
RMAN> alter database mount;
4、使用catalog start with指定備份檔案位置
RMAN> catalog start with '/u02/database/bak';
5、還原及恢復資料庫,由於使用了不同的位置,因此我們需要使用set newname 子句,如下面的示例
run{
set newname for datafile 1 to '/u02/database/SY5223/oradata/sysSY5223.dbf';
set newname for datafile 2 to '/u02/database/SY5223/undo/undotbsSY5223.dbf';
set newname for datafile 3 to '/u02/database/SY5223/oradata/sysauxSY5223.dbf';
set newname for datafile 4 to '/u02/database/SY5223/undo/undotbsSY52232.dbf';
set newname for datafile 5 to '/u02/database/SY5223/oradata/SY5223_system_tbl.dbf';
set newname for datafile 6 to '/u02/database/SY5223/oradata/SY5223_account_tbl.dbf';
set newname for datafile 7 to '/u02/database/SY5223/oradata/SY5223_stock_tbl.dbf';
set newname for datafile 8 to '/u02/database/SY5223/oradata/SY5223_stock_l_tbl.dbf';
restore database;
switch datafile all;
recover database;}
--Recover過程中會收到如下錯誤提示
RMAN-03002: failure of recover command at 09/06/2013 22:40:54
RMAN-06054: media recovery requesting unknown log: thread 1 seq 2872 lowscn 18896302
--我們使用until子句來再次recover
RMAN>run{
2> set until sequence 2872;
3> recover database;
4> alter database open resetlogs;
5> }
executing command: SET until clause
Starting recover at 06-SEP-13
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:03
Finished recover at 06-SEP-13
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of alter db command at 09/06/2013 22:52:04
ORA-00344: unable to re-create online log '/u02/database/SY5221/redolog/log1aSY5221.log'
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 2: No such file or directory
--上面又收到了錯誤提示,是由於無法建立日誌檔案,因為路徑與原來的資料庫路徑不一致
RMAN> exit
6、修改日誌檔案位置及open資料庫
$ sqlplus / as sysdba
SQL> select name,open_mode from v$database;
NAME OPEN_MODE
--------- ----------
SY5221 MOUNTED
SQL> set linesize 190
SQL> col member format a60
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
1 ONLINE /u02/database/SY5221/redolog/log1aSY5221.log NO
1 ONLINE /u02/database/SY5221/redolog/log1bSY5221.log NO
2 ONLINE /u02/database/SY5221/redolog/log2aSY5221.log NO
2 ONLINE /u02/database/SY5221/redolog/log2bSY5221.log NO
SQL> set heading off;
SQL> select 'alter database rename file '''||member||''' to '''||replace(member,'SY5221','SY5223')||''';' from v$logfile;
alter database rename file '/u02/database/SY5221/redolog/log1aSY5221.log' to '/u02/database/SY5223/redolog/log1aSY5223.log';
alter database rename file '/u02/database/SY5221/redolog/log1bSY5221.log' to '/u02/database/SY5223/redolog/log1bSY5223.log';
alter database rename file '/u02/database/SY5221/redolog/log2aSY5221.log' to '/u02/database/SY5223/redolog/log2aSY5223.log';
alter database rename file '/u02/database/SY5221/redolog/log2bSY5221.log' to '/u02/database/SY5223/redolog/log2bSY5223.log';
SQL> alter database rename file '/u02/database/SY5221/redolog/log5bSY5221.log' to '/u02/database/SY5223/redolog/log5bSY5223.log';
SQL> alter database rename file '/u02/database/SY5221/redolog/log6aSY5221.log' to '/u02/database/SY5223/redolog/log6aSY5223.log';
SQL> alter database rename file '/u02/database/SY5221/redolog/log6bSY5221.log' to '/u02/database/SY5223/redolog/log6bSY5223.log';
SQL> alter database rename file '/u02/database/SY5221/redolog/log7aSY5221.log' to '/u02/database/SY5223/redolog/log7aSY5223.log';
SQL> set heading on;
SQL> alter database open resetlogs;
Database altered.
7、修正相應的臨時資料檔案
SQL> select * from dba_temp_files;
select * from dba_temp_files
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/u02/database/SY5221/temp/tempSY5221.dbf'
SQL> select name from v$tempfile;
NAME
------------------------------------------------------------
/u02/database/SY5221/temp/tempSY5221.dbf
/u02/database/SY5221/temp/SY5221_tempSY5221.dbf
SQL> alter tablespace temp add tempfile '/u02/database/SY5223/temp/tempSY5223.dbf' size 50m;
SQL> alter tablespace goex_temp add tempfile '/u02/database/SY5223/temp/SY5223_tempSY5223.dbf' size 50m;
SQL> alter tablespace temp drop tempfile '/u02/database/SY5221/temp/tempSY5221.dbf';
SQL> alter tablespace goex_temp drop tempfile '/u02/database/SY5221/temp/SY5221_tempSY5221.dbf';
SQL> alter database tempfile '/u02/database/SY5223/temp/tempSY5223.dbf' autoextend on;
SQL> alter database tempfile '/u02/database/SY5223/temp/SY5223_tempSY5223.dbf' autoextend on;
SQL> select count(*) from dba_temp_files;
COUNT(*)
----------
2
SQL> shutdown immediate;
8、使用nid修改資料庫名字
$ export ORACLE_SID=SY5223
$ sqlplus / as sysdba
SQL> startup mount pfile=/u02/database/SY5223/initSY5223.ora;
$ nid target=sys/oracle dbname=SY5223 setname=yes #nid命令用法可參考:使用nid命令修改 db name 及 dbid
修改完畢後,修改pfile檔案中的db_name引數為SY5223,啟動資料庫,生成spfile;同時建立相應的密碼檔案
SQL> create spfile from pfile;
$orapwd file=orapwSY5223 password=oracle force=y entries=10
9、配置listener及tnsnames,根據需要全備資料庫
10、後記
上面描述的主要是Oracle 10g,無法連線到目標資料庫,也就是不使用duplicate方式的異機恢復方法
對於Oracle 11g,參考如下連結:
基於RMAN 的同機資料克隆
http://blog.itpub.net/23490154/viewspace-1062386/
基於RMAN的異機資料庫克隆(rman duplicate)
基於RMAN從活動資料庫異機克隆(rman duplicate from active DB)
RMAN 資料克隆檔案位置轉換方法
http://blog.itpub.net/23490154/viewspace-1062387/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062402/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【遷移】使用rman遷移資料庫資料庫
- 使用SQL Developer 遷移異構資料庫到OracleSQLDeveloper資料庫Oracle
- 使用RMAN遷移檔案系統資料庫到ASM資料庫ASM
- 用Rman 異機遷移
- 使用RMAN遷移單庫到RAC
- 【資料遷移】RMAN遷移資料庫到ASM(二)切換資料檔案到ASM資料庫ASM
- 【資料遷移】RMAN遷移資料庫到ASM(一)建立ASM磁碟組資料庫ASM
- 【資料遷移】RMAN遷移資料庫到ASM(三)遷移onlinelog等到ASM資料庫ASM
- 用 RMAN 備份異機恢復 遷移資料
- 用rman遷移資料庫資料庫
- 使用RMAN進行Oracle資料庫遷移Oracle資料庫
- 使用RMAN進行資料遷移
- Oracle資料庫遷移之一:RMANOracle資料庫
- RMAN遷移資料庫(rac or single)資料庫
- 遷移資料庫到ASM資料庫ASM
- 從 SQL Server 到 MySQL (一):異構資料庫遷移ServerMySql資料庫
- 用rman從檔案系統遷移資料庫到asm資料庫ASM
- 利用RMAN跨平臺遷移資料庫資料庫
- 四、用rman從檔案系統遷移資料庫到asm資料庫ASM
- 遷移資料庫到SQLonLinuxDocker資料庫SQLLinuxDocker
- oracle 遷移資料庫到asmOracle資料庫ASM
- RMAN 異機複製資料庫資料庫
- 透過rman全庫備份遷移資料庫資料庫
- 使用RMAN完成跨平臺資料遷移
- 使用RMAN執行oracle ASM資料遷移OracleASM
- 使用RMAN對資料庫進行異機還原資料庫
- 今晚遷移資料庫異常順利資料庫
- 三、rman 資料庫遷移--從檔案系統到裸裝置資料庫
- 遷移資料庫檔案到ASM資料庫ASM
- 【RMAN】Oracle11g使用rman遷移升級資料庫(win_to_linux)Oracle資料庫Linux
- RAC資料庫的RMAN備份異機恢復到單節點資料庫資料庫
- 使用expdp、impdp遷移資料庫資料庫
- 通過RMAN異機遷移資料庫並修改儲存路徑【相同位數與平臺版】資料庫
- Oracle 利用RMAN 完成資料遷移Oracle
- 資料庫遷移資料庫
- 異構資料庫遷移 sql等價改寫資料庫SQL
- RMAN 異機遷移實戰操作-附加常用命令
- 【DATAPUMP】使用DataPump遷移Oracle資料庫Oracle資料庫