myfriend2010的博客
===========================================================
Windows上DB2 UDB脚本编制简介3
===========================================================
收集 DB2 系统信息

另一个可以用 Windows shell 和 DB2 命令迅速进行脚本编制的任务是相关系统、实例和数据库信息的收集。我们可以收集系统资源、DB2 注册表变量、实例和数据库配置参数以及数据库资源利用情况的快照。在开始对数据库系统作出更改之前,有这样一个脚本始终是很方便的。

清单 9. DB2 获取配置信息的脚本(db2getconf.bat)


@echo off
::---------------------------------------------------------------------------::
:: This is a Windows Shell Script to collect DB2 system information. The
:: information collected is stored in a file name with the following format:
:: <instance>.<database>.YYYYMMDD.HHMMSS.rpt 
::---------------------------------------------------------------------------::
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 ('echo %date%') do (
    set script_date=%%l%%j%%k
    )

::---------------------------------------------------------------------------::
:: Set Script Time Variable
::---------------------------------------------------------------------------::
for /F "tokens=1-4 delims=:. " %%i in ('echo %time%') do (
    set script_time=%%i%%j%%k
    )

::---------------------------------------------------------------------------::
:: Set Script Report File
::---------------------------------------------------------------------------::
set script_rpt=%db2instance%.%db2database%.%script_date%.%script_time%.rpt

::---------------------------------------------------------------------------::
:: Collect DB2 Services Configuration (Requires Windows Resource Kit)
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% collecting DB2 Services configuration...
echo DB2 Services Configuration > %script_rpt%
srvinfo | find "DB2" >> %script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect DB2 Services data, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Collect DB2 Registry Configuration
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% collecting DB2 Registry configuration...
echo DB2 Registry Configuration >> %script_rpt%
db2set -all >> %script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect DB2 Registry data, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Collect DB2 Database Administration Server (DB2DAS00) Configuration
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% collecting DB2DAS00 instance configuration...
db2 get admin cfg >> %script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect DB2DAS00 instance data, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Collect DB2 Instance Configuration
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% collecting %DB2INSTANCE% instance 
configuration...
db2 get dbm cfg >> %script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect %DB2INSTANCE% instance data, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Collect DB2 Database Configuration
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% collecting %DB2DATABASE% database 
configuration...
db2 get db cfg for sample >> %script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect %DB2DATABASE% database data, RC=%errorlevel%
   type %script_log%
   )

db2 connect to %DB2DATABASE%
if not %errorlevel% == 0 (
   echo ERROR: Unable to connect to %DB2DATABASE% database, RC=%errorlevel%
   type %script_log%
   )

db2 "select BUFFERPOOLID, BPNAME, NPAGES from SYSCAT.BUFFERPOOLS" >> 
%script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect %DB2DATABASE% database bufferpool data, 
RC=%errorlevel%
   type %script_log%
   )

db2 list tablespaces show detail >> %script_rpt% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to collect %DB2DATABASE% database tablespace data, 
RC=%errorlevel%
   type %script_log%
   )

db2 connect reset
if not %errorlevel% == 0 (
   echo ERROR: Unable to reset connection from %DB2DATABASE% database, 
RC=%errorlevel%
   type %script_log%
   )

echo %script_name% v%script_ver% completed on %date% at %time%

您甚至可以将这些信息存储在数据库的表中,这样这些信息就与数据库备份镜像保存在一起。定期地维护这些系统信息的历史记录可以为以后进行容量规划提供极有价值的帮助。

DB2 安全性审计

现在让我们看一个 DB2 系统命令的较好示例,该命令在用脚本语言进行自动化时非常有用。DB2 审计工具是一个实用程序,可以利用它充分地增强 DB2 实例和数据库安全性审计。它由名为 db2audit.exe 的 DB2 系统命令完全管理和控制。该命令使您能够全面地实现非常严格的 DB2 UDB 安全性审计实践。您可以配置、启动和停止安全性审计,并可以从该工具清除和抽取审计数据。这个过程是非常耗时的日常工作,但很容易用脚本语言使其自动化。例如,在您配置并启动 DB2 审计工具之后,您也许希望创建并调度一个脚本以定期地清除审计数据并将审计数据抽取到报告文件中。

清单 10. DB2 获取审计报告脚本(db2getaudit.bat)


@echo off
::---------------------------------------------------------------------------::
:: This is a Windows Shell Script to collect DB2 Audit Facility information.
:: You must first start the DB2 Audit Facility (db2audit start) and optionally
:: configure scope and status (db2audit configure scope all status both). It
:: flushes and extracts the audit data to the default DB2 Audit Facility
:: directory (sqllib<instance>security and then and renames the extracted
:: files to db2audit.YYYYDDMM.HHMMSS.rpt and prunes the DB2 Audit Log.
::---------------------------------------------------------------------------::
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 ('echo %date%') do (
    set script_date=%%l%%j%%k
    set prune_date=%%l%%j%%k
    )

::---------------------------------------------------------------------------::
:: Set Script Time Variable
::---------------------------------------------------------------------------::
for /F "tokens=1-4 delims=:. " %%i in ('echo %time%') do (
    set script_time=%%i%%j%%k
    set prune_hour=%%i
    )

::---------------------------------------------------------------------------::
:: Set DB2 Path Variable, DB2 Audit Path, and DB2 Audit Log
::---------------------------------------------------------------------------::
if not defined db2path (
   for /F %%i in ('db2set db2path') do (set db2path=%%i)
   echo %script_name% v%script_ver% set db2path to %db2path%
   )

set db2audit_path=%db2path%%db2instance%SECURITY
echo %script_name% v%script_ver% set db2audit_path to %db2audit_path%

set db2audit_file=%db2audit_path%db2audit.log
echo %script_name% v%script_ver% set db2audit_log to %db2audit_file%

::---------------------------------------------------------------------------::
:: Flush DB2 Audit Data to Log File 
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% flushing data to db2audit.log...
db2audit.exe flush 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to flush db2 audit data to log, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Extract DB2 Audit Data from Log File
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% extracting data from db2audit.log...
db2audit.exe extract 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to extract db2 audit data from log, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Rename DB2 Audit Out File (db2audit.YYYYMMDD.HHMMSS.rpt)
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% renaming db2audit.out file...
ren %db2audit_path%*.out *.%script_date%.%script_time%.rpt 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to rename db2 audit out file, RC=%errorlevel%
   type %script_log%
   )

::---------------------------------------------------------------------------::
:: Prune DB2 Audit Log File
::---------------------------------------------------------------------------::
echo %script_name% v%script_ver% pruning db2audit.log file...
db2audit.exe prune date %prune_date%%prune_hour% 2> %script_log%
if not %errorlevel% == 0 (
   echo ERROR: Unable to prune db2 audit file, RC=%errorlevel%
   type %script_log%
   )

echo %script_name% v%script_ver% completed on %date% at %time%

然后可以将数据导入或装入到安全性审计数据库,该数据库可以通过触发器和/或存储过程将警报通知自动转发给相应的管理员。

结束语

在本文中,我们已经知道正确维护 DB2 UDB 系统所需的全部管理任务如何依赖于 DB2 管理 API,还知道了如何使用 DB2 命令行工具和 DB2 系统命令从命令行界面执行数据库管理任务。我们演示了如何在 Windows shell 脚本中组合 DB2 命令、DB2 系统命令和操作系统命令,以便使其中的许多任务自动化。


myfriend2010 发表于:2007.10.30 16:18 ::分类: ( db2 ) ::阅读:(363次) :: 评论 (0)
===========================================================
Windows上DB2 UDB脚本编制简介2
===========================================================
可以将一些 DB2 系统命令编制成脚本以便简单地使它们已经提供的功能自动化。DB2 审计工具(db2audit.exe)就是可以通过脚本编制实现自动化的实用程序的典型示例。另一些 DB2 系统命令在单独使用时作用并不大,但与其它 DB2 命令或操作系统命令结合起来就非常有用。我将在本文的脚本编制方案一节向您演示一些示例。

Windows shell 脚本

Windows 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 资源包实用程序

命令 描述
choice通过显示提示并等待用户从一组键中选择,在批处理程序中提示用户作出选择。只能在批处理程序中使用该命令。
timethis测量系统运行给定命令所花的时间。
logtime记录批处理文件中命令行程序的启动或完成。这在对批处理作业(如邮件地址导入)计时和跟踪时很有用。
Uptime通过处理事件日志分析单一服务器以确定可靠性、可用性和当前运行时间。目标系统可以是本地系统,也可以是远程系统。
logevent该工具使您能通过命令提示符或批处理文件在本地或远程计算机上的事件日志中记录事件项。
netsvc您可以使用该工具从命令行远程启动、停止、暂停、继续和查询服务的状态。

Windows shell 脚本的最简单形式是包含一条或多条命令的文本文件。Windows shell 脚本的缺省文件扩展名是 .bat.cmd 。 清单2是一个简单 Windows shell 脚本的示例。

清单 2. Windows shell 脚本“Hello World”(hworld.bat)


@echo off
rem
rem This is a sample Windows Shell script.
rem
echo Hello World!

从 Windows shell 脚本调用 DB2 命令有两个基本方法:

  • 从 Wshell 脚本调用 DB2 命令窗口
  • 从 DB2 命令窗口运行 Wshell 脚本

从 Wshell 脚本调用 DB2 命令窗口

清单3是一个使用 DB2 CLP 备份 sample 数据库的样本 Windows shell 脚本。该文件无需在 DB2 命令窗口中执行,因为它调用一个 DB2 命令窗口,然后将 DB2 备份数据库命令传递给它。环境变量 DB2INSTANCE 的值将缺省实例设置为“DB2”,也可以用 DB2 ATTACH 命令替换这个值。我将在后面向您演示这一点。

提示:因为 Windows shell 不支持指定的命令行参数,但我们可以用任意顺序将这些参数传递给脚本,所以将这些值显式地定义为脚本内的全局或局部变量是较常见的做法。

清单 3. 从 Windows shell 调用的 DB2 备份脚本(db2backup2.bat)


@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)


@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)


-- 
-- This is a sample DB2 Backup Script 
--
ATTACH TO DB2;
BACKUP DATABASE SAMPLE;
DETACH;
TERMINATE;

从 DB2 命令窗口运行 Wshell 脚本

从 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)


@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)


@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%."   
)

调度任务

DB2 任务中心提供了用于调度作业的图形用户界面。该工具在 DB2 UDB V8.1 中已得到了显著的增强。它提供了创建新任务的向导,新任务可以是 DB2 脚本、操作系统脚本、MVS shell 脚本和 JCL 脚本。

和 DB2 命令中心一样,可以从文件导入脚本。DB2 任务中心允许您调度任务以使其在本地运行或在另一个 DB2 UDB 系统上远程运行。您可以定义任务完成时的定制返回码,还可以在发生故障时停止任务。您可以定义在任务成功或失败时要通知的联系人名单。DB2 任务中心还允许您按照图4所示的类别对任务进行分组,图 4 显示我们已经为导入的样本 DB2 备份脚本(清单1)创建了 DB2 Maintenance 类别。

图 4. DB2 任务中心

任务中心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 控制中心启动

脚本编制方案

既然您已经了解 DB2 UDB 如何提供用于脚本编制的接口,并且知道如何从 Windows shell 访问这些接口以及如何用 DB2 任务中心调度脚本,那么让我们看几个可以用脚本使任务自动化的方案。这些方案包括当前没有自动化的任务,以及需要组合多种命令的任务,它们包括 DB2 命令、DB2 系统命令、操作系统特定命令和/或只能通过 DB2 系统命令使用的特性。让我们看看下面的示例:

  • 归档诊断日志
  • 收集 DB2 UDB 系统信息
  • DB2 UDB 安全性和审计

归档诊断日志

可以用简单的 Windows Shell 脚本自动化的最简单任务之一是定期归档 DB2 诊断日志。每个 DB2 实例都使用 DB2 诊断日志文件编写与实例及实例内全部数据库相关的诊断信息。写入日志的信息的数量由实例配置参数 DIAGLEVEL 控制。将 DIAGLEVEL 设置成最高级别四(4)可以在问题确定期间提供极有价值的大量信息。但是,在这一级别,DB2 诊断日志很快会增长为吉字节大小的文件。

目前,DB2 不提供任何自动归档或修剪 DB2 诊断日志的工具。管理 DB2 诊断日志文件的策略之一是定期归档 DB2 诊断日志并使这些归档文件在一定的天数内随时可用。在给定的天数过后,就可以删除归档文件,因为已经在定期的系统备份期间将它备份到磁带上了。使用 Windows shell 脚本可以轻松地完成这一任务,如 清单8所示。

清单8. 归档 DB2 诊断日志脚本(db2arcdiag.bat)


@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 文件。


myfriend2010 发表于:2007.10.30 16:16 ::分类: ( db2 ) ::阅读:(313次) :: 评论 (0)
===========================================================
Windows上DB2 UDB脚本编制简介
===========================================================

除了提供对结构化查询语言(Structure Query Language,SQL)的支持外,IBM® DB2® Universal Database™ 还提供一组丰富且广泛的管理应用程序编程接口(API)。因为正确维护 DB2 UDB 系统所需的所有日常任务都依靠 DB2 管理 API,所以这些 API 就为 DB2 UDB 的管理提供了一个编程接口。

例如,DB2 控制中心(Control Center)就是一个调用 DB2 管理 API 来执行 DB2 系统、实例和数据库管理任务的基于 Java 的图形用户界面(GUI)工具。DB2 UDB 还提供了象 DB2 CLP 这样的命令行工具来执行类似任务,这些工具也调用 DB2 管理 API。

除了 DB2 UDB 命令行工具,DB2 通用数据库还提供一组丰富的系统实用程序,称为 DB2 系统命令。这些命令通常被用来执行尚未集成到 GUI 工具的任务。通常从操作系统的 shell(如 Windows shell — Wshell),也称为命令提示符,调用 DB2 UDB 系统命令。

您可以在几乎所有的脚本语言(从简单的 Windows shell 脚本到用 JScript、VBScript、Object REXX 或 PerlScript 编写的较复杂脚本)中将 SQL、DB2 命令、DB2 UDB 系统命令和操作系统命令结合起来,以便使简单重复的任务自动化或调度这些任务,从而形成更复杂的任务或您能想到的任何 DB2 管理任务。

一般说来, 脚本(scripting)指的是一种被解释的语言。脚本在文本文件中创建,执行后编译成汇编程序或字节代码。Windows 提供了几种环境,它们可用于执行脚本编制语言。其中,执行系统管理任务最常用的两个环境是 Windows shell(Wshell)和 Windows Scripting Host(WSH)。

本文描述在 Windows 平台上可用于 DB2 UDB 的几种不同的脚本编制接口,首先将概述 DB2 管理 API、DB2 命令行工具和 DB2 系统命令。我将向您介绍用 Windows shell 编制 DB2 UDB 脚本的最佳技术,并提供可从本网站下载的几个有用示例。

DB2 管理 API

作为 DB2 UDB for Linux、UNIX® 和 Windows 的一部分,DB2 管理 API 一直包含在 DB2 UDB 中,有文档记录并得到支持。随着 DB2 UDB 不断提供其它功能,如分割镜像(Split Mirror Images),API 集也随之继续扩展以支持这些特性。用这些 API 编程的样本源代码也和 DB2 UDB 的开发者版本一起提供。

DB2 管理 API 正式支持以下编程语言:

  • C/C++
  • COBOL
  • Fortran
  • REXX

由于象 Java、Perl 和 Visual Basic 这样的编程语言(随便列举几个)不断涌现,所以这份列表可能乍一看显得相当短。但是,大多数编程语言都可以调用用其它语言编写的 API,其中 C API 受到最普遍的支持。除了可以通过 C、COBOL、FORTRAN 和 REXX 直接访问 DB2 管理 API 之外,还可以通过其它方法间接访问这些 API,譬如通过 Java 本机接口(Java Native Interface,JNI)。事实上,现今与 DB2 UDB 一起提供的 DB2 管理工具几乎全都是用 Java 编写的,而 Java 却不在 DB2 管理 API 正式支持的编程语言的简短列表上。DB2 控制中心使用 IBM 开发的 Java 本机接口(JNI)访问这些 API。

对于那些不能直接访问 DB2 管理 API 的编程语言和脚本语言(如 VBScript、Jscript 和 Perl),还有另一种方法。DB2 CLP 作为命令行界面,可通过 DB2 命令(DB2 Command)提供对几乎所有 DB2 管理 API 功能的间接访问。

DB2 UDB 命令行工具

DB2 UDB 命令行工具是 DB2 UDB 的组件,这些工具支持对 DB2 命令以及 SQL 语句的处理。在 Windows 上可使用三种命令行工具:

  • DB2 命令中心(Command Center)
  • DB2 命令行处理器(CLP)
  • DB2 命令窗口

您可以通过单击 Start -> Programs -> IBM DB2 -> Command Line Tools找到这些工具。

DB2 命令中心

第一个命令行工具是 DB2 命令中心(图1),它提供一个处理命令和 SQL 语句的 GUI。您可以用交互方式或脚本(批处理)方式工作,或者将两种方式结合使用。通过单击 Start -> Programs -> IBM DB2 -> Command Line Tools -> Command Center启动 DB2 命令中心。

图 1. DB2 命令中心

DB2 命令中心560)this.style.width=560;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" />

图1是 DB2 命令中心的抓屏。在本例中,我们导入了如清单1所示的样本 DB2 备份脚本。您可以通过从 Script菜单选择 Import来导入脚本。

DB2 命令行处理器(CLP)

一般而言,可以把 DB2 命令行处理器(CLP)当作用于调用 DB2 命令的 DB2 提示符 DB2 => ,就象 Windows 命令提示符 C: 用于调用操作系统命令一样。也可以从任一 DB2 命令行工具调用 DB2 系统命令(稍后讨论)和操作系统命令,只要在命令前加一个感叹号 ! 即可。

图2显示了 DB2 CLP 以及关于如何获取 DB2 命令帮助的一些基本信息。单击 Start -> Programs -> IBM DB2 -> Command Line Tools -> Command Line Processor,启动 DB2 CLP。

图 2. DB2 命令行处理器

命令行处理器560)this.style.width=560;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" />

要了解有关 DB2 UDB V8.1 中 DB2 CLP 新增功能的更多信息,请阅读 Paul C. Zikopoulos 撰写的 DB2 开发者园地文章定制DB2 通用数据库命令行处理器。

DB2 命令窗口

您可以把 DB2 命令窗口看成一个 DB2 shell( db2cmd.exe ),它扩展 Windows shell( cmd.exe )以提供对 DB2 命令和 SQL 语句的支持。在 DB2 命令窗口中输入的命令必须是以大写、小写或大小写结合的 DB2 开头。操作系统命令(如 dir )直接被传递到 Windows shell(cmd.exe),不需要感叹号( ! )。

DB2 CLP 与 DB2 命令窗口的主要区别在于 CLP 提供 DB2 命令提示符 DB2 => ,而 DB2 命令窗口提供 Windows 命令提示符,DB2 命令和操作系统命令都可以在其中输入。在 Windows 上用 DB2 命令窗口可以最有效地执行 DB2 UDB 脚本编制,因为它方便地支持对 SQL 语句、DB2 命令、DB2 系统命令和操作系统命令的调用。

提示:如果您试图从 Windows shell 直接运行 DB2 命令,您将得到以下错误消息:


 DB21061E  Command line environment not initialized. 

这表明这种 shell 不能处理 DB2 命令。您只需通过输入 db2cmd.exe 来启动 DB2 命令窗口,以初始化命令环境即可。

您可以设置几种选项来更改 DB2 CLP 的缺省行为。您可以通过输入 list command options 命令获取这些选项的列表,如图3所示。从 DB2 命令窗口调用 DB2 脚本最常用的几个选项将在下面的示例中演示。

图 3. DB2 命令窗口和选项
命令窗口和选项560)this.style.width=560;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/" />

有关使用 DB2 CLP 编制 SQL 和 DDL 语句脚本的更多信息,请阅读 Blair Adamache 撰写的 DB2 开发者园地文章DB2 的命令行处理器和脚本编制。DB2 命令选项在 DB2 UDB Command Reference 中也有详细的文档记录。

尽管 DB2 脚本可以包含 SQL 语句、DB2 系统命令和操作系统命令,但它只是有一个或多个 DB2 命令的文本文件。虽然不是必需的,但通过使用适当的文件扩展名形成一个标准的 DB2 脚本命名约定通常是个很好的方法。 表1显示了几种最常用的文件扩展名。

表 1. 脚本的常用文件扩展名

文件扩展名 描述
.db2包含 DB2 命令的 DB2 脚本
.ddl包含数据定义语言(DDL)语句的 DB2 脚本
.sql包含 SQL 语句的 DB2 脚本

作为说明之用, 清单1包含一个非常简单的 DB2 脚本,该脚本使用数个 DB2 命令备份 sample 数据库。可以从任一 DB2 命令行工具执行该脚本。本文中用到的全部脚本都可以下载。这些脚本使用缺省的 DB2 实例(DB2)和样本数据库(SAMPLE)。其中的一些脚本将要求您安装 Windows 资源包(Windows Resource Kit)。

清单 1. 备份 sample 数据库的样本 DB2 脚本(db2backup.db2)


-- 
-- This is a sample DB2 Backup Script 
--
ATTACH TO DB2;
BACKUP DATABASE SAMPLE;
DETACH;
TERMINATE;

您可以使用以下语法从 DB2 命令窗口执行以上 DB2 脚本:


db2 -tvf db2backup.db2 -l db2backup.log -r db2backup.rpt

在上面的示例中,使用了以下 DB2 命令选项来执行 DB2 脚本文件( db2backup.db2 ):

-t 指明在缺省情况下用分号(;)终止每条命令
-v 指明应将每条命令显示到标准输出
-f 指明从输入文件读取命令
-l 指明将命令记录到输出文件中
-r 指明将结果保存到报告文件中

使用 -l 选项将所有 DB2 命令记录到日志文件( db2backup.log )并且使用 -r 选项将命令的输出保存到报告文件( db2backup.rpt ),这始终是一个很好的方法。这两个选项的区别在于:

  • -l 选项记录每条命令的开始和结束并记录日期和时间
  • -r 选项将每条命令的输出保存到文件中。

同时使用这两个选项可以让您利用报告文件查看脚本的执行摘要,并利用日志文件查看每条命令的详细信息。

也可以从 Windows shell 调用 DB2 命令窗口本身,只需从 Windows shell(命令提示符)输入 db2cmd 即可。它有一些有用的开关,可以在调用它时向它传递这些开关。 表2描述了这些选项:

表 2. DB2 命令窗口的选项

开关 描述
-c执行 DB2 命令窗口,然后终止。
-w一直等到 DB2 命令窗口终止。
-i从进行调用的 shell 继承环境。
-t从进行调用的 shell 继承标题。

通过首先调用 DB2 命令窗口,您可以从任一 Windows shell 执行清单1中的脚本,如下面的示例所示:


db2cmd -c -w -i db2 -tvf db2backup.db2 -l db2backup.log -r db2backup.rpt

DB2 命令窗口提供所执行的每条命令的返回码。 表3列出了返回码。

表 3. DB2 CLP 返回码

代码 描述
0成功执行 DB2 命令或 SQL 语句
1SELECT 或 FETCH 语句没有返回任何行
2DB2 命令或 SQL 语句警告
4DB2 命令或 SQL 语句错误
8命令行处理器系统错误

:如果您正用交互方式执行语句,那么 DB2 CLP 不会提供每条命令的返回码。

DB2 系统命令

DB2 系统命令是一组命令行实用程序,您可以用来执行那些由于种种原因尚未集成到 DB2 控制中心或其它 GUI 工具的任务。通常从操作系统 shell(如 Windows 命令提示符)调用 DB2 系统命令,但也可以从 DB2 命令中心、DB2 任务中心、DB2 CLP、DB2 命令窗口,当然还可以从您惯用的脚本语言调用。

有近百条 DB2 系统命令可用。请参阅 DB2 Command Reference以获得这些命令的完整列表,以及详细的文档。通读 DB2 UDB 修订包发行说明以查找新的 DB2 系统命令始终是个很好的方法,因为常常都是通过修订包添加新命令或增强现有命令的。

表4是一个非常简短的列表,它列出了一些比较常用的 DB2 系统命令,这些命令在脚本编制时非常有用。乍一看,其中的一些命令可能看起来不太象脚本编制命令,因此提供了对命令的描述,以使您清楚如何在脚本中使用它们。

表 4. DB2 系统命令的示例

命令 描述
db2auditDB2 提供一个审计工具来帮助检测对数据未知或不曾预料的访问。可利用该实用程序使安全性审计自动化,如脚本编制方案所述。
db2batch从平面文件或标准输入读取 SQL 语句,动态地准备并描述语句,然后返回结果集。在设计用于对不同实例和数据库配置参数进行基准测试的脚本中,可使用这一 DB2 命令。在调用该实用程序之前,要重新启动实例并捕获系统信息,如 DB2 注册表、实例和数据库配置。
db2exfmt格式化说明表的内容。在设计用于 SQL 调优的脚本中,可使用这一 DB2 命令,因为可以用它自动化 SQL 语句的解释、抽取和格式化。用这一 DB2 命令进行脚本编制可允许解释、抽取和格式化大量的 SQL 语句以供以后复查。
db2chkbk该实用程序可用于测试备份镜像的完整性,并确定是否可以复原该镜像。当在数据库备份脚本的末尾要生成备份完成报告时,该实用程序将非常有用。
db2flsn返回数据库事务日志文件的名称,该文件包含由指定的日志顺序号(LSN)标识的日志记录。当为了恢复而启用日志保留,而且您正在运行数据复制并需要确定在何处开始修剪事务日志时,这一实用程序作为数据库事务日志修剪脚本的一部分将非常有用。


myfriend2010 发表于:2007.10.30 16:07 ::分类: ( db2 ) ::阅读:(251次) :: 评论 (0)
===========================================================
探讨SQL语句技巧 优化DB2应用程序性能
===========================================================
本文以IBM的关系数据库管理系统DB2 Universal Database(通用数据库) 版本7.1为背景,与大家共同探讨编写好的SQL语句的技巧,以求DB2应用程序以求DB2应用程序获得更优的性能。

  当我们设计一个新的或分析一个现存的系统时,其中所要考虑的一个重要问题就是应用程序的设计问题。即使数据库设计得很好而且还经过优化处理,应用程序设计不适当还是会引起性能问题的 数据库。实践证明,如果应用程序存在设计上的问题,那么修改这些问题比调整数据库配置参数更能改善应用程序的性能。

  例如,SQL是一种高级语言,具有很大的灵活性,从数据库中提取相同的数据可以用不同形式的SELECT语句来实现,但是,应用程序的性能却随着SELECT语句形式的不同而大相径庭,这是因为不同形式的SELECT语句具有不同的处理成本。在这种情况下,我们就应该选择那些处理成本低廉的SELECT语句,这样,应用程序才会有较好的性能。

  DB2通用数据库本身提供一个SQL编译器,该编译器创建编译后的SQL语句,当该编译器编译SQL语句时,它将重新编写这些SQL语句,以生成一种更容易对其进行优化的形式,这个过程称之为“查询重写(query rewrite)”。

  然后,SQL编译器产生许多满足用户查询要求的、可选的执行方案,并根据表、索引、列和函数的统计数字来评估每个方案的执行成本,最后,从中选取执行成本最低的方案,该过程称之为“查询优化(query optimization)”。

  有一点很重要,需要我们注意,那就是不管存取方案的优劣,SQL编译器(包括查询重写和优化两个阶段)必须从中选择一个,以产生满足应用程序查询要求的结果集,因此,我们在编写查询代码时,只应查询我们需要的数据,不需要的数据就不要查询,这样做的目的是确保SQL编译器能够选择一个最好的存取方案。

  编写SELECT语句时一般遵循以下七个方面的准则:

  1、在SELECT列表中仅仅指明需要的列

  我们在编写SELECT语句时,尽管有时候不需要用到表中所有的字段,但还是习惯用*(表示引用表中所有的字段)来指定表中所有的列,这样做在编程上确实很简单、方便,但这么做的后果是应用程序返回一些我们不需要的列,系统做一些不必要的处理,做一些无用功,徒耗系统宝贵的软、硬件资源,尤其当表中有很多字段时,这种浪费现象就越加明显;而且,这也不是良好的编程习惯,我们不应提倡。

  2、使用谓词来限制返回的行数

  在SQL编程语言中,按照评估过程中如何使用谓词、何时使用谓词,我们将谓词划分为四大类(这四类谓词各自有不同的处理成本),按性能由高至低排列如下:

  • 范围界定谓词
  • 索引参数谓词
  • 数据参数谓词
  • 剩余谓词

  范围界定谓词是指那些限定索引扫描范围的谓词,它们为索引搜索提供键值的起始值和/或终止值。索引参数谓词不用于界定搜索范围,但可以根据索引对它进行评估,因为谓词中的列是索引中的一部分。例如,假设表staff中的索引定义在name,dept和years三个字段上,执行下面的SELECT语句:

  SELECT name,job,salary FROM staff
  WHERE name=’John’
  dept=10
  years>5

  头两个谓词(name=’John’和dept=10)是范围界定谓词,而years>5是索引参数谓词,因为单凭上述信息我们无法确定键years的起始值是多少,起始值可以是6,8,10,甚至更大。如果years的谓词是years>=5,那么,它就是范围界定谓词了,因为索引搜索可以从5开始。

  数据库管理器在评估这些谓词的时候将利用索引数据,而不是读取数据库中的基本表。这些范围界定谓词和索引参数谓词通过减少需要从表中读取的行的数目来减少存取的数据页的数目。索引参数谓词不影响被存取的索引页的数目。

  数据参数谓词是那些不能被索引管理器评估,却能被数据管理服务(DMS)评估的谓词。通常,这种谓词需要从基本表中存取个别行,如果需要的话,数据管理服务还会提取需要的列来评估该谓词。

  例如,假设索引定义在表project的projno列上,而不是deptno列上,执行下面的查询:

  SELECT projno,projname,repemp FROM project
  WHERE deptno=’D11’
  ORDER BY projno

  谓词“deptno=’D11’”是数据参数谓词,因为没有索引定义在deptno列上,必须存取基本表来评估该谓词。

  剩余谓词是指那些除了对基本表进行简单的存取操作之外,还要进行I/O操作的谓词,包括使用子查询的谓词(子查询中带有ANY,ALL,IN或SOME),以及读取LONG VARCHAR或大对象(LOB)数据的谓词(在DB2中,LONG VARCHAR、大对象和表是分开存放的)。

  剩余谓词是用关系数据服务(RDS)来进行评估的,而且,它在这四类谓词中成本最昂贵。由于相对范围界定谓词和索引参数谓词来说,剩余谓词和数据参数谓词的成本比较高,所以,我们应该尽可能地限制范围界定谓词和索引参数谓词界定的行数。

  我们来看一下DB2的组件:索引管理器,数据管理服务和关系数据服务。图1显示DB2的各个组件和处理这四类谓词的位置。

  

  图1 DB2 UDB组件和谓词

  其实,DB2组件很多,图1只是一个简化后的示意图。

  关系数据服务(RDS)从应用程序那里接收到SQL请求,并返回结果集;除了剩余谓词外,RDS将所有谓词都发送给数据管理服务(DMS);剩余谓词由RDS进行评估。

  DMS评估数据参数谓词。如果SELECT列表中存在一些不能由索引搜索进行评估的列,那么,DMS就会直接扫描数据页。

  索引管理器从DMS那里接收、评估范围界定谓词和索引参数谓词,然后,将数据页的行标识符(RID)返回给DMS。

  了解各种谓词的定义、转换条件及其使用场所,对我们深入剖析应用程序,提高应用程序性能是有所裨益的。

  3、指定FOR UPDATE子句

  如果想更新提取的数据,我们应该在游标定义的SELECT语句中指定FOR UPDATE子句。这样做的好处在于,数据库管理器在开始的时候就可以选择适当的加锁级别,例如,使用U(更新)锁,而不是S(共享)锁,这样,当处理后续的UPDATE语句时,就可以省去从S锁转换到U锁的开销了。

  指定FOR UPDATE子句的另外一个好处是可以减少应用程序的死锁机会。死锁是这样一种情形:一个以上的应用程序等待另外一个应用程序释放对数据的锁定,而那些等待的应用程序正占据着另外应用程序所需要的数据,并且对该数据也进行了锁定。我们假设两个应用程序按下列顺序同时对同一行进行提取、更新操作:

  (1)应用程序1提取该行

  (2)应用程序2提取该行

  (3)应用程序1更新该行

  (4)应用程序2更新该行

  在第4步,应用程序2将等待应用程序1完成更新操作,还要等应用程序1释放占据锁定,然后才能开始应用程序2的更新操作。可是,当我们声明一个游标时不指定FOR UPDATE子句,应用程序1就会获得并占据一个S(共享)锁定,对该行加锁(第1步),这意味着第二个应用程序用不着等待也可以获得并占据一个S锁(第2步)。然后,第一个应用程序试图获得一个U(更新)锁以处理更新语句,但是它必须等第二个应用程序释放其正占据着的S锁(第3步)。同时,第二个应用程序也试图获得一个U锁,并且由于第一个应用程序占据着S锁而进入等待状态(第4步)。这种情形就是死锁,造成的后果是应用程序1或应用程序2的交易不得不回滚。

  如果在DECLARE CURSOR语句中指定FOR UPDATE子句,当应用程序1提取该行时,将会给该行加上U锁,应用程序2将会等待应用程序1释放U锁,这样,两个应用程序之间就不会发生死锁了。

  下面举例说明如何在SELECT语句中使用FOR UPDATE子句。

  EXEC SQL DECLARE c1 CURSOR FOR SELECT * FROM employee
  FOR UPDATE OF job;
  EXEC SQL OPEN c1;
  EXEC SQL FETCH c1 INTO …;
  If(strcmp(change,“YES”)= =0)
  EXEC SQL UPDATE employee SET job = :newjob
  WHERE CURRENT OF c1;
  EXEC SQL CLOSE c1;

  对于CLI编程,我们可以使用函数SQLSetConnectAttr()将DB2 CLI的连接属性SQL_ATTR_ACCESS_MODE的值设置为:SQL_MODE_READ_WRITE,效果是一样的。

  4、指定OPTIMIZE FOR n ROWS子句

  当我们希望提取的行数远远小于可能返回的行数时,在SELECT语句中指定OPTIMIZE FOR n ROWS子句。基于提取n行的假设,OP

  TIMIZE FOR子句会影响查询的优化,同时也决定了通讯缓冲区中行的数目。

  SELECT projno,projname,repemp FROM project
  WHERE deptno=’D11’ OPTIMIZE FOR 10 ROWS

  运用行的分块技术,通过在单一操作中一次性地提取一组行来减轻管理器的负担,这些行存储在缓冲区中,应用程序中的每一个FETCH请求都会从该缓冲区中提取下一行,如果指定OPTIMIZE FOR 10 ROWS,那么,系统会以10行为一组返回给用户。数据库

  需要注意的是,OPTIMIZE FOR n ROWS子句既不会限制可以提取的行数,也不会影响提取的结果,但是,该子句会影响应用程序的性能,如果最终提取的行数小于或等于n,该子句会改善性能;否则,如果大于n,性能就会下降。

  5、指定FETCH FIRST n ROWS ONLY子句

  如果不希望应用程序提取n行以上的记录,我们可以在编程时指定FETCH FIRST n ROWS ONLY子句;反之,如果不指定该子句,结果集中可能就会有很多行(大于n)。注意,该子句不能与FOR UPDATE子句同时使用。

  参看下面的例子,程序最多能提取5行。

  SELECT projno,projname,repemp FROM project
  WHERE deptno=’D11’
  FETCH FIRST 5 ROWS ONLY

  该子句同OPTIMIZE FOR n ROWS子句一样,也决定通讯缓冲区中行的数目;如果同时指定FETCH FIRST n1 ROWS ONLY子句和OPTIMIZE FOR n2 ROWS子句,则取n1和n2二者中的较小值作为通讯缓冲区的大小。

  6、指定FOR FETCH ONLY子句

  如果不想更新那些由SELECT语句提取的行,我们可以在SELECT语句中指定FOR FETCH ONLY子句,这么做的好处是,处理应用程序提出的查询请求时可以充分利用行的分块技术,进而改善性能;该子句还能改善数据的并发性,因为使用该子句查询的那些行上不再有独占的锁了。除了FOR FETCH ONLY子句,我们还可以使用FOR READ ONLY子句,二者是同义词,功效一致。

  7、避免数据类型转换

  我们应尽可能地避免数据类型的转换,特别是数字的数据类型之间的转换。当比较两个值时,使用具有相同数据类型的项目进行比较效率会更高。例如,有两张表:A和B,使用A的A1列和B的B1列进行两表间的连接操作,如下所示:

  SELECT * FROM A,B
  WHERE A1=B1

  如果列A1和B1的数据类型一致,则无需进行数据类型转换;如果不一致,那么,应用程序就会在运行时进行数据类型的转换以比较二者的数值大小,从而影响应用程序的性能。例如,如果A1列的数据类型是decimal,而B1是integer,并且都有一个数值“123”,那么这时就需要进行数据类型转换了,因为表A将“123”存储为“123C”(十六进制表示),而表B存储为“7B”(十六进制表示)。

  再者,进行数据类型转换时,由于计算精度的限制,可能会导致错误的发生。

  DB2 UDB提供许多数据类型,其中,有用于数字数据的SMALLINT,INTEGER,BIGINT,DECIMAL,REAL,DOUBLE;有用于字符数据的CHAR,VARCHAR,LONG VARCHAR,CLOB;也有用于双字节字符数据的GRAPHIC,VARGRAPHIC,LONG VARGRAPHIC和DBCLOB,等等。由于数据库的存储容量和各种变量的处理成本都取决于数据类型,所以,我们在编程时如何选择适当的数据类型就显得十分重要,以下是选择数据类型时应该遵循的一些准则:

  ● 对于比较短的列,尽量使用定长的CHAR而不是变长的VARCHAR。虽然,当数据的长度参差不齐时,VARCHAR可以节省数据库存储空间,但是系统需要花费额外的开销去检查每个数据的长度。

  ● 尽量使用VARCHAR或VARGRAPHIC而不是LONG VARCHAR或LONG VARGRAPHIC。VARCHAR列和LONG VARCHAR列的最大长度差不多,基本一致,VARCHAR列的最大长度是32672字节,LONG VARCHAR列的最大长度是32700字节;同样地,VARGRAPHIC列和LONG VARGRAPHIC列的最大长度也相仿,VARGRAPHIC是16336字节,LONG VARGRAPHIC是16350字节。对于LONG VARCHAR列和LONG VARGRAPHIC列有一些限制,比如,这两列中的数据不能存储在数据库缓冲池中。

  ● 如果不需要小数部分,则尽量使用整数(SMALLINT,INTEGER,BIGINT)而不是浮点数(REAL或DOUBLE)或十进制数(DECIMAL)。比较而言,整数的处理成本要廉价得多。

  ● 尽量使用日期--时间(DATE,TIME,TIMESTAMP)而不是字符(CHAR)。日期--时间数据类型会占用较少的数据库存储空间,而且,对于日期--时间数据类型的变量,我们还可以利用系统提供的一些内置函数(如YEAR,MONTH)对其进行计算、转换等处理,一般来说,内置函数要比我们手工编写的函数在性能、效率上都要高一些。

  ● 尽量使用数字的数据类型而不是字符的数据类型。

  凡事都是一分为二,有利有弊的,我们不能既想节省数据库的存储空间,又希望降低应用程序的处理成本,二者只能取其一,不可兼得,这就要求我们在编程时不能仅局限于一点,应该通盘考虑整个应用程序的设计,综合评估,权衡利弊,以求应用程序的性能更优。

  结束语

  一谈起数据库性能调整、优化,我们脑海中往往就会有这样的概念:优化是系统维护时做的事情,属于后期制作。其实不然,早在编程时就已经存在性能优化的问题了。本文就编写SQL语句时应该注意的一些问题阐述一下笔者的观点,不当之处还请大家批评指正。


myfriend2010 发表于:2007.10.27 15:29 ::分类: ( db2 ) ::阅读:(305次) :: 评论 (0)
===========================================================
DB2 中游标的使用以及 存储过程的写法
===========================================================
问题1:
什么时候才会发生not found异常 ,以及db2中sqlcode的值是如何变化的?
在db2中,一条select 语句也有可能发生not found异常,譬如
declare sqlcode integer default 0;
declare sql_code integer default 0;
declare classCode varchar(40) ;
select app_class_code into classCode from kf_app_class where app_name='无效记录';
set sql_code=sqlcode;
如果此时没有检索到记录,那么sqlcode的值为100,有的话为0;
我们可以定义NOT FOUND 异常处理

declare sqlcode integer default 0;
declare sql_code integer default 0;
declare classCode varchar(40) ;
begin
declare continue handler for not found
begin
--注如果发生not found那么此时的sqlcode必定为100
set sql_code=sqlcode;/*在这里sqlcode的值为100;*/
--如果再次得到sqlcode的值那么它的值变为0
set sql_code=sqlcode;/*这里sqlcode变成了0,因为上一条语句执行成功了,那么sqlcode变成了0*/
end;
select app_class_code into classCode from kf_app_class where app_name='无效记录';
set sql_code=sqlcode;/*同理此时如果没有取到数据,那么会进declare continue handler ,返回后sqlcode的值也为0*/
end;
所以我们可以通过两种方法来捕获和处理not found
方法1:

begin
declare continue handler for not found
begin
--异常处理代码
end;
sql语句
end;
方法2:

begin

sql语句
if sqlcode=100 then
--异常处理代码
end if;
end;
问题2:
定义了游标,怎么fecth一条记录,怎么进行循环?
Q:定义了游标假设发生not found 异常,那么是在open cursorName的时候还是在fecth的时候发生异常?
A:检验游标中的数据是否取完或者有无记录,应该在fecth的时候,而不是发生在open cursorName的时候,
下面一个例子详细的说明了游标使用过程

begin
declare sqlcode integer default 0;
declare app_code varchar(10);
declare cursor1 cursor for select app_code from kf_app_class ;
open cursor1;
cursorLoop:
loop
fecth cursor1 into app_code ;
if sqlcode=100 then leave cursorLoop;
end if;
end loop;
end;

Q:sqlcode 可以直接用吗?
A:在db2中,如果要使用sqlcode那么必须在使用前declare;
譬如
declare sqlcode integer default 0;
if sqlcode =? then
end if;
附注
db2的其他异常处理

对应 oracle的 when other exceptions

declare exit handler for sqlwaring,sqlexcption
begin
--处理异常
end;

当程序执行exit handler异常处理后,那么会退出程序,不会在接着执行,也就是


declare exit handler for sqlwaring,sqlexcption
begin
--处理异常
end;
sql语句1;
sql语句2;
执行sql语句1发生异常,会进入 exit handler ,然后退出程序,不会在执行 sql语句2
myfriend2010 发表于:2007.10.24 14:27 ::分类: ( db2 ) ::阅读:(753次) :: 评论 (0)
===========================================================
unix常用命令续
===========================================================
ARJ 流行的文件压缩/归档工具,可以用于 UNIX/LinuxDOS/Windows 和其它操作系统。用这种方式压缩的文件的扩展名通常是 .arj .ar 后台进程(Background Process 运行时无须用户输入的程序。可以在诸如 UNIX/Linux 之类的多任务操作系统上运行多个后台进程,而用户则与前台进程交互(例如,数据输入)。有些后台进程(例如守护程序)从来都不需要用户输入。其它一些进程只是在用户忙于目前运行于前台的程序时才临时处于后台。

Bash
Bourne Again SHell Bourne Shell 的增强版。(另请参阅“Korn Shell”。)

BDF
字体 用于 X Window 系统的各种位图字体。(另请参阅“PostScript 字体”和“TrueType 字体”。)

Bean
JavaBeans 体系结构的组件。

Beowulf
由相对廉价的计算机(包括 PC)组成的网络,这些计算机可能使用不同的处理器和硬件体系结构,由 Linux 和特殊的系统级软件将它们联合成一个海量并行计算系统。最终结果是一个能够以较低成本获得超级计算机计算能力的系统。这类系统对于诸如气象建模之类的计算密集型任务而言是非常理想的,因为可以将计算分配到几十、几百甚至几千个同时运行的独立处理器上。有时也称为“Beowulf 级超级计算机”或者超级群集计算机。更多关于 Beowulf 技术的信息,请阅读以下文章:www.linuxworld.com/linuxworld/lw-2000-04/lw-04-parallel.html www.ibm.com/press/prnews.nsf/Searchvw/3f4e88b102477aa5852568460067a52a

Bin
一个含有可执行程序的目录,这些程序主要是二进制文件。 二进制文件(Binary 已被编译成可执行程序的源代码。在 UNIX/Linux 世界里,有些软件仅作为源代码分发;有些软件包既包含源代码又包含二进制文件;还有一些软件包则只以二进制文件格式分发。 引导盘(Boot Disk 一张软盘,其中含有操作系统(如 Linux)引导(启动)计算机并从命令行运行一些基本程序所需的足够内容。如果因某种原因导致系统表现为无法引导,那么引导盘是必需的。引导盘还用于对硬盘进行分区和格式化、恢复主引导记录(Master Boot Record)或者复制特定文件等。

Bot
机器人(Robot)的简称。它是一个程序,旨在在几乎没有人工干预下在因特网上搜索信息。

Bourne Shell
一种流行的命令行 shell,它具有的优点比 DOS 命令提示符多很多。(另请参阅“Bash”和“Korn Shell”。)

BSD
Berkeley 软件分发版,Berkeley Software DistributionUNIX 加州大学伯克利分校开发的 UNIX。(另请参阅“FreeBSD”。)

Bzip2
一种较新的 UNIX/Linux 文件压缩程序,它比 Gzip 提供更大的压缩比。 C

CGI
(公共网关接口,Common Gateway Interface Web 服务器上,用来在脚本和/或应用程序之间传输数据,然后将该数据返回给 Web 页面或浏览器。CGI 脚本经常是使用 Perl 语言创建的,它能够生成动态 Web 内容(包括电子商业购物篮、讨论组、调查表单以及实时新闻等)。

CHS
(柱面/磁头/扇区,Cylinder/Head/Sector FDISK 在分区期间所需的磁盘信息。 客户机(Client 向服务器请求服务(例如,电子邮件)的机器。

CLU
(命令行实用程序,Command Line Utility 从命令行会话或 shell 运行的程序,如 Tar Mkdir 群集(Cluster 由运行 Linux 的工作站(PC 或其它机器)组成的网络。(另请参阅“Beowulf”。)

COLA
因特网新闻组 comp.os.linux.announce 的简称,该新闻组宣布一些与 Linux 相关的参考资料。 命令行界面(Command Line Interface)(CLI 全屏或窗口化的文本方式会话,在该会话中用户通过输入命令来执行程序,这些命令可以带参数,也可以不带参数。CLI 显示来自操作系统或程序的输出文本,并为用户输入提供命令提示符。 命令提示符(Command Prompt DOS/Windows OS/2 术语,是命令行界面的一部分,用户在该界面中输入命令。(另请参阅“Shell 提示符”。) 编译(Compile 将编程源代码转换成可执行程序。 编译型语言(Compiled Language)— 一种语言,它需要编译器程序将编程源代码转换成可执行的机器语言二进制程序。一经编译,就可从程序的二进制形式多次运行程序,而无需再次编译。编译型语言/程序运行往往比解释型语言或伪代码语言快,但却需要编译器(可能很昂贵),而且用编译型语言编程常常会比用解释型语言和伪代码语言编程难。编译型语言的例子有 C C++COBOL 以及 FORTRAN 编译器(Compiler 用于将编程源代码转换成可执行程序的程序。 控制台应用程序(Console Application 不需要(即便是提供了)图形用户界面就能运行的命令行程序。

Cron
Linux 守护程序,它在指定时间或按指定间隔执行规定的任务。 D 守护程序(Daemon)—操作系统的后台进程,通常具有root安全级别许可权。守护程序通常隐藏在后台,直至被某个事件(例如特定的时间或日期、时间间隔、收到电子邮件等)触发后它才会进入活动状态。 桌面(Desktop)—操作系统用户界面,旨在表示一个在上面放东西的办公桌。操作系统的桌面并不使用有形的电话、电灯、收/发箱等,而是使用程序及数据图标、窗口、任务栏和类似的东西。Linux 可以使用许多不同的桌面环境,包括 KDEGNOME X11,它们可以由用户安装。(另请参阅“GUI”、“窗口管理器”和“X Window 系统”。) 设备驱动程序(DeviceDriver)—一种程序,它充当操作系统与设备(端口、驱动器、监视器、打印机等)之间的媒介,它向操作系统说明该设备具备哪些能力,同时将操作系统命令转换成该设备可以理解的指令。 分发版(Distribution)—将Linux内核(核心)连同各种用户界面、实用程序、驱动程序及其它软件打包成可交付给用户的软件包。分发版通常是以免费下载或廉价 CD-ROM 软件包的形式提供给用户的。流行的分发版包括 Caldera OpenLinuxCoreLinuxDebianRed HatSlackwareSuSETurboLinux 及其它软件。

Dpkg
Debian 软件包管理器,Debian PackageManager)—可从因特网下载的打包及安装工具,它包含在 Debian Linux 中,但与其它分发版兼容。它生成具有 .DEB 扩展名的文件。与 RPM 类似。 E

Emacs
(用 MACroS 进行编辑,Editing with MACroS 一个流行的文本编辑器。

Enlightenment
用户界面(窗口管理器)之一。更多关于 AfterStep 的信息,请访问 www.afterstep.org。(另请参阅“AfterStep”、“GNOME”、“KDE”和“X Window 系统”。) F 文件系统(FileSystem)—一组程序,它们告诉操作系统如何访问及解释存储在磁盘或磁带驱动器或者其它存储媒介上的内容。常见的文件系统包括:FAT FAT-32DOS/Windows)、HPFSOS/2)、NFSNTFSWindows NT/2000)以及其它文件系统。 过滤器(Filter)—一种程序,它(从文件、程序输出或命令行输入)读取数据作为输入,根据一组预定义条件处理输入(如按字母顺序排序),然后输出处理过的数据。一些常见的过滤器包括 AwkGrepSed Sort

Finger
UNIX/Linux 命令,它提供登录用户的有关信息。 前台进程(ForegroundProcess)—在多任务操作系统(诸如UNIX/Linux)中,前台进程是用户当前与之交互的程序(例如,数据输入)。随着用户在程序之间切换,会导致这些程序在不同的时刻处于前台。在层叠的窗口环境中,前台进程是最前面的窗口。

FreeBSD
(免费伯克利软件分发版,Free Berkeley Software Distribution 类似于 Linux,因为它包含许多 GNU 程序,并且它运行的许多软件包与 Linux 所运行的相同。但一些内核功能的实现却不尽相同。(另请参阅“BSD UNIX”。)

FTP
(文件传送协议,File Transfer Protocol 与其它计算机(常常是软件资源库)来回传送文件的方法。
G


GCC
GNU C 编译器,GNU C Compiler GPL 管理的一个高质量 C 编译器。

GIMP
GNU 图像操作程序,