标题: [其他] 调用rman命令备份数据库的批处理日期选择为何进行不下去? [打印本页]
作者: ksly1227 时间: 2012-3-4 03:26 标题: 调用rman命令备份数据库的批处理日期选择为何进行不下去?
日期选择进行不下去,下面变量CTL好像没有被赋值,请高手指导
@set ORACLE_HOME=G:\oracle\product\10.2.0\db_1
@rem echo %ORACLE_HOME%
@set ORACLE_SID=test
@rem echo %ORACLE_SID%
@set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
@rem echo %NLS_LANG%
@set PATH=%ORACLE_HOME%\bin
@rem echo %PATH%
@set RMAN=%ORACLE_HOME%\bin\rman.exe
@set date=%date:~0,10%
@set BACKUP_DIR=D:\bk\full\%date%
@IF NOT EXIST %BACKUP_DIR% (
mkdir %BACKUP_DIR%
)
@set RQ=%date:~4,10%
@set RMAN_LOG_FILE=%BACKUP_DIR%\rman_%RQ%.log
set BACKUPTYPE=incremental level 0 database
set NAME=full05_%%d_%%T_%%U
set ARCHIVE=arch_%%d_%%T_%%U
@set DAY=%date:~13,14%
@if "%DAY%" EQU "一" (
set CTL=ctl1_%%d_%%T_%%U
)
@if "%DAY%" EQU "二" (
set CTL=ctl2_%%d_%%T_%%U
)
@if "%DAY%" EQU "三" (
set CTL=ctl3_%%d_%%T_%%U
)
@if "%DAY%" EQU "四" (
set CTL=ctl4_%%d_%%T_%%U
)
@if "%DAY%" EQU "五" (
set CTL=ctl5_%%d_%%T_%%U
)
@if "%DAY%" EQU "六" (
set CTL=ctl6_%%d_%%T_%%U
)
@if "%DAY%" EQU "日" (
set CTL=ctl0_%%d_%%T_%%U
)
@(
echo run {
echo allocate channel c1 type disk;
echo backup current controlfile format '%BACKUP_DIR%\%CTL%';
echo release channel c1;
echo }
) | %RMAN% target / msglog '%RMAN_LOG_FILE%'
作者: ksly1227 时间: 2012-3-4 19:15
高手请指导,自己up下
作者: find 时间: 2012-3-4 19:41
在第49行查看一下变量的值:复制代码
作者: ksly1227 时间: 2012-3-4 22:30
本帖最后由 ksly1227 于 2012-3-4 23:18 编辑
3楼不行啊,加上你那2句之后 我有加啦pause
显示 echo ,
变量没显示出来啊
中间去掉逗号,说echo已经打开
echo , %CTL%
pause
命令输出结果:
D:\Program Files\UltraEdit>set BACKUPTYPE=incremental level 0 database
D:\Program Files\UltraEdit>set NAME=full05_%d_%T_%U
D:\Program Files\UltraEdit>set ARCHIVE=arch_%d_%T_%U
D:\Program Files\UltraEdit>echo ,
,
D:\Program Files\UltraEdit>pause
请按任意键继续. . .
作者: find 时间: 2012-3-4 23:34
回复 4# ksly1227
你这哥们眼神咋还不好使了呢,49不是19啊
作者: ksly1227 时间: 2012-3-4 23:40
就是49行
@set ORACLE_HOME=G:\oracle\product\10.2.0\db_1
@rem echo %ORACLE_HOME%
@set ORACLE_SID=test
@rem echo %ORACLE_SID%
@set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
@rem echo %NLS_LANG%
@set PATH=%ORACLE_HOME%\bin
@rem echo %PATH%
@set RMAN=%ORACLE_HOME%\bin\rman.exe
@set date=%date:~0,10%
@set BACKUP_DIR=D:\bk\full\%date%
@IF NOT EXIST %BACKUP_DIR% (
mkdir %BACKUP_DIR%
)
@set RQ=%date:~4,10%
@set RMAN_LOG_FILE=%BACKUP_DIR%\rman_%RQ%.log
set BACKUPTYPE=incremental level 0 database
set NAME=full05_%%d_%%T_%%U
set ARCHIVE=arch_%%d_%%T_%%U
@set DAY=%date:~13,14%
@if "%DAY%" EQU "一" (
set CTL=ctl1_%%d_%%T_%%U
)
@if "%DAY%" EQU "二" (
set CTL=ctl2_%%d_%%T_%%U
)
@if "%DAY%" EQU "三" (
set CTL=ctl3_%%d_%%T_%%U
)
@if "%DAY%" EQU "四" (
set CTL=ctl4_%%d_%%T_%%U
)
@if "%DAY%" EQU "五" (
set CTL=ctl5_%%d_%%T_%%U
)
@if "%DAY%" EQU "六" (
set CTL=ctl6_%%d_%%T_%%U
)
@if "%DAY%" EQU "日" (
set CTL=ctl0_%%d_%%T_%%U
)
echo , %CTL%
pause
@(
echo run {
echo allocate channel c1 type disk;
echo backup current controlfile format '%BACKUP_DIR%\%CTL%';
echo release channel c1;
echo }
) | %RMAN% target / msglog '%RMAN
作者: ksly1227 时间: 2012-3-4 23:41
ediplus行号我没选择上
作者: find 时间: 2012-3-4 23:43
回复 6# ksly1227
不是吧,3楼明明是两行,到你这里怎么就变成一行?
作者: ksly1227 时间: 2012-3-4 23:47
有区别吗??显示2个变量值和显示一个变量值一样,关键是现在显示不出来,我后面有加拉pause 自己看下结果在说
作者: ksly1227 时间: 2012-3-4 23:49
还有echo有那样用法吗?? echo ,+变量???
作者: find 时间: 2012-3-4 23:52
回复 9# ksly1227
这个可以有
你最好自己试试再说
不能乱猜的
作者: find 时间: 2012-3-4 23:52
回复 10# ksly1227
这个必须有
只是你抄多了两个空格而已
作者: find 时间: 2012-3-4 23:55
echo,%CTL%看不到内容就说明你那一大堆if没搞对
这就是为啥它上面还要有一个echo,%DAY%来检查了
作者: ksly1227 时间: 2012-3-4 23:55
我现在把你哪2行加上,输出结果一样啊
下面是命令输出结果
D:\bk>set BACKUPTYPE=incremental level 0 database
D:\bk>set NAME=full05_%d_%T_%U
D:\bk>set ARCHIVE=arch_%d_%T_%U
D:\bk>echo,
D:\bk>echo ,
,
RMAN> 2> 3> 4> 5> RMAN>
作者: ksly1227 时间: 2012-3-5 00:00
echo,%DAY%
echo,%CTL%
上面就是按照你的要求改的
输出结果还是步行
D:\bk>set BACKUPTYPE=incremental level 0 database
D:\bk>set NAME=full05_%d_%T_%U
D:\bk>set ARCHIVE=arch_%d_%T_%U
D:\bk>echo,
D:\bk>echo,
RMAN> 2> 3> 4> 5> RMAN>
作者: ksly1227 时间: 2012-3-5 00:02
或者麻烦你把上面那个脚本改下,做为附件传过来,或者加我q 674693899 或者留下你电话咱俩在交流下
作者: ksly1227 时间: 2012-3-5 00:22
还有你怀疑上面的if语句写的有问题,我测试啦以下片段
@set DAY=%date:~13,14%
@set CTL=ctl10_%%d_%%T_%%U
echo %CTL%
@if "%DAY%" EQU "一" (
set CTL=ctl1_%%d_%%T_%%U
)
echo %DAY%
echo %CTL%
pause
---------------------------------------------------------------------------
输出结果,完全符合要求啊
D:\bk>echo ctl10_%d_%T_%U
ctl10_%d_%T_%U
D:\bk>echo 一
一
D:\bk>echo ctl1_%d_%T_%U
ctl1_%d_%T_%U
D:\bk>pause
请按任意键继续. . .
作者: find 时间: 2012-3-5 01:32
回复 15# ksly1227
那就继续往上推啊- @echo on
- set ORACLE_HOME=G:\oracle\product\10.2.0\db_1
- rem echo %ORACLE_HOME%
- set ORACLE_SID=test
- rem echo %ORACLE_SID%
- set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- rem echo %NLS_LANG%
- set PATH=%ORACLE_HOME%\bin
- rem echo %PATH%
- set RMAN=%ORACLE_HOME%\bin\rman.exe
- set date=%date:~0,10%
- set BACKUP_DIR=D:\bk\full\%date%
- IF NOT EXIST %BACKUP_DIR% (
- mkdir %BACKUP_DIR%
- )
- set RQ=%date:~4,10%
- set RMAN_LOG_FILE=%BACKUP_DIR%\rman_%RQ%.log
- set BACKUPTYPE=incremental level 0 database
- set NAME=full05_%%d_%%T_%%U
- set ARCHIVE=arch_%%d_%%T_%%U
-
- set DAY=%date:~13,14%
- echo,%DAY%
- if "%DAY%" EQU "一" (
- set CTL=ctl1_%%d_%%T_%%U
- )
-
- if "%DAY%" EQU "二" (
- set CTL=ctl2_%%d_%%T_%%U
- )
-
- if "%DAY%" EQU "三" (
- set CTL=ctl3_%%d_%%T_%%U
- )
-
- if "%DAY%" EQU "四" (
- set CTL=ctl4_%%d_%%T_%%U
- )
-
- if "%DAY%" EQU "五" (
- set CTL=ctl5_%%d_%%T_%%U
- )
-
- if "%DAY%" EQU "六" (
- set CTL=ctl6_%%d_%%T_%%U
- )
-
- if "%DAY%" EQU "日" (
- set CTL=ctl0_%%d_%%T_%%U
- )
- echo,%DAY%
- echo,%CTL%
- (
- echo run {
- echo allocate channel c1 type disk;
- echo backup current controlfile format '%BACKUP_DIR%\%CTL%';
- echo release channel c1;
- echo }
- ) | %RMAN% target / msglog '%RMAN_LOG_FILE%'
复制代码
作者: ksly1227 时间: 2012-3-5 01:41
老兄,上面以你的智慧来看没问题吧----哈哈确实没问题
把if语句取消掉,加上set CTL=ctl6_%%d_%%T_%%U
语句顺利执行,关键是把if语句单独拿出来执行没问题(上面以做过测试)组合到一起就有问题
作者: ksly1227 时间: 2012-3-5 01:50
刚才有尝试啦一把 无解,寻求高高手来解决,不行的话我就把脚本多写几个,每个脚本的变量手动赋值
作者: neorobin 时间: 2012-3-5 03:06
回复 20# ksly1227
变量 date 处理及用法的错误.
这行代码
@set date=%date:~0,10%
将日期里包含的星期内容给截掉了, date 这个变量是系统提供的一个自动变量, 一般不应该对其赋值.
将这两行:
@set date=%date:~0,10%
@set BACKUP_DIR=D:\bk\full\%date%
改成一行:
set BACKUP_DIR=D:\bk\full\%date:~0,10%
这个截取方式:
set DAY=%date:~13,14%
中的14并不正确, 你的日期格式是 yyyy-mm-dd 星期几
共有14个字符, 从第 13 (~13 的意义)个字符后面开始, 一共截取 14 (,14 的意义) 个字符, 此处因为后面只有最后一个汉字数字可被截取, 所以结果不错, 但如果后面还有字符, 就会一样截取进去, 满 14 个为止.
正确的截取方式有:
%date:~13,1% (从第 13 个字符后面开始, 截取 1 个字符)
%date:~-1,1% (从倒数第一个字符开始截取 1 个字符)
%date:~-1% (从倒数第一个字符开始截取后面的所有字符)
较多的 @ 可以省掉, 在代码较前面行里用 @echo off 来关闭回显
作者: find 时间: 2012-3-5 10:43
回复 21# neorobin
老是这样搞,楼主啥时候能够学会自己分析问题啊
作者: find 时间: 2012-3-5 10:44
回复 19# ksly1227
代码不是靠智慧写出来的,而是老老实实一步一步调试出来的。
作者: ksly1227 时间: 2012-3-5 11:24
回复 21# neorobin
高手不亏为高手,一针见血的就指出问题所在: date 这个变量是系统提供的一个自动变量, 一般不应该对其赋值,绝对不该赋值,对date赋值以后下面的if语句日期就没法判断
谢谢脚本之家,谢谢热心的网友find、neorobin,这个问题终于解决啦,可以结贴啦。
作者: ksly1227 时间: 2012-3-5 11:29
回复 23# find
在window下这一个脚本在手,工作基本上就没有啥问题啦,大部分工作环境都是linux、aix,win生产环境中用的还是不多。
哈哈,忘啦介绍下咱的工作啦也就是个dba,不求甚解就行,能把活干好就行,在win批处理下咱也不当专家,就用这一次。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |