为什么要使用脚本?
为什么要使用RMAN命令脚本呢? 这里有2个主要原因:
- 绝大多数RMAN操作都是批量的同时也是自动化的。举例来说,备份数据库是一个反反复复的操作而非每次执行都要费一番功夫写命令。
- 脚本提供了一致性。在临时性的抑或者说一次性的操作,譬如从备份中恢复数据库,一般都不适用自动化。但是,操作本身是相同的,无论DBA在何种环境下。
在Oracle11g中有两种脚本形式
- 使用命令文件: 即文件系统上的一个文本文件,也叫平面文件。
- 使用存储的脚本,该脚本存储在Oracle恢复目录中,由RMAN命令行调用。
命令文件形式
Oracle 命令文件是一种文本解释文件类似于UNIX下的SHELL脚本和Windows中的批处理作业BAT文件。代码演示1中展示了一个非常简单的例子,用以备份USERS表空间。其中扩展名.rman是非必要的,但有助于帮您理清文件用途。
代码演示1:备份USERS表空间的脚本
connect target /
connect catalog rman/secretpass@rmancat
run {
allocate channel c1 type disk format ‘/orabak/%U’;
backup tablespace users;
}
你可以通过多种方式调用脚本,例如自RMAN提示行中:
RMAN> @backup_ts_users.rman
注意调用使用的符号@。
您也可以在SHELL中调用脚本,例如:
rman @backup_ts_users.rman
这种方式十分有用,若不想使用@符号,用以下方式替代:
rman cmdfile=backup_ts_users.rman
注意CONNECT子句是放在backup_ts_users.rman命令文件中的,故再次无需提供用户名与密码,也保障了没有泄露密码的危险。
传递参数: backup_ts_users.rman命令文件运行地不错,但他太固定了。他将备份输出到某个特定目录且只备份一个表空间(USERS)。若你想要备份到另一处或其他表空间是,你需要创建新的脚本。
一个较好的策略是使用参数驱动的RMAN脚本。比起硬编码来,参数传递脚本灵活得多。代码演示2中展示了修改了的backup_ts_users .rman脚本。
代码演示2: 参数驱动脚本
connect target /
connect catalog rman/secretpass@rmancat
run {
allocate channel c1 type disk format ‘&1/%U’;
backup tablespace &2;
}
另一个SHELL脚本,名为backup_ts_generic.sh调用以上脚本,传递参数/tmp作为备份目录以及USERS为备份表空间对象。
$ORACLE_HOME/bin/rman <<EOF
@backup_ts_generic.rman “/tmp” USERS
EOF
你还可以使之更灵活,你可以将backup_ts_generic.sh第二行做以下修改:
@backup_ts_generic.rman “/tmp” $1
则您可以将参数传递给sh脚本,在以/tmp为固定备份目录的情况下。例如您要备份MYTS表空间:
backup_ts_generic.sh MYTS1
日志设置: 当你通过某种自动设置来运行RMAN脚本时,实际没有人在观察命令窗口,那我们如何找到RMAN的输出呢?这些输出日志使我们了解脚本的运行结果故之分重要,为了获取日志,我们可以使用log选项。
rman cmdfile=backup_ts_users.rman log=backup_ts_users.log
现在backup_ts_users.rman脚本的输出日志将会记录在名为backup_ts_users.log 的文件中而非出现在屏幕上。
存储脚本
虽然脚本文件可以满足大多数情况,但他们也有部分缺点。脚本文件总是存放在服务器上,这显得并不十分安全,因为只要有阅读该文件的权限就可以获取SYS等账号的密码。
解决方法就是使用RMAN的存储脚本,存储脚本保存在了Oracle恢复目录中,而非直接存放在服务器上。代码演示3展示了调用存储脚本的例子。
代码演示3:
RMAN> run { execute script
backup_ts_users; }
C:\> rman
RMAN> connect target /
RMAN> connect catalog rman/secretpass@rmancat
RMAN> create script backup_ts_users
2> comment ‘Tablespace Users Backup’
3> {
4> allocate channel c1 type disk format ‘c:\temp\%U’;
5> backup tablespace users;
6> }
在代码演示3中存储脚本backup_ts_users仅在用户连接到目标数据库是可见。同时存储脚本也可以做到传递参数,如代码演示4、
代码演示4:参数驱动的存储脚本:
RMAN> create script backup_ts_any
2> comment ‘Any Tablespace Backup’
3> {
4> allocate channel c1 type disk format ‘c:\temp\%U’;
5> backup tablespace &1;
Enter value for 1: users
users;
6> }
7>
调用参数驱动存储脚本时,我们需要使用USING 子句。如下例,使用存储脚本备份SYSTEM表空间:
run { execute script
backup_ts_any using ‘SYSTEM’; }
管理存储脚本:RMAN工具提供了管理存储脚本的必要方式。
可以用一下命令列出存储的脚本:
RMAN> list script names;
List of Stored Scripts in Recovery Catalog
Scripts of Target Database ARUPLAP1
Script Name
Description
————
backup_ts_any
Any Tablespace Backup
backup_ts_users
Tablespace Users Backup
以上命令会列出脚本的本地和全局名。
若只需要列出全局名,可以使用以下命令:
RMAN> list global script names;
若要显示某个脚本的具体内容,例如back_ts_any,可以使用以下命令:
RMAN> print global script
backup_ts_level1_any;
删除一个存储脚本:
RMAN> delete global script
backup_ts_level1_any;
你也可以通过一个脚本文件创建存储脚本,如以下:
RMAN> create script backup_ts_users
from file ‘backup_ts_users.rman’;
当然你也可以通过存储脚本还原出一个平面脚本文件:
RMAN> print script backup_ts_users
to file ‘backup_ts_users.rman’;