db2ReadLog API - 读取日志记录

db2ReadLog API 从 Db2® 数据库日志中读取日志记录,或者查询日志管理器以获取当前日志状态信息。 此 API 只能与可恢复数据库配合使用。 如果数据库配置参数 logarchmeth1 和/或 logarchmeth2未设置为 OFF,那么数据库可恢复。

授权

为下列其中一种权限:
  • SYSADM
  • DBADM

需要的连接

数据库

API 包含文件

db2ApiDf.h

API 和数据结构语法

SQL_API_RC SQL_API_FN
  db2ReadLog (
       db2Uint32 versionNumber,
       void * pDB2ReadLogStruct,
       struct sqlca * pSqlca);


/******************************************************************************
** db2LRI data structure
** db2LRI data structure parameters
**
** lriType
** The type of LRI structure.  The following are the valid types:
**    - DB2READLOG_LRI_1 : part1 is the LFS and part2 is the LSN for
**                         the log record
**    - DB2READLOG_LRI_2 : part1 is the logStreamID and part2 is the LSO for
**                         the log record
** (See "Log record header" in Db2 documentation for the meaning of LFS, 
**  LSN, LSO.)
**    
** part1     
** Part 1 of the LRI structure.
**
** part2
** Part 2 of the LRI structure.
**
*******************************************************************************/
typedef SQL_STRUCTURE db2LRI
{
   db2Uint64       lriType;            /* LRI type                            */
   db2Uint64       part1;              /* Part 1 of the LRI structure         */
   db2Uint64       part2;              /* Part 2 of the LRI structure         */
} db2LRI;

/* db2LRI types                                                               */
#define DB2READLOG_LRI_1 1             /* LRI type 1                          */
#define DB2READLOG_LRI_2 2             /* LRI type 2                          */


typedef SQL_STRUCTURE db2ReadLogStruct
{
   db2Uint32 iCallerAction;
   db2LRI *piStartLRI;
   db2LRI *piEndLRI;
   char *poLogBuffer;
   db2Uint32 iLogBufferSize;
   db2Uint32 iFilterOption;
   db2ReadLogInfoStruct *poReadLogInfo;
   db2LRI *piMinRequiredLRI;
   char *piStartTime;
} db2ReadLogStruct;

typedef SQL_STRUCTURE db2ReadLogInfoStruct
{
   db2LRI initialLRI;
   db2LRI firstReadLRI;
   db2LRI nextStartLRI;
   db2LRI firstReusedLRI;
   db2Uint32 logRecsWritten;
   db2Uint32 logBytesWritten;
   db2Uint32 timeOfLRIReuse;
   db2TimeOfLog currentTimeValue;
   db2Uint32 futureUse1;
   db2LSN oldestInFlightLSN;
   db2LRI finalLRI;
} db2ReadLogInfoStruct;

typedef SQL_STRUCTURE db2TimeOfLog
{
   db2Uint32 seconds;
   db2Uint32 accuracy;
} db2TimeOfLog;


typedef SQL_STRUCTURE db2ReadLogFilterData
{
   db2LRI         recordLRIType1;
   db2LRI         recordLRIType2;
   db2Uint32      realLogRecLen;
   db2int32       sqlcode;
} db2ReadLogFilterData;

db2ReadLog API 参数

versionNumber
输入。 指定作为第二个参数 pDB2ReadLogStruct传递的结构的版本和发行版级别。
pDB2ReadLogStruct
输入。 指向 db2ReadLogStruct 结构的指针。
pSqlca
输出。 指向 sqlca 结构的指针。

db2ReadLogStruct 数据结构参数

iCallerAction
输入。 指定要执行的操作。
DB2READLOG_READ
将数据库日志从起始日志序列读取到结束日志序号,并返回此范围内的日志记录。
DB2READLOG_READ_SINGLE
读取由起始日志序号标识的单个日志记录 (可传播或不可传播)。
DB2READLOG_QUERY
查询数据库日志。 查询结果将通过 db2ReadLogInfoStruct 结构发送回。
piStartLRI
输入。 起始日志记录标识 (LRI) 指定读取日志的起始点。 使用 lriType DB2READLOG_LRI_1时, part1 (LFS) 和 part2 (LSN) 不需要作为实际日志记录的开头。

使用 DB2READLOG_LRI_2 时,part1 (logStreamID) 必须是连接分区,part2 (LSO) 必须是日志记录的开始。

piEndLRI
输入。 结束 LRI 指定用于读取日志的端点。 此值必须大于 piStartLRI 参数,并且不需要是实际日志记录的开始或结束。
poLogBuffer
输出。 缓冲区保存 db2ReadLog API 返回的日志记录。 缓冲区的大小由 iLogBufferSize 参数指定。 返回的日志记录按顺序存储在此缓冲区中,每个缓冲区都具有基于 iFilterOption的前缀:
  • 如果 iFilterOptionON,那么 db2ReadLogFilterData 结构将以每个日志记录为前缀。
  • 如果 iFilterOptionOFF,那么缓冲区中的每个日志记录都以两个 24 字节 db2LRI 结构作为前缀。
iLogBufferSize
输入。 指定 poLogBuffer 缓冲区的大小 (以字节计)。 此缓冲区必须足以容纳单个日志记录。
iFilterOption
输入。 指定在读取日志记录时要使用的日志记录过滤级别。 有效值为:
DB2READLOG_FILTER_OFF
读取给定 LRI 范围内的所有日志记录。
DB2READLOG_FILTER_ON
仅读取标记为可传播的给定 LRI 范围内的日志记录。 这是异步日志读取 API 的传统行为。 使用此值时返回的日志记录记录记录在 "Db2 日志记录" 主题中。 所有其他日志记录仅供 IBM 内部使用,因此未记录。
poReadLogInfo
输出。 详细描述有关调用和数据库日志的信息的结构。
piMinRequiredLRI
输入。 此字段用于将来的功能。 使应用程序将此字段设置为 0。
piStartTime
输入。 包含 ISO 格式的全球标准时间 (UTC) 时间戳记的字符串。 只能对 DB2READLOG_QUERY指定此字段。 在所有其他情况下传递 NULL 值。 查询调用尝试返回匹配或早于提供的时间戳记的 LRI。 查询调用不再返回上次数据库复原,数据库前滚或拓扑生命周期更改事件。 生成的 LRI 将在 nextStartLRI中返回。 仅当 API versionNumber 设置为 db2Version11580 或更高版本时, API 才会引用此字段。 在 Db2 11.5.8.0 和更高版本的服务器上支持使用此字段。

db2ReadLogInfoStruct 数据结构参数

initialLRI
激活后数据库使用或要使用的第一个 LRI。
firstReadLRI
poLogBuffer 参数中存在第一个 LRI。
nextStartLRI
要由调用者读取的下一个日志记录的开始。 使用此 LRI 作为下一次读取的开始,而不是 poLogBuffer 参数中最后一个日志记录的结束,可防止已过滤的日志记录被重新扫描。 这是因为某些日志记录已过滤,并且未在 poLogBuffer 参数中返回。 此外,如果使用开始时间 (带有 piStartTime的DB2READLOG_QUERY ) 查询数据库,那么此字段保存最接近映射到指定开始时间的 LRI。
firstReusedLRI
由于数据库复原或前滚操作而复用的第一个 LRI。
logRecsWritten
写入 poLogBuffer 参数的日志记录数。
logBytesWritten
写入 poLogBuffer 参数的数据的总字节数。
timeOfLRIReuse
复用 firstReusedLRI 所表示的 LRI 的时间。 时间是自 1970 年 1 月 1 (午夜 UTC/GMT) 以来的秒数。
currentTimeValue
根据数据库的当前时间。
futureUse1
此字段用于将来的功能。 当前版本的 Db2 始终返回值 0。
oldestInFlightLSN
最旧的未完成事务的 LSN。
finalLRI
对于 DB2READLOG_QUERY 调用者,这是数据库使用的最终 LRI (日志结束)。 仅当 API versionNumber 设置为 db2Version11580 或更高版本时,该字段才由 API 设置。 在 Db2 11.5.8.0 和更高版本的服务器上支持使用此字段。 在较低版本的 Db2 服务器上,该值设置为 (0, 0, 0) (lriType, part1, part2)

db2TimeOfLog 数据结构参数

自 1970 年 1 月 1 以来的秒数 (午夜 UTC/GMT)。
精度
允许调用者在比较在同一秒内发生的时间戳记时区分事件顺序的高精度计数器。

db2ReadLogFilterData 数据结构参数

输出。 db2ReadLogFilterData 结构保存日志记录的元数据,使用以下参数:
recordLRI
以下日志记录的 LRI。 db2ReadLogFilterData 结构中有两个 LRI:
  • recordLRIType1 日志记录的 LRI。 这是类型 1 LRI。
  • recordLRIType2 日志记录的 LRI。 这是类型 2 LRI。
realLogRecLen
Db2 日志中的物理日志记录长度。
sqlcode
如果尝试解压缩日志记录中的压缩行映像时发生错误,那么此字段非零。 如果发生错误,那么该字段包含表示与该错误关联的 SQL 代码的整数。 对于永久错误,通常会返回 SQL0204N 。 重新提交 API 请求可能会返回相同的错误。 对于瞬态错误,返回的 SQL 代码对应于错误原因,这可能需要用户操作来纠正。

使用说明

如果请求的操作是读取日志,那么必须提供日志记录标识范围和缓冲区以保存日志记录。 此 API 按顺序读取由请求的 LRI 范围限定的日志,并返回与通过 DATA CAPTURE CHANGES 子句定义的表相关联的日志记录,以及具有当前活动日志信息的 db2ReadLogInfoStruct 结构。 如果请求的操作是对数据库日志的查询 (通过指定值 DB2READLOG_QUERY来指示) ,那么 API 将返回具有当前活动日志信息的 db2ReadLogInfoStruct 结构。

要使用异步日志阅读器,请首先查询数据库日志以获取有效的起始 LRI。 在查询调用之后,读日志信息结构 (db2ReadLogInfoStruct) 包含要在读调用上使用的有效起始 LRI (在 initialLRI 成员中)。 用作读取的结束 LRI 的值是下列其中一个值:
  • 大于 initialLRI 的值
  • (0000 0000 0000 0001, FFFF FFFF FFFF FFFF, FFFF FFFF FFFF FFFF) (lriType, part1, part2) ,异步日志阅读器将其解释为当前日志的结束。

在起始和结束 LRI 范围内读取的可传播日志记录将在日志缓冲区中返回。 如果 iFilterOption 选项设置为 DB2READLOG_FILTER_ON,那么 LRI 将替换为缓冲区中的 db2ReadLogFilterData 数据结构。 可以在 "Db2 日志记录" 主题中找到 db2ReadLog 返回的各种 Db2 日志记录的描述。

要在初始读取后读取下一个顺序日志记录,请使用 db2ReadLogStruct 结构中返回的 nextStartLRI 字段。 请重新提交该调用,并使用此新启动的 LRI 和有效的结束 LRI。 然后读取下一个记录块。 sqlca 代码 SQLU_RLOG_READ_TO_CURRENT 表示日志阅读器已读取到当前活动日志的末尾。

此 API 从 Db2日志中读取数据。 不会在此类日志上实施基于标签的访问控制 (LBAC)。 因此,如果调用者具有调用此 API 的足够权限并且能够了解日志记录格式,那么调用此 API 的应用程序可以获取对表数据的访问权。

db2ReadLog API 适用于当前数据库连接。 如果使用同一进程创建了多个数据库连接,请使用并发访问 API 来管理多个上下文。

如果在断开连接之前未执行落实或回滚,那么从应用程序调用 db2ReadLog API 可能会导致应用程序与数据库断开连接时发生错误:
  • 如果从 CLI 应用程序调用 db2ReadLog API ,那么可能会生成 CLI0116E 错误。
  • 如果从以 C 编写的嵌入式 SQL 应用程序调用 db2ReadLog API ,那么可能会生成 SQL0428N 错误。

变通方法 1: 对于非嵌入式 SQL 应用程序,请在调用 db2ReadLog API 之前设置自动落实方式。

变通方法 2: 在调用 db2ReadLog API 之后并在与数据库断开连接之前发出 COMMIT 或 ROLLBACK 语句。

pureScale 环境中的 db2ReadLog 用法

Db2 pureScale® 环境中, db2ReadLog API 的调用顺序与先前版本保持不变。

要开始读取日志记录,调用者可以指定 DB2READLOG_READDB2READLOG_READ_SINGLE。 调用者传递的 LRI 不一定存在于日志流中,在这种情况下,数据库管理器将返回下一个日志记录。

db2ReadLog API 在输出缓冲区中返回两个 LRI 结构。 第一个 LRI 结构用于按顺序读取日志,第二个 LRI 结构标识它所属的日志流中的日志记录。

Db2 pureScale 环境中,数据库针对每个 成员具有一个日志流。 db2ReadLog API 支持读取所有日志流并合并这些日志流以将日志记录返回给调用者。 这将导致按数据更改生效的顺序返回数据更改。

Db2 数据服务器仍可以读取不活动 成员 或脱机 成员的日志文件。 db2ReadLog API 可能会等待成员崩溃恢复在 成员 上完成,然后返回更多日志记录。

分区数据库环境中的 db2ReadLog 用法

在分区数据库环境中,数据库分为数据库分区,每个分区都有自己的日志流。 db2ReadLog API 仅从应用程序连接到的特定数据库分区返回日志记录。 要查看和处理数据库中的所有日志记录,应用程序必须连接到每个数据库分区,并在每个流上合并从 db2ReadLog API 返回的日志记录。

分区数据库环境中的事务可以对多个数据库分区上的数据进行更改。 在每个分区上,事务的日志记录由日志记录头中的事务标识标识。 此事务标识仅在此数据库分区中有意义,而另一数据库分区上的同一事务的日志记录可以在日志记录头中具有不同的事务标识。 确定这些日志记录属于同一用户事务的唯一方法是检查 MPP 次母准备日志记录和 MPP 协调程序落实日志记录的 MPP identifier of the transaction field

db2ReadLog 用于将开始时间映射到 LRI
从 Db2 11.5.8.0开始,在所有环境中, db2ReadLog API 可以将开始时间映射到 LRI。 通过使用调用者操作 DB2READLOG_QUERY, piStartTime 字段可以指定指向 ISO 格式的全球标准时间 (UTC) 时间戳记的指针。 API 尝试查找匹配或早于提供的时间戳记的日志记录,并返回关联的 LRI。 如果找到匹配项,那么将设置 nextStartLRI 。 然后,可以将此 LRI 用作后续日志数据读取调用的 API 的启动 LRI。
注:
  • 使用 db2Version11580 API 时,如果指定有效 piStartTime 的 Db2 11.5.8.0 客户机尝试与版本低于 Db2 11.5.8.0的任何 Db2 服务器进行通信,那么该客户机将失败。
  • Db2 11.5.8.0 服务器支持来自任何Db2 11.5.8.0 之前的客户机的请求。 来自这些客户机的请求没有 piStartTime 参数,因此其行为保持不变。
  • db2ReadLog API 的下限与映射的回溯程度相同。 如果提供的开始时间戳记太旧,并且 db2ReadLog API 无法将其映射到 LRI ,那么 API 将返回 SQL2650N rc=21
  • 为了实现高效的时间戳记到日志记录映射, API 将使用 DB2TSCHG.HIS 文件。 对于将 Db2 注册表变量 DB2_COLLECT_TS_REC_INFO 设置为 OFF的用户,启动时间映射可能效率较低。

db2ReadLog API 的向后兼容性

Db2 V 9.8之前的 db2ReadLogStruct版本传递到 Db2 V 9.8 或更高版本服务器的任何应用程序都将失败,并返回 SQL2032N 错误,指示 db2ReadLogStruct 参数无效。 由于日志记录结构的巨大差异以及 db2LRI的引入,必须使用新的 db2ReadLog 结构来重写和重新编译旧应用程序。

Db2 客户机可以使用 Db2 Version 9.7 中的旧 db2ReadLogStruct 并将其传递到 V9.7 服务器,或者使用 db2ReadLogStruct for Db2 Version 9.8 并将其传递到 V9.8 或 Db2 V10 服务器。