項目有如下需求,通過遠程服務器安裝的oracle client調用rman 進行全庫的backup,最好能進行熱備份。因爲硬盤空間不足,不希望開啓歸檔模式。
順便吐嘈下,rman真的很不好用,太複雜了。
最後發現不開啓歸檔模式下進行熱備是不行的。
只能妥協,由於我們是開發數據庫,所以短暫停機(1分鐘內)是可以接受的。所以決定採用腳本(Script)進行冷備份。
RMAN> create script full_backup {
2> shutdown immediate;
3> startup mount;
4> allocate channel c1 type disk;
5> backup as compressed backupset database format '/home/oracle/RMAN_BACKUP/%d_%s_%p.bak';
6> alter database open;
7> }
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of create script command at 09/17/2014 13:12:07
RMAN-06002: command not allowed when not connected to a recovery catalog
建立腳本的時候,發生以上錯誤。這是因爲如果不通過catalog進行備份的話,repository會使用controll file,缺點是不能存儲腳本信息。
不得以先建立catalog數據庫。
1.首先,創建RMAN用戶並授權
SQL> create user rman identified by rman default tablespace users quota unlimited on users;
SQL> grant recovery_catalog_owner to rman;
2.通過rman連接catalog,並創建恢復目錄
[oracle@EBOM01 bin]$ ./rman catalog rman/rman@orcit2
RMAN> create catalog
3.註冊數據庫
[oracle@EBOM01 bin]$ ./rman target XXX/XXX@orcit2 catalog rman/rman@orcit2
RMAN> register database;
4.創建腳本
create script full_backup {
shutdown immediate;
startup mount;
allocate channel c1 type disk;
backup as compressed backupset database format '/home/oracle/RMAN_BACKUP/%d_%s_%p.bak';
alter database open;
}
5.運行腳本
RMAN> run {execute script full_backup;}
database closed
database dismounted
Oracle instance shut down
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03015: error occurred in stored script full_backup
RMAN-03002: failure of startup command at 09/17/2014 14:15:30
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
發現數據庫能關不能開。。。
網上一查,是使用動態的問題,當數據庫關閉後,PMON進程終止了,自然就不能連接了。要改成靜態監聽(oracle真難用)
記住這個是針對服務器的修改不是客戶端。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = XXXX)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/client)
(GLOBAL_DBNAME=HJD.COM.CN)
)
)
再次試驗,這次報錯不是在Startup上,而是在連接catalog上,由於catalog和目標數據庫放在一個庫上,所以關閉目標數據庫時,自然catalog也不能用了。
好吧,只能分開到兩個庫上,這也是標準作法。
取消註冊,然後在另一個庫重建catalog
RMAN> unregister database;
再次實行後,一切OK。
再寫個shell,以方便jenkins遠程調用。
ORACLE=/u01/app/oracle/product/11.2.0/client
$ORACLE/bin/rman target XXX/XXX@orcit2 catalog rman/rman@orcit1 script 'full_backup'
執行下,一切OK。
再試下還原,記住是還原不是恢復。還原只能還原到備份的時點,恢復是利用歸檔日誌和redo日誌恢復到任意一個時點
首先要先關閉數據庫,直接還原的話會報錯,估計是有人連在數據庫上的時候沒法還原。
RMAN> shutdown immediate
啓動到掛載模式,執行還原
RMAN> startup mount
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
一切OK,還原成功
最後記得