项目有如下需求,通过远程服务器安装的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,还原成功
最后记得