一次用rman做資料遷移的實戰經歷

Jujay發表於2011-11-25
今天接到一個任務:使用者要求把生產庫的資料重新整理到開發庫,因為資料量較大(1T),如果採用常用的export/import方法,時間會很久,又因為生產庫和開發庫環境一模一樣,因此我決定用rman備份恢復的方式進行資料重新整理。生產庫名為O02RCD3,開發庫名為O03RCD0,生產庫和開發庫都是兩節點的RAC,作業系統都為Solaris Spac。

參考文件 (HowTo Restore RMAN Disk backups of RAC Database to Single Instance On Another Node [ID 415579.1]),主要步驟如下:

1.用rman備份生產庫:
run{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/drcd04/rcd/o02rcd3dump/DONT_TOUCH/rman/cf_O02RCD3_%F';
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 20;
backup database format '/drcd04/rcd/o02rcd3dump/DONT_TOUCH/rman/O02RCD3_%U.bak';
}
因為生產庫是執行在歸檔模式下,所以我們可以採用熱備,不需要停機時間。我們需要備份的有:資料檔案、控制檔案。

2.備份開發庫,以防萬一資料遷移失敗,開發庫可恢復原樣:
因為開發庫不是執行在歸檔模式下,我們必須得用冷備的方式備份資料庫。
關閉RAC的所有節點:
srvctl stop database -d O03RCD0 -o immediate
mount其中一個節點(O03RCD0A)
再用rman冷備資料庫:
run{
CONFIGURE CONTROLFILE AUTOBACKUP ON;
 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/db_dumps/O03RCD0/DONT_TOUCH/rman/cf_O03RCD0_%F';
 CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 10;
 backup database format '/db_dumps/O03RCD0/DONT_TOUCH/rman/O03RCD0_%U.bak';
}
上面只備份了資料檔案和控制檔案,因此我們還要拷貝引數檔案和密碼檔案。

3.為開發庫建立新的pfile
因為新的開發庫是從生產庫的備份集裡恢復過來的,所以開發庫原來的引數檔案無法使用,我們可以參考開發庫的引數檔案為生產庫臨時建立一個新的引數。
首先利用生產庫的spfile建立pfile:
SYS@O02RCD3>create pfile='/drcd04/rcd/o02rcd3dump/DONT_TOUCH/rman/initO02RCD3.ora' from spfile;
把該pfile拷貝至開發庫的主機上,並做如下修改:
1) 修改包含具體路徑的引數:audit_file_dest, background_dump_dest, control_files, core_dump_dest,log_archive_dest_1, user_dump_dest等。
2) 刪除和RAC相關的引數:cluster_database_instances, cluster_database等
3) 修改和記憶體相關的引數:sga_max_size,sga_target,pga_aggregate_target等

4.在開發庫上刪除RAC資料庫
參考文件:How To Drop A RAC Database Using RMAN [ID 732042.1]
1) 關閉所有節點
2) 修改引數cluster_database=false
3) 以mount restrict方式啟動其中某一節點:startup mount exclusive restrict pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_old'
4) 用rman刪除RAC資料庫:RMAN> drop database  --注意,這裡千萬不要加including backups,否則第2步的備份也會一起被刪除!
   
5. 恢復控制檔案
首先把第1步產生的生產庫備份集傳到開發庫的主機上。
接著在開發庫中使用新的pfile啟動至nomount狀態:
1) 設定ORACLE_SID為生產庫的資料庫名:
    setenv ORACLE_SID O02RCD3A
2) 以新的pfile啟動資料庫:
    sqlplus "/as sysdba"
    startup nomount pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_new'
然後,恢復控制檔案:
RMAN> restore controlfile from '/db_dumps/O02RCD3/DONT_TOUCH/rman/cf_O02RCD3_c-2567883139-20111125-00';
Starting restore at 28-NOV-11
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1463 devtype=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:35
output filename=/drcdd2/rcd/o03rcd0suprt1/control01.O03RCD0
output filename=/drcdd2/rcd/o03rcd0data1/control02.O03RCD0
output filename=/drcdd2/rcd/o03rcd0ndx1/control03.O03RCD0
Finished restore at 28-NOV-11

恢復的控制檔案的位置由引數pfile裡control_files指定。

有了控制檔案之後,我們就可以mount資料庫:
RMAN> alter database mount;

6.恢復資料檔案
首先,讓新恢復的控制檔案可以找到備份集:
RMAN> catalog start with '/db_dumps/O02RCD3/DONT_TOUCH/rman';
更新控制檔案裡的備份集資訊:
RMAN> crosscheck backup;
因為資料檔案恢復之後的路徑和備份集裡記錄的路徑不一樣,因此在做restore之前,要先用set newname for datafile # to '新路徑‘ 語句設定資料檔案恢復後的新路徑。
run
{
configure device type disk parallelism 12;
set newname for datafile  1 to '/drcdd2/rcd/o03rcd0suprt1/system01.O03RCD0'      ;                                  
set newname for datafile  2 to '/drcdd2/rcd/o03rcd0rbs/undotbs01.O03RCD0'        ;                              
..............................................
restore database;
switch datafile all;
}   
restore成功之後,用以下語句確認一下是否控制檔案中記錄的資料檔案的位置是正確的:
select name from v$datafile

在做recover之前,我們得找到能應用到的最新的歸檔日誌是哪個。
首先,檢視備份集裡歸檔資訊:
  Thrd Seq     Low SCN    Low Time  Next SCN   Next Time
  ---- ------- ---------- --------- ---------- ---------
  1    456891  10006743141075 03-DEC-11 10006743645190 03-DEC-11
  1    456892  10006743645190 03-DEC-11 10006744304286 04-DEC-11
  2    192242  10006743139569 03-DEC-11 10006744304293 04-DEC-11
在這個例子中,我們選取加黑兩個歸檔日誌中Next SCN較小的一個:
run {
set until sequence 456892 thread 1;
recover database;
}

7. 重新命名聯機日誌檔案
在控制檔案中記錄的聯機日誌檔案依然指向生產庫,在open資料庫之前,我們必須使它們指向開發庫。
當前控制檔案記錄的聯機日誌檔案如下:
idel>select member from v$logfile;

MEMBER
------------------------------------------------------------------------------------------------------------------------
/drcdd4/rcd/o05rcd0redo1/redo01.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo01.O05RCD0
/drcdd4/rcd/o05rcd0redo1/redo02.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo02.O05RCD0
/drcdd4/rcd/o05rcd0redo1/redo03.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo03.O05RCD0
/drcdd4/rcd/o05rcd0redo1/redo04.O05RCD0
/drcdd4/rcd/o05rcd0redo2/redo04.O05RCD0
修改聯機日誌檔案路徑如下:
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo01.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo01.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo01.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo01.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo02.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo02.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo02.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo02.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo03.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo03.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo03.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo03.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo1/redo04.O05RCD0' to '/drcdd2/rcd/o03rcd0redo1/redo04.O03RCD0';
alter database rename file '/drcdd4/rcd/o05rcd0redo2/redo04.O05RCD0' to '/drcdd2/rcd/o03rcd0redo2/redo04.O03RCD0';

現在可以open資料庫了:
alter database open resetlogs;

確保已經沒有資料檔案需要recover:
SYS@O05RCD0>select * from V$RECOVER_FILE; --該語句沒有返回結果

8. 重建臨時表空間
當前的臨時表空間指向生產庫:
SYS@O05RCD0>select FILE_NAME,TABLESPACE_NAME from dba_temp_files;

FILE_NAME                                                    TABLESPACE_NAME
------------------------------------------------------------ ------------------------------
/drcdd4/rcd/o05rcd0temp/temp01.O05RCD0                       TEMP

我們需要重建一個臨時表空間,把預設臨時表空間設為新的臨時表空間,並把原臨時表空間刪除:
SYS@O05RCD0>create temporary tablespace TEMP1 tempfile '/drcdd2/rcd/o03rcd0temp/temp01.O03RCD0' size 2400M;
SYS@O05RCD0>alter database default temporary tablespace TEMP1;
SYS@O05RCD0>drop tablespace TEMP;

9. 使用NID修改dbname和dbid
參考:Changing DBNAME and DBID of RAC Database Using NID [ID 464922.1]
1) CLUSTER_DATABASE設為false (在之前已經做過)
2) 只啟動其中一個instance為mount狀態:
    關閉資料庫之前修改sys使用者的密碼:
    alter user sys identified by oracle account unlock;
    shutdown immediate;
    startup mount pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_new'
3) 用nid根據修改資料庫名:
    nid TARGET=SYS/oracle DBNAME=O03RCD0
4) 在引數檔案中把db_name引數設為新的資料庫名O03RCD0
5) 以resetlogs方式開啟資料庫:
    setenv ORACLE_SID O03RCD0A
    startup mount pfile='/db_dumps/O03RCD0/DONT_TOUCH/initO03RCD0.ora_new'
    alter database open resetlogs;

10. 改單節點資料庫為RAC
我們之前一直採用的是修改後的生產庫上的pfile啟動資料庫的,現在只要改為用原來開發庫上的spfile啟動資料庫,就可以以RAC啟動。
先關閉單節點資料庫:
shutdown immediate
接著啟動RAC(注意,此時使用的是原來開發庫上的spfile)
在用srvctl啟動資料庫之前,最好分別在RAC的兩個節點上單獨啟動,如果都可以啟動,再執行下面命令:
srvctl start service -d O03RCD0
記得還要啟動listener。
最後,遠端連線資料庫,驗證:
A105024@O03RCD0>select instance_name from gv$instance;

INSTANCE_NAME
----------------
O03RCD0B
O03RCD0A









   

   

   


   















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26277071/viewspace-712197/,如需轉載,請註明出處,否則將追究法律責任。

相關文章