可以将一些 DB2 系统命令编制成脚本以便简单地使它们已经提供的功能自动化。DB2 审计工具(db2audit.exe)就是可以通过脚本编制实现自动化的实用程序的典型示例。另一些 DB2 系统命令在单独使用时作用并不大,但与其它 DB2 命令或操作系统命令结合起来就非常有用。我将在本文的脚本编制方案一节向您演示一些示例。
Windows shell 脚本ITPUB个人空间8qT/JWg6I
0By)mg2P
Jr0]|ix r0Windows shell 脚本编制环境经过了很长时间的发展,它最初是早期 Windows 操作系统上的简单批处理文件。对于需要用到 Window shell 命令或者带命令行界面的其它程序的任务而言,Windows shell 脚本是调度和自动化这些任务的理想工具。
Windows shell 是自动化 DB2 UDB 管理任务方面引人注目的脚本编制环境,原因如下。第一,Windows shell 集成在 Windows 操作系统中,这使得它可用于所有版本的 Windows 客户机与服务器。第二,Windows shell 脚本编制相对较简单,使它易于实现。这使您可以专注地完成当前的任务。最后,介绍Windows shell 脚本编制的书籍、手册和参考资料有很多。
Windows shell 脚本编制环境提供:
- 有条件的命令执行
- 标准输入、输出和错误
- 命令行参数
- 环境和系统变量
- 局部和全局变量名
- 字符串和数值变量
- 算术运算符(+、-、*、/ 和 %)
- 字符串、子串和替换
- 条件语句(if、if else、if not 和 if defined)
- 迭代处理(范围、元素、文件和目录)
- 子例程链接和嵌套(GOTO 和 CALL)
- 驱动器和文件夹定位(pushd 和 popd)
除了这些特性之外,还可以通过使用 Windows 资源包提供的系统实用程序,进一步增强 Windows shell 脚本。 表 5列出了其中的一些实用程序。有关 Windows 资源包的更多信息,请在 www.microsoft.com/windows/reskits访问 Windows Deployment and Resource Kits 主页。
表 5. Windows 资源包实用程序 ITPUB个人空间E5Is-W
y
| 命令 | 描述 |
| choice | 通过显示提示并等待用户从一组键中选择,在批处理程序中提示用户作出选择。只能在批处理程序中使用该命令。 |
| timethis | 测量系统运行给定命令所花的时间。 |
| logtime | 记录批处理文件中命令行程序的启动或完成。这在对批处理作业(如邮件地址导入)计时和跟踪时很有用。 |
| Uptime | 通过处理事件日志分析单一服务器以确定可靠性、可用性和当前运行时间。目标系统可以是本地系统,也可以是远程系统。 |
| logevent | 该工具使您能通过命令提示符或批处理文件在本地或远程计算机上的事件日志中记录事件项。 |
| netsvc | 您可以使用该工具从命令行远程启动、停止、暂停、继续和查询服务的状态。 |
Windows shell 脚本的最简单形式是包含一条或多条命令的文本文件。Windows shell 脚本的缺省文件扩展名是 .bat 和 .cmd 。 清单2是一个简单 Windows shell 脚本的示例。
清单 2. Windows shell 脚本“Hello World”(hworld.bat)
2xN?9XL`,q0
@echo off
rem
rem This is a sample Windows Shell script.
rem
echo Hello World!
|
从 Windows shell 脚本调用 DB2 命令有两个基本方法:
- 从 Wshell 脚本调用 DB2 命令窗口
- 从 DB2 命令窗口运行 Wshell 脚本
从 Wshell 脚本调用 DB2 命令窗口ITPUB个人空间:Iw-l+s W%^hSv
'L
[? ~/I"W4`*h0清单3是一个使用 DB2 CLP 备份 sample 数据库的样本 Windows shell 脚本。该文件无需在 DB2 命令窗口中执行,因为它调用一个 DB2 命令窗口,然后将 DB2 备份数据库命令传递给它。环境变量 DB2INSTANCE 的值将缺省实例设置为“DB2”,也可以用 DB2 ATTACH 命令替换这个值。我将在后面向您演示这一点。
提示:因为 Windows shell 不支持指定的命令行参数,但我们可以用任意顺序将这些参数传递给脚本,所以将这些值显式地定义为脚本内的全局或局部变量是较常见的做法。
清单 3. 从 Windows shell 调用的 DB2 备份脚本(db2backup2.bat) ITPUB个人空间P9{q ]l8eZ
@echo off
rem
rem This is a Windows Shell Script that invokes a DB2 Command Window that
rem performs a database backup by calling the DB2 backup database command.
rem
set DB2INSTANCE=DB2
set DB2DATABASE=SAMPLE
title Starting database backup of %DB2DATABASE% on %date% at %time%...
DB2CMD.EXE -c -w -i DB2 BACKUP DATABASE %DB2DATABASE%
if not %errorlevel% == 0 (
echo Database backup of %DB2DATABASE% failed, RC=%errorlevel%
) else (
echo Database backup of %DB2DATABASE% completed on %date% at %time%.
)
|
从 shell 脚本内执行 DB2 命令窗口的优点是您不必从 DB2 命令窗口内执行 shell 脚本。该方法的缺点是每次调用 DB2 命令窗口时只能运行一条 DB2 命令。可以通过在单独的 DB2 脚本中放置数条 DB2 命令的方法绕开这一限制,并使用 -tf 开关执行 DB2 脚本,如 清单4所示。
清单4也是一个使用 DB2 CLP 备份 sample 数据库的 Windows shell 脚本。该文件无需在 DB2 命令窗口中执行,因为它调用一个 DB2 命令窗口,然后将包含多条 DB2 命令(包括备份数据库命令)的 DB2 脚本( db2backup.db2 ,如 清单5所示)传递给该命令窗口。
清单 4. 从 Windows shell 调用的 DB2 备份脚本(db2backup3.bat)
:IQ"k9u0WU0
@echo off
rem
rem This is a Windows Shell Script that invokes a DB2 Command Window that
rem performs a database backup by calling the DB2 backup database command
rem located in a db2 script file (db2backup.db2).
rem
set DB2INSTANCE=DB2
set DB2DATABASE=SAMPLE
title Starting database backup of %DB2DATABASE% on %date% at %time%...
DB2CMD.EXE -c -w -i DB2 -tf db2backup.db2 -l db2backup.log -r db2backup.rpt
if not %errorlevel% == 0 (
echo Database backup of %DB2DATABASE% failed, RC=%errorlevel%
) else (
echo Database backup of %DB2DATABASE% completed on %date% at %time%.
)
|
清单5显示了由 清单4中的 Windows shell 脚本执行的 DB2 脚本。
清单 5. DB2 备份脚本(db2backup.db2) ITPUB个人空间3d_hrnb
--
-- This is a sample DB2 Backup Script
--
ATTACH TO DB2;
BACKUP DATABASE SAMPLE;
DETACH;
TERMINATE;
|
从 DB2 命令窗口运行 Wshell 脚本ITPUB个人空间+?+mzu)_._
J6}
ITPUB个人空间W'vL:Rq;_(d
从 DB2 命令窗口内执行 Windows shell 脚本的优点是您可以在该 shell 脚本内调用多条 DB2 命令,而不必将它们置于单独的脚本中。这使您对每条单独的 DB2 命令有更好的执行控制。该方法的缺点是 shell 脚本的执行必须在 DB2 命令窗口内进行。通过从任一调度程序(包括 DB2 任务中心)执行 DB2 命令窗口并将 Windows shell 脚本传递给该窗口,就可以绕开这一限制,方法如下所示:
db2cmd.exe -c -w -i db2backup4.bat
|
在这一示例中,当 DB2 命令窗口退出时,调度程序将收到最终的返回码。
清单6是一个使用 DB2 backup database 命令备份 sample 数据库的样本 Windows shell 脚本。必须从 DB2 命令窗口内调用该脚本。
清单 6. 从 DB2 命令窗口内调用的 DB2 备份脚本(db2backup4.bat)
6b:_q
^b4h? ? j%D0
@echo off:
:---------------------------------------------------------------------------::
:: This is a Windows Shell Script that must be run inside a DB2 Command::
Window (db2cmd).
::---------------------------------------------------------------------------::
set SCRIPT_NAME=%~n0
set SCRIPT_VER=1.0
set DB2INSTANCE=DB2
set DB2DATABASE=SAMPLE
title %SCRIPT_NAME% v%SCRIPT_VER%
echo Starting database backup of %DB2DATABASE% on %date% at %time%...
DB2 BACKUP DATABASE SAMPLE
if not %errorlevel% == 0 (
echo Database backup of %DB2DATABASE% failed, RC=%errorlevel%
) else (
echo Database backup of %DB2DATABASE% completed on %date% at %time%.
)
|
如果您已经安装了 Windows 资源包,您可以按清单 7 所示更改脚本。这个版本的脚本使用 logevent 实用程序将信息和错误消息写到 Windows 事件日志而不是写到标准输出。
清单 7. 从 DB2 命令窗口调用的样本脚本(db2backup5.bat) ITPUB个人空间I@j)U2r%s {
@echo off
::---------------------------------------------------------------------------::
:: This is a Windows Shell Script that must be run inside a DB2 Command
:: Window (db2cmd). It uses the logevent utility from the Windows Resource
:: Kit to log information and error messages.
::---------------------------------------------------------------------------::
set SCRIPT_NAME=%~n0
set SCRIPT_VER=1.0
set DB2INSTANCE=DB2
set DB2DATABASE=SAMPLE
title %SCRIPT_NAME% v%SCRIPT_VER%
::---------------------------------------------------------------------------::
:: Backup Database (Requires Windows Resource Kit)
::---------------------------------------------------------------------------::
echo Starting database backup of %DB2DATABASE% on %date% at %time%...
logevent -s I -r %script_name% "Starting database backup of %DB2DATABASE% on
%date% at %time%...
"DB2 BACKUP DATABASE %DB2DATABASE%
if %errorlevel% == 0 (
echo Database backup of %DB2DATABASE% failed, RC=%
errorlevel%
logevent -s I -r %script_name% "Database backup of %DB2DATABASE%
failed, RC=%errorlevel% "
) else (
echo Database backup of %DB2DATABASE% completed on %date% at %time%.
logevent -s E -r %script_name% "Database backup of %DB2DATABASE%
completed on %date% at %time%."
)
|
调度任务ITPUB个人空间L[gRY r
ITPUB个人空间gk1mL]8vG
DB2 任务中心提供了用于调度作业的图形用户界面。该工具在 DB2 UDB V8.1 中已得到了显著的增强。它提供了创建新任务的向导,新任务可以是 DB2 脚本、操作系统脚本、MVS shell 脚本和 JCL 脚本。
和 DB2 命令中心一样,可以从文件导入脚本。DB2 任务中心允许您调度任务以使其在本地运行或在另一个 DB2 UDB 系统上远程运行。您可以定义任务完成时的定制返回码,还可以在发生故障时停止任务。您可以定义在任务成功或失败时要通知的联系人名单。DB2 任务中心还允许您按照图4所示的类别对任务进行分组,图 4 显示我们已经为导入的样本 DB2 备份脚本(清单1)创建了 DB2 Maintenance 类别。
图 4. DB2 任务中心ITPUB个人空间s4D"{o']F I RA:x
ITPUB个人空间'P!d$SC@3~jI
560)this.style.width=560;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" />
在 Windows 上,可以用以下任一方法启动 DB2 任务中心:
- Start -> Program -> IBM DB2 -> General Administration Tools -> Task Center
- 在 Windows shell 中输入命令
db2tc - 直接从 DB2 控制中心启动
脚本编制方案ITPUB个人空间4r\l'};SR}"@S
ITPUB个人空间!uMW5?lt(m4Xu
既然您已经了解 DB2 UDB 如何提供用于脚本编制的接口,并且知道如何从 Windows shell 访问这些接口以及如何用 DB2 任务中心调度脚本,那么让我们看几个可以用脚本使任务自动化的方案。这些方案包括当前没有自动化的任务,以及需要组合多种命令的任务,它们包括 DB2 命令、DB2 系统命令、操作系统特定命令和/或只能通过 DB2 系统命令使用的特性。让我们看看下面的示例:
- 归档诊断日志
- 收集 DB2 UDB 系统信息
- DB2 UDB 安全性和审计
归档诊断日志ITPUB个人空间*\(RWT)y'l C|p0W%^`
s{ s%OC-XL0可以用简单的 Windows Shell 脚本自动化的最简单任务之一是定期归档 DB2 诊断日志。每个 DB2 实例都使用 DB2 诊断日志文件编写与实例及实例内全部数据库相关的诊断信息。写入日志的信息的数量由实例配置参数 DIAGLEVEL 控制。将 DIAGLEVEL 设置成最高级别四(4)可以在问题确定期间提供极有价值的大量信息。但是,在这一级别,DB2 诊断日志很快会增长为吉字节大小的文件。
目前,DB2 不提供任何自动归档或修剪 DB2 诊断日志的工具。管理 DB2 诊断日志文件的策略之一是定期归档 DB2 诊断日志并使这些归档文件在一定的天数内随时可用。在给定的天数过后,就可以删除归档文件,因为已经在定期的系统备份期间将它备份到磁带上了。使用 Windows shell 脚本可以轻松地完成这一任务,如 清单8所示。
清单8. 归档 DB2 诊断日志脚本(db2arcdiag.bat) ITPUB个人空间W*G(?},WWQ!}~ e
@echo off
::---------------------------------------------------------------------------::
:: This is a Windows Shell Script to archive the db2 diagnostic log file. It
:: assumes the db2diag.log file is in the default diagnostic log directory
:: and renames it to db2diag.YYYYMMDD.log It also deletes all but the last
:: seven (7) of these diagnostic log archives.
::---------------------------------------------------------------------------::
set script_name=%~n0
set script_log=%~n0.log
set script_ver=1.0
set DB2INSTANCE=DB2
set DB2DATABASE=SAMPLE
title %script_name% v%script_ver%
echo %script_name% v%script_ver% started on %date% at %time%
::---------------------------------------------------------------------------::
:: Set Script Date Variable
::---------------------------------------------------------------------------::
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set script_date=%%l%%j%%k
)
::---------------------------------------------------------------------------::
:: Set DB2 Path Variable
::---------------------------------------------------------------------------::
if not defined db2path (
for /F %%i in ('db2set db2path') do (set db2path=%%i)
echo %script_name% v%script_ver% set db2path as %db2path%
)
set db2diag_path=%db2path%%db2instance%
echo %script_name% v%script_ver% set db2diag_path to %db2diag_path%
set db2diag_file=%db2diag_path%db2diag.log
echo %script_name% v%script_ver% set db2diag_file to %db2diag_file%
::---------------------------------------------------------------------------::
:: Archive DB2 Diagnostic Log File
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% archiving %db2diag_file% to
db2diag.%script_date%.log
ren %db2diag_file% db2diag.%script_date%.log 2> %script_log%
if not %errorlevel% == 0 (
echo ERROR: Unable to archive %db2diag_file% to db2diag.%script_date%.log,
RC=%errorlevel%
type %script_log%
)
::---------------------------------------------------------------------------::
:: Delete DB2 Diagnostic Log Archives 7 days or older
::---------------------------------------------------------------------------::
set db2diag_arch=%db2diag_path%db2diag.*.log
for /f "skip=7" %%i in ('dir %db2diag_arch% /b /o:-n') do (
echo %script_name% v%script_ver% purging %%i
del %db2diag_path%%%i 2> %script_log%
if not %errorlevel% == 0 (
echo ERROR: Unable to delete archive %%i, RC=%errorlevel%
type %script_log%
)
)
echo %script_name% v%script_ver% completed on %date% at %time%
|
以上 Windows shell 脚本假定 db2diag.log 文件位于缺省的 DB2 DIAGPATH 中,并根据脚本的执行日期将该文件归档(重命名)为 db2diag. YYYYMMDD.log 。然后,它删除七天或更旧的所有 db2diag. YYYYMMDD.log 文件。
ITPUB个人空间#]P(o^@/U;n