[20161214]rman checksyntax.txt
--rman在命令行使用参数checksyntax可以检查命令语法是否正确,而且并不会真正执行.但是昨天在恢复一个10g的数据库时遇到问题,做
--一个记录:
1.环境:
--要恢复的数据库版本:
> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx 10.2.0.4.0 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
2.建立脚本
$ cat reco.rman
run
{
set until time '2016-12-03 04:00:00';
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
restore database;
recover database;
release channel c1;
release channel c2;
release channel c3;
}
3.测试:
$ rlrman checksyntax
Recovery Manager: Release 10.2.0.4.0 - Production on Wed Dec 14 10:51:12 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: STATISTI (DBID=3581654166)
RMAN> @ reco.rman
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01009: syntax error: found "identifier": expecting one of: "allocate, alter, backup, beginline, blockrecover, catalog, change, connect, copy, convert, create, crosscheck, configure, duplicate, debug, delete, drop, exit, endinline, flashback, host, {, library, list, mount, open, print, quit, recover, register, release, replace, report, renormalize, reset, restore, resync, rman, run, rpctest, set, setlimit, sql, switch, spool, startup, shutdown, send, show, test, transport, upgrade, unregister, validate"
RMAN-01008: the bad identifier was: reco
RMAN-01007: at line 1 column 2 file: standard input
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01009: syntax error: found "dot": expecting one of: "allocate, alter, backup, beginline, blockrecover, catalog, change, connect, copy, convert, create, crosscheck, configure, duplicate, debug, delete, drop, exit, endinline, flashback, host, {, library, list, mount, open, print, quit, recover, register, release, replace, report, renormalize, reset, restore, resync, rman, run, rpctest, set, setlimit, sql, switch, spool, startup, shutdown, send, show, test, transport, upgrade, unregister, validate"
RMAN-01007: at line 1 column 6 file: standard input
--//如果仔细看报错信息,RMAN-01008: the bad identifier was: reco,昨天学习如何看这种错误,采用从底向上的方式查看.
--//于是采用copy&paste的方式检查发现没有错误,难道10g支持脚本这样的检查方式吗?于是我取消@与reco.rman之间的空格(在这步我浪
--//费大量的时间):
RMAN> @reco.rman
RMAN> run
2> {
3> set until time '2016-12-03 04:00:00';
4> allocate channel c1 type disk;
5> allocate channel c2 type disk;
6> allocate channel c3 type disk;
7> restore database;
8> recover database;
9> release channel c1;
10> release channel c2;
11> release channel c3;
12> }
The cmdfile has no syntax errors
RMAN> **end-of-file**
--Ok,原来这样的检查方式不能在@与脚本文件之间存在空格.另外如果真正执行也是一样,不能在@与脚本文件之间存在空格.大家可以自行测试.
4.继续测试在11g的情况.
SYS@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
$ rlrman checksyntax
Recovery Manager: Release 11.2.0.4.0 - Production on Wed Dec 14 11:02:24 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: BOOK (DBID=1337401710)
RMAN> @ reco.rman
RMAN> run
2> {
3> set until time '2016-12-03 04:00:00';
4> allocate channel c1 type disk;
5> allocate channel c2 type disk;
6> allocate channel c3 type disk;
7> restore database;
8> recover database;
9> release channel c1;
10> release channel c2;
11> release channel c3;
12> }
The cmdfile has no syntax errors
RMAN> **end-of-file**
RMAN> @reco.rman
RMAN> run
2> {
3> set until time '2016-12-03 04:00:00';
4> allocate channel c1 type disk;
5> allocate channel c2 type disk;
6> allocate channel c3 type disk;
7> restore database;
8> recover database;
9> release channel c1;
10> release channel c2;
11> release channel c3;
12> }
The cmdfile has no syntax errors
RMAN> **end-of-file**
--//很明显11g已经修复了这个bug,可以在@与脚本文件加入空格.这个错误我浪费了1个多小时,晚下班半个小时,oracle真是处处是陷阱.
5.补充在10g的测试:
$ rlrman
run
{
allocate channel c1 device type DISK;
allocate channel c2 device type DISK;
#list backup summary;
release channel c1;
release channel c2;
}
RMAN> @ r.rman
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01009: syntax error: found "identifier": expecting one of: "allocate, alter, backup, beginline, blockrecover, catalog, change, connect, copy, convert, create, crosscheck, configure, duplicate, debug, delete, drop, exit, endinline, flashback, host, {, library, list, mount, open, print, quit, recover, register, release, replace, report, renormalize, reset, restore, resync, rman, run, rpctest, set, setlimit, sql, switch, spool, startup, shutdown, send, show, test, transport, upgrade, unregister, validate"
RMAN-01008: the bad identifier was: r
RMAN-01007: at line 1 column 2 file: standard input
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01009: syntax error: found "dot": expecting one of: "allocate, alter, backup, beginline, blockrecover, catalog, change, connect, copy, convert, create, crosscheck, configure, duplicate, debug, delete, drop, exit, endinline, flashback, host, {, library, list, mount, open, print, quit, recover, register, release, replace, report, renormalize, reset, restore, resync, rman, run, rpctest, set, setlimit, sql, switch, spool, startup, shutdown, send, show, test, transport, upgrade, unregister, validate"
RMAN-01007: at line 1 column 3 file: standard input
RMAN> @r.rman
RMAN> run
2> {
3> allocate channel c1 device type DISK;
4> allocate channel c2 device type DISK;
5> # list backup summary;
6> release channel c1;
7> release channel c2;
8> }
using target database control file instead of recovery catalog
allocated channel: c1
channel c1: sid=484 devtype=DISK
allocated channel: c2
channel c2: sid=483 devtype=DISK
released channel: c1
released channel: c2
RMAN> **end-of-file**
--//以后注意10g,rman下脚本执行时@与脚本文件之间不能带空格.
--//另外大家可以看看我以前写的blog http://blog.itpub.net/267265/viewspace-1988542/=> [20160214]rman执行脚本注解问题.txt
--//实际上这个问题再次体现一点,认真看出错信息很重要.我当时就是心里太浮躁.....