"你怎麼這麼不愛國,居然買大陸簡體書"
這時候我才發現,我所需要的知識補充,似乎未來只能在簡體中文去或者英文方面尋找了。
在這塊土地上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;
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;
後續補充 : 或是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
請問用VM備份機器,拿oracle備份檔可以直接做資料還原嗎?
ReplyDelete例如VM內最新資料為7/1,備份檔為7/27號,是否可以直接用rman指令把7/27的備份檔還原到7/1的VM內?
VM歸VM 跟DB的備份檔不衝突阿
Delete