使用RMAN遷移資料庫到異機

us_yunleiwang發表於2013-12-05

   遷移資料庫的方法有多種,較為常用的則是使用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. 1、備份原資料庫  
  2.   此處演示的源資料庫與目標資料庫使用相同的版本為Oracle 10g R2(10.2.0.3),作業系統都為suse 10 +Sp3  
  3.   備份過程略,有關備份指令碼,請參考:linux 下RMAN備份shell指令碼 http://blog.csdn.net/robinson_0612/article/details/8029245  
  4.   
  5. 2、ftp所有的備份檔案到需要恢復的伺服器上  
  6.   打包整個備份集ftp到目標伺服器或scp到目標伺服器  
  7.   下面是ftp到目標伺服器解壓後包含的檔案  
  8.   oracle@2go-devDB01uv:/u02/database/SY5221_RMAN/20121013> ls -hltr  
  9.   total 9.4G  
  10.   -rw-r--r-- 1 oracle oinstall 3.0K 2012-10-16 09:48 initSY5221.ora  
  11.   -rw-r--r-- 1 oracle oinstall 2.7G 2012-10-16 10:02 SY5221_lev0_201210130630_4unnkjvi_1_1  
  12.   -rw-r--r-- 1 oracle oinstall 3.1G 2012-10-16 10:04 SY5221_lev0_201210130630_4vnnkjvi_1_1  
  13.   -rw-r--r-- 1 oracle oinstall 938M 2012-10-16 10:07 SY5221_lev0_201210130630_arc_51nnkk2h_1_1  
  14.   -rw-r--r-- 1 oracle oinstall 935M 2012-10-16 10:08 SY5221_lev0_201210130630_arc_52nnkk2h_1_1  
  15.   -rw-r--r-- 1 oracle oinstall 930M 2012-10-16 10:10 SY5221_lev0_201210130630_arc_53nnkk31_1_1  
  16.   -rw-r--r-- 1 oracle oinstall  15M 2012-10-16 10:10 SY5221_lev0_cntl_bak_c-1468911009-20121013-00  
  17.   -rw-r--r-- 1 oracle oinstall  15M 2012-10-16 10:10 SY5221_lev0_cntl_bak_c-1468911009-20121013-01  
  18.   -rw-r--r-- 1 oracle oinstall 910M 2012-10-16 10:11 SY5221_lev0_201210130630_arc_54nnkk32_1_1  
  19.   
  20. 3、建立所需的目錄(使用oracle使用者)  
  21.   oracle@2go-devDB01uv:~> more mkdir_sy5221.sh  
  22.   mkdir -p /u02/database/SY5221/flash_recovery_area  
  23.   mkdir -p /u02/database/SY5221  
  24.   mkdir -p /u02/database/SY5221/archive  
  25.   mkdir -p /u02/database/SY5221/backup  
  26.   mkdir -p /u02/database/SY5221/bdump  
  27.   mkdir -p /u02/database/SY5221/cdump  
  28.   mkdir -p /u02/database/SY5221/udump  
  29.   mkdir -p /u02/database/SY5221/controlf  
  30.   mkdir -p /u02/database/SY5221/oradata  
  31.   mkdir -p /u02/database/SY5221/redolog  
  32.   mkdir -p /u02/database/SY5221/undo  
  33.   mkdir -p /u02/database/SY5221/temp  
  34.   mkdir -p /u02/database/SY5221/ref_data  
  35.   mkdir -p /u02/database/SY5221/BNR  
  36.   mkdir -p /u02/database/SY5221/BNR/full  
  37.   mkdir -p /u02/database/SY5221/BNR/dump  
  38.   mkdir -p /u02/database/SY5221/dbcreatelogs  
  39.     
  40.   ORACLE_SID=SY5221; export ORACLE_SID  
  41.   oracle@2go-devDB01uv:~> chmod u+x mkdir_sy5221.sh  
  42.   oracle@2go-devDB01uv:~> ./mkdir_sy5221.sh  
  43.   
  44. 4、建立密碼檔案  
  45.   oracle@2go-devDB01uv:~> cd $ORACLE_HOME/dbs  
  46.   oracle@2go-devDB01uv:~/OraHome10g/dbs> orapwd file=orapwSY5221 password=oracle force=y entries=10  
  47.   # Author : Robinson   
  48.   # Blog : http://blog.csdn.net/robinson_0612  
  49.   
  50. 3、使用pfile啟動例項到nomount狀態  
  51.   oracle@2go-devDB01uv:~> cp /u02/database/SY5221_RMAN/20121013/initSY5221.ora $ORACLE_HOME/dbs  
  52.   oracle@2go-devDB01uv:~> export ORACLE_SID=SY5221  
  53.   oracle@2go-devDB01uv:~> sqlplus / as sysdba  
  54.   SQL> startup nomount;  
  55.   
  56. 4、恢復控制檔案並切換到mount狀態  
  57.   #再開一個session  
  58.   oracle@2go-devDB01uv:~> export ORACLE_SID=SY5221  
  59.   oracle@2go-devDB01uv:~> $ORACLE_HOME/bin/rman target /  
  60.   RMAN> restore controlfile from '/u02/database/SY5221_RMAN/20121013/SY5221_lev0_cntl.bak_c-1468911009-20121013-01';  
  61.   RMAN> alter database mount;  
  62.   
  63. 5、指定備份檔案所在目錄   
  64.   RMAN> catalog start with '/u02/database/SY5221_RMAN/20121013'#此命令用於掃描整個目錄的備份片或者歸檔日誌檔案等  
  65.   
  66. 6、還原資料庫  
  67.   RMAN> restore database;  
  68.   
  69. 7、恢復資料庫  
  70.   RMAN> recover database;  
  71.   
  72.   unable to find archive log  
  73.   archive log thread=1 sequence=143388  
  74.   RMAN-00571: ===========================================================  
  75.   RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============  
  76.   RMAN-00571: ===========================================================  
  77.   RMAN-03002: failure of recover command at 10/16/2012 11:32:54  
  78.   RMAN-06054: media recovery requesting unknown log: thread 1 seq 143388 lowscn 608805162  
  79.   #由於未複製聯機日誌檔案,此時提示需要seqence 143388,scn 608805162   
  80.   
  81.    #在sqlplus提示符下繼續介質恢復  
  82.   SQL> conn / as sysdba  
  83.   Connected.  
  84.   idle> recover database until cancel;  
  85.   ORA-00283: recovery session canceled due to errors  
  86.   ORA-01610: recovery using the BACKUP CONTROLFILE option must be done  
  87.     
  88.   SQL> recover database using backup controlfile until cancel;  
  89.   ORA-00279: change 608805162 generated at 10/13/2012 06:31:44 needed for thread 1  
  90.   ORA-00289: suggestion : /u02/database/SY5221/archive/arch_668881377_1_143388.arc  
  91.   ORA-00280: change 608805162 for thread 1 is in sequence #143388  
  92.     
  93.   Specify log: {=suggested | filename | AUTO | CANCEL}  
  94.   cancel      #輸入cancel,完成介質恢復  
  95.   Media recovery cancelled.  
  96.   
  97. 8、open 資料庫  
  98.   #如果open 不成功,請嘗試shutdown 之後再次open,如果仍然不成功使用隱藏引數_allow_resetlogs_corruption開啟資料庫  
  99.   SQL> alter database open resetlogs;  
  100.     
  101.   Database altered.  
  102.   
  103. 9、一致性關閉資料庫並重啟資料庫  
  104.   SQL> shutdown immediate;  
  105.     
  106.   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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章