Wednesday, August 29, 2012

使用RMAN達到異機還原Instance

今天去逛一下書局,本想去找一下Oracle看有沒有值得買的書,買了兩本就開開心心的回家,回到家的時候我弟看到我買的書,念了我一下....



"你怎麼這麼不愛國,居然買大陸簡體書"

這時候我才發現,我所需要的知識補充,似乎未來只能在簡體中文去或者英文方面尋找了。

在這塊土地上Oracle這方面的知識與技術超越我的人太多太多,但在我熟悉的文字中,似乎已經沒有願意分享寶貴的經驗與知識呈現,看來我所熟悉的文字在很多方面它的競爭力漸漸式微。

無彷~反正我意義上也是個外國奴,靠的外國人發明出來的軟體過生活,本來就沒資格要求在熟悉的語言下學習,也不能指責有分享的人"你寫的東西怎麼都是一筆帶過,誰看得懂"。

今天~來簡單的分享一下使用RMAN的備份檔達到異機還原的目的。

是否一定要Archive Log Mode???

No Archive Log
在這個模式底下,若要online的狀況下備份還原資料庫,只能使用export、import,但還原資料庫的時候就很頭大了,等於重建一個資料庫再把資料導入,必須要注意權限、Schema.....連import的順序也要考慮,若要做physical backup只能關閉資料庫做備份。

1 . 關閉資料庫、Listener
2 . 複製所有datafile、online redo logfile、control file、最好spfile也要。
3 . 開啟資料庫、Listener

Archive Log
在Archive Log模式底下,可以在online的實體備份(Physical Backup),他會將資料庫目前的狀態備份下來,還原的時候既輕鬆多了,就像是把檔案放到該放的位置,設定一下資料庫就可以起來了。

RMAN(Recovery Manager)說明

在備份的時候,備份軟體總是要知道資料庫裡有甚麼檔案,時麼時候備份,備份了哪些內容,那些資料庫的檔案放在哪裡,這就是所謂RMAN的metadata。RMAN的可以建立一個Catalog Database來存放RMAN備份的資訊(不是備份資料),若未設定RMAN Catalog Database,預設RMAN會將metadata存放於將備份Instance的Control File中。

RMAN的備份雖然可以不需要切換為begin backup 或end backup來達到各檔案的時間戳記一致,但資料庫必須要再Archive Log模式底下做備份。


Oracle Instance的結構

在備份前先討論一下Instance的組成結構與"時間點"曖昧的關係,Oracle Instance的組成零件如下。

1 . Datafile (存放ERP、人所衍生出的資料)
2 . online redo logfile (使用者所產生的資料變化與"進化"過程的過程把它記錄下來)
3 . control file (保持資料庫檔案的一致性,datafile路徑等,也包含RMAN的關鍵資料)
4 . server parameter file (pfile or spfile,資料庫的參數檔,)
5 . Password file (密碼檔,用於未啟動Instance時,管理者遠端登入用)

以上的幾個零件,Datafile、online redo logfile 、control file 有著曖昧不明的關系,當異常發生須要重新啟動資料庫的時候,資料庫會先將control file中的SCN與datafile、online redo logfile的SCN做比對,若時間點一致的話就不需要rollback,若不一致的話,就靠online redo logfile來做rollbackup,以此方式來滿足他們"時間點"曖昧,也保證了資料庫的資料一致性。

若online redo logfile無法滿足他們的愛眛呢,那就保佑你有開Archive Log了並且命大運好資料庫乖,不過這情況很少發生,預設online redo logfile有三個,Oracle內部的機制可以滿足絕大部分的rollback所需!!!

flash_recovery_area

Oracle 10g 新增的一項概念,他是一個資料夾,預設存放archive log、RMAN backup資料、control file的副本...等,但既然Oracle將他是命名為"Area",但表這資料夾的容量受Oracle的限制,限制的參數為"db_recovery_file_dest_size",預設是2G,滿的話資料庫異常。

RMAN備份與異機還原流程

1 . 來源資料庫 開啟Archive Log Mode,修正flash_recovery_area路徑與空間限制大小。
預設的情況下RMAN的備份、Archive Log...等都會存放在flash_recovery_area,而flash_recovery_area又跟datafile放在同一個磁區中,如此一來備份會受到I/O競爭的影響,且習慣上Archive Log也不放在flash_recovery_area。

2 . 來源資料庫 使用RMAN備份資料庫。

3 . 目的資料庫 還原時所需檔案的複製與資料庫環境的部屬。

當還原的檔案都已經傳送到目的資料庫中,RMAN就必須要連到目的資料庫的Instance中做復原。
RAMN要有Instance可以連的話,目的資料庫的Instance至少開到nomount狀態下。
資料庫 Instance要開到nomount狀態,就必須要有spfile、password file還要有Listener以及Instance所需的相關的資料夾。

4 . 目的資料庫 還原資料庫與開啟Instance。


初始化參數說明

control_file_record_keep_time
當RMAN未設定catalog database時,所有的RMAN備份紀錄都會存在control file中,預設control file
中保留RMAN備份紀錄為七天。

db_recovery_file_dest
Flash_recovery_area路徑,建議不要與datafile同一磁碟。

db_recovery_file_dest_size
Flash_recovery_area可使用空間的上限,預設為2G。

實作-利用RMAN 由 資料庫A主機 還原到 資料庫B主機。

假設資料庫B主機已經裝完 Oracle 10g Software,版本與Patch 建議與資料庫A一模一樣。

1 . 資料庫A的Archive log 開啟與備份操作

來源資料庫A 開啟Archive Log Mode,本次測試不利用 Flash_recovery_area 。
# su - root
# mkdir -p /archivelog/orcl
# chown -R oracle:oinstall /archivelog/orcl

修正資料庫參數
SQL> alter system set log_archive_dest_1="location=/archivelog/orcl" scope=both;
SQL> alter system set log_archive_format='orcl_%r_%t_%s.arc' scope=spfile;

開啟Archive Log mode
SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog
SQL>alter database open;


使用RMAN備份資料庫A。
# su - root
# mkdir -p /backup/rman/orcl
# chown -R oracle:oinstall /backup

# su – oracle
$ rman target /
run {
 allocate channel disk1 type disk;
 backup database format'/backup/rman/orcl/dbf_%U.bak' tag 'migrate_data';
 sql 'alter system archive log current';
 backup format '/backup/rman/orcl/arc_%U.bak' archivelog all tag 'migrate_arc';
 backup spfile format '/backup/rman/orcl/spfile.bak' tag 'migrate_spfile';
 backup current controlfile format '/backup/rman/orcl/controlfile.bak' tag 'migrate_con';
 release channel disk1;
}

2 . 資料庫B的設定與還原。

資料庫B 由於已經安裝好 Oracle 軟體,但還沒 netca 與 dbca ,所以沒有 orcl 這個 instance 相關資訊,orcl 相關的資料夾與檔案需要手動設定,可以使用 dbca 設定到最後將create instance 取消打勾, create scripts 打勾得到相關範本 scripts 做為參考。

手動建立Instance相關流程說明
1 . 建立 Instance 相關目錄。
2 . 使用 netca 建立 listener,看到這就先 netca listener 。
3 . 將所需資料由資料庫A複製到資料庫B。
4 . 使用RMAN 還原資料庫,並用resetlogs 開啟資料庫。




建立Archive Log與flash_recovery_area目錄
# su - root
# mkdir -p /archivelog/orcl
# chown -R oracle:oinstall /archivelog/orcl

# mkdir -p /backup/rman/orcl
# chown -R oracle:oinstall /backup

建立orcl Instance所需目錄
# su - oracle
$ ORACLE_SID=orcl
$ OLD_UMASK=`umask`
$ umask 0027
$ mkdir -p $ORACLE_HOME/cfgtoollogs/dbca/orcl
$ mkdir -p $ORACLE_HOME/dbs
$ mkdir -p $ORACLE_BASE/admin/orcl/adump
$ mkdir -p $ORACLE_BASE/admin/orcl/bdump
$ mkdir -p $ORACLE_BASE/admin/orcl/cdump
$ mkdir -p $ORACLE_BASE/admin/orcl/dpdump
$ mkdir -p $ORACLE_BASE/admin/orcl/pfile
$ mkdir -p $ORACLE_BASE/admin/orcl/udump
$ mkdir -p $ORACLE_BASE/oradata/orcl


在資料庫B上複製來資料庫A的資料

# su - root
# scp -r root@資料庫A的IP:/etc/ora* /etc

$ su - oracle
$ cd  $ORACLE_HOME/network/admin
$ scp -r oracle@資料庫A的IP:$ORACLE_HOME/network/admin/tnsnames.ora .
記得修改 tnsnames.ora 中的(HOST =資料庫B )。

$ scp -r oracle@資料庫A的IP:$ORACLE_HOME/dbs/orapworcl $ORACLE_HOME/dbs

$ scp -r oracle@資料庫A的IP:/backup/rman/orcl/* /backup/rman/orcl


登入RMAN註冊DBID並將Instance開啟至nomount
$ su - oracle
$ rman target /
RMAN> set dbid=xxxxxxxx  #DBID在來源端主機使用RMAN即可得知,必須一樣。
RMAN> startup nomount;

RMAN> restore controlfile form '/backup/rman/orcl/controlfile.bak';

RMAN> alter database mount;

RMAN> run {
   allocate channel disk1 device type disk;
   restore archivelog all;
   restore database ;
   release channel disk1;
}





$ su – oracle
$ sqlplus ‘/as sysdba’
SQL> recover database using backup controlfile until cancel;


RMANˇ



後續補充 : 或是restore時遇到以下問題。

released channel: disk1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 12/14/2014 00:18:20
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of archived log for thread 2 with sequence 75 and starting SCN of 1786500 found to restore

SQL>  recover database using backup controlfile until cancel;
ORA-00279: change 1783889 generated at 12/13/2014 23:34:39 needed for thread 2
ORA-00289: suggestion : +FRA
ORA-15173: entry 'ARCHIVELOG' does not exist in directory 'ORCL'
ORA-00280: change 1783889 for thread 2 is in sequence #72


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '+DATA/orcl/datafile/system.263.866247391'

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '+DATA/orcl/datafile/system.259.866246939'

無論怎麼restore 都會出現這樣的錯誤,可以嘗試使用 list backup 找出 archive log備份的最後一個scn

RMAN> list backup ;
................. 略 ..................
  2    71      1771317    13-DEC-14 1778168    13-DEC-14
  2    72      1778168    13-DEC-14 1784919    13-DEC-14
  2    73      1784919    13-DEC-14 1786168    13-DEC-14
  2    74      1786168    13-DEC-14 1786500    13-DEC-14   <=  最後一個 SCN
................. 略 ..................

restore and recover 到特定的 SCN。
RMAN> restore database until scn 1786168;
RMAN> recover database until scn 1786168;


SQL> alter database open resetlogs;


如以一來,移轉Database輕鬆多了。


什麼時候用resetlogs
1. 不完全的恢復資料庫,例如 online redo log 不見了。
2. Restore controlfile
3. create control file

2 comments:

  1. 請問用VM備份機器,拿oracle備份檔可以直接做資料還原嗎?
    例如VM內最新資料為7/1,備份檔為7/27號,是否可以直接用rman指令把7/27的備份檔還原到7/1的VM內?

    ReplyDelete