DB2 UDB中用户出口程序是如何工作的?
采用用户出口程序与DB2 UDB共同工作背后的基本思想是提供一种归档和检索数据库日志文件的方法以实现日志冗余处理并从易失性介质上转储出来。重要的,值得注意的是,根据你的特殊需求,在用户出口程序当中,除了能实现归档和检索日志之外,你还可以实现其他的操作。
如果一个数据库需要采用归档日志文件来进行恢复,在DB2 UDB中实行用户出口程序策略将不能恢复100%的事务。用户出口程序只是一种通过拷贝已经存在的日志文件到一个安全的地方来为其提供更多保护的方法。它是数据完整性策略中的一部分,而且是重要的一部分。
编译了用户出口程序之后,可执行程序db2uext2被放置在数据库管理器可以找到的目录当中。在UNIX©中,这个目录是/sqllib/adm;在Windows©中,是Program FilesIBMSQLLIBBIN。
除非数据库管理器知道用户出口程序是可用的,不然它不会调用db2uext2。让数据库管理器知道db2uext2可以被调用的唯一方法是将数据库配置参数userexit设置为on。一旦这个参数被设定好而且DB2实例被重复利用了,数据库管理器将每五分钟调用一次用户出口程序来检查那些可以被归档到程序相关的归档目录的日志文件。
如果数据库的恢复是必要的,在前滚操作期间,数据库管理器将调用db2uext2把归档日志文件拷贝回活动的日志目录当中。然后,日志文件被再次运用到重建的数据库中。
让我们看看被数据库管理器生成的到用户出口程序的调用的格式。注意,这一信息也可以在用户出口示例程序的注释部分找到。
db2uext2 -OS -RL
-RQ -DB -NN
-LP -LN [-AP]
其中:
os=操作系统
release=DB2发行版本
request= 'ARCHIVE' 或 'RETRIEVE'
dbname=数据库名
nodenumber=节点号
logpath=日志文件目录
logname=日志文件名
logsize=日志文件大小(可选)
startingpage=以4k页为单位的起始偏移量(可选)
adsmpasswd=ADSM密码(可选)
注意:只有当logpath为裸设备时才使用logsize和startingpage。
归档或者从磁盘检索日志文件遵从以下命名规则:
归档:归档路径+数据库名+节点号+日志文件名
检索:检索路径+数据库名+节点号+日志文件名
比如:如果归档的路径为”c:mylogs”,
检索路径是“c:mylogs”,
数据库名是“SAMPLE”,
节点号是 NODE0000,
文件名是 S0000001.LOG,
日志文件将是:
归档到 - c:mylogsSAMPLENODE0000S0000001.LOG
检索自 - c:mylogsSAMPLENODE0000S0000001.LOG
以下描述了用户出口程序中的逻辑是如何运转的:
1) 安装信号处理程序。
2) 验证传递的参数个数。
3) 验证操作请求。
4) 开始审计跟踪(如果有此请求)。
5) 根据操作需求的不同获取以下路径中的一个:
a) 如果操作需求为归档一个文件,将日志文件从日志路径拷贝到归档路径中。
i) 如果没有找到日志文件,执行第6点。
b) 如果操作需求是检索一个文件,将日志文件从检索路径拷贝到日志路径中。
i) 如果没有找到日志文件,执行第6点。
6) 将错误记入日志(如果要求或者有需要的话)。
7) 结束审计跟踪(如果有请求)。
8) 以适当的返回码退出。
手工调用用户出口程序来归档日志文件是可以的,但最好还是使用ARCHIVE LOG命令以便在定义以上参数时不会因为你的原因导致错误。在这篇文章的末尾,可以找到关于ARCHIVE LOG命令的链接。
日志文件术语
DB2 中用户出口程序的基本功能是将日志文件拷贝到活动日志目录或反之。这里,值得指出一些术语来阐明活动的日志目录被置于何处以及数据库日志文件的状态如何。
活动日志目录:
该目录被置于你的数据库目录中。在Windows中,如果在C:中创建了一个叫做SAMPLE的单一数据库且实例名为db2inst1,则将会出现以下的目录结构:
C:DB2INST1NODE0000SQL000001SQLOGDIR
SQL00001是SAMPLE数据库的数据库目录,SQLOGDIR 是活动日志目录。
以下的图1显示了Windows操作系统上的活动日志目录:
PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />SHAPE id=_x0000_i1025 style="WIDTH: 299.25pt; HEIGHT: 180.75pt" type="#_x0000_t75" />/P>
图 1活动日志目录
日志文件状态
在活动日志目录中,日志文件可以是活动日志,也可以是联机归档日志。活动日志是那些被 DB2 用于当前事务处理和崩溃恢复的日志。联机归档日志是那些 DB2 UDB 进行常规处理时不再需要,而进行数据库恢复时可能还会需要的日志。当实现用户出口程序时,这些联机归档日志将最终以归档日志目录中的副本形式出现。
既然 DB2 UDB 中用户出口程序的目的是将数据库日志拷贝到归档目录中,你将最终在活动日志目录(缺省为 SQLOGDIR)中得到重复的日志文件。你可能考虑删除这些重复的联机归档日志以释放文件系统空间。在从数据库目录中除去这些日志之前,要十分小心地确认它们是否已经将成功地被复制到归档目录中。还必须确保数据库管理器进行崩溃恢复时不再需要它们。要确定你的活动日志目录中哪些日志文件不为正常处理所需要,可用通过以下命令检查数据库配置:
db2 "get db cfg for sample"
这条命令的数据库配置输出结果将包含第一个活动日志文件,如:
First active log file = S000009.LOG
在如上所示的输出当中,日志文件S000009.LOG是数据库当前的活动日志。任何编号比该日志文件小的日志文件都被看作联机归档日志。
这里有一个例子:
在这个场景中,活动日志目录中有日志文件 S000000.LOG - S000009.LOG,归档日志目录中有 S000000.LOG - S000008.LOG。因为 S000009.LOG 是第一个活动日志文件,所以,可以从活动日志目录中移走 S000001.LOG - S000008.LOG 以释放磁盘空间。S000009.LOG 文件必须保留在活动日志目录中,因为它仍然被当前事务使用。
同样可以通过检查数据库历史文件来查看活动日志目录中哪些日志文件不再有用。以下命令将列出数据库备份信息:
db2 "list history backup all for database sample"
以下是该命令的输出结果的一个例子:
List History File for sample
Number of matching file entries = 4
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log
-- --- ------------------ ---- --- ------------------------
B D 20030416162026001 F D S0000010.LOGS0000014.LOG
------------------------------------------------------------
Contains 2 tablespace(s):
00001 SYSCATSPACE
00002 USERSPACE1
------------------------------------------------------------
在上面的输出中,最早的日志将表示,需要 S0000010.LOG 及其之后的任何日志。 S00000010.LOG 之前的任何日志可以被安全的删除。再次提醒,在从活动日志目录中删除日志文件之前,验证在活动日志目录中存在这些日志文件的拷贝是十分重要的。
虽然可以手动的从活动日志目录中删除日志文件,删除联机归档日志文件的安全方法是通过prune logfile命令。该命令可以用来删除活动归档目录中的日志文件。在下面的示例中,以下命令将删除日志文件 S000000.LOG - S000008.LOG:
db2 "prune logfile prior to S000009.LOG"
注意:根据您的恢复策略,可能会出现之前的前滚操作在数据库上执行的场景。归档目录中的老日志文件可能被同名的新日志文件所覆盖,从而阻止你使用旧日志文件对数据库进行时间点恢复。对用户出口程序的设计程序员来说,考虑类似这样的情况是很重要的。
设置用户出口
在本文中,我们将采用DB2提供的db2uext2.cdisk样例c程序,它位于你的c目录当中。在UNIX中,c目录位于/sqllib/samples。Windows中,这目录位于Program Files/IBM//samples。
在Windows中设置用户出口
修改和编译用户出口程序
1. 创建名为C:mylogs的目录
2. 将C:Program filesIBMSQLLIBsamplescdb2uext2.cdisk拷贝到一个工作目录当中
3. 对于本示例,用户出口程序的以下部分应该得以验证以反映路径 c:\mylogs\
#define ARCHIVE_PATH "c:\mylogs\"
#define RETRIEVE_PATH "c:\mylogs\"
#define AUDIT_ACTIVE 1 /* enable audit trail logging */
#define ERROR_ACTIVE 1 /* enable error trail logging */
#define AUDIT_ERROR_PATH "c:\mylogs\"
/* path must end with a slash */
#define AUDIT_ERROR_ATTR "a" /* append to text file */
#define BUFFER_SIZE 32
/* # of 4K pages for output buffer */
4. 确定在你的系统中安装了被支持的C编译器(比如,Microsoft Visual Studio)而且环境中有该编译器的路径。
5. 通过命令行,将db2uext2.cdisk更名为db2uext2.c并构建:
cl db2uext2.c
一旦程序被编译,将创建db2uext2.exe和db2uext2.obj文件。
6. 将可执行文件db2uext2.exe放到/SQLLIB/BIN目录当中从而使数据库管理器能够定位并执行它用以归档和检索日志。
为用户出口创建并准备数据库
7. 在 DB2 命令窗口中用 db2sampl 命令创建 SAMPLE 数据库。这将使你对下面的示例使用样本表。
db2sampl
8. 更新数据库配置文件以便为数据库打开用户出口。请注意:只能为一个数据库分配用户出口程序,因为 bin 目录被所有 DB2 实例共享。
db2 "update db cfg for sample using userexit on"
db2stop force
<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-
/P>
posted on 2006-12-08 18:12
MyJavaWorld 阅读(414)
评论(0) 编辑 收藏