已启用模式以进行行修改跟踪

使用 ENABLE ROW MODIFY 跟踪子句作为 CREATE SCHEMA 或 ALTER SCHEMA 语句的一部分,为行修改跟踪启用模式。 此类模式的主要用途是允许增量模式备份捕获自上次完全模式备份以来修改的数据。

注: 缺省情况下未启用行修改跟踪。 因此,要利用增量模式备份和复原,需要使用 ENABLE ROW 修改跟踪子句来创建显式模式。

在已启用行修改跟踪的模式中创建的表

在已启用行修改跟踪的模式中创建的按列组织的表将启用行修改跟踪。 为了在完全备份和增量备份之间跟踪对表数据的增量更改,将在创建表时为每个表添加三个隐式隐藏列。 有关更多信息,请参阅 增量模式备份和复原

存储在这三个新列中的值将需要额外的空间,因此启用行修改跟踪的表将使用更多页面。

为行修改跟踪启用的表将添加以下三个新列:

表 1. 添加到具有行修改跟踪的表中的三个新列
列名 数据类型 允许空 描述
SYSROWID BIGINT 唯一标识表中每一行的列。 该标识在所有数据库分区中都是唯一的。 此列的值由 SEQUENCE 生成。
CREATEXID BIGINT 存储将行添加到表的事务的标识。
删除 XID BIGINT 存储删除该行的事务的标识。 如果未删除该行,那么将为零。

插入行并为其分配 SYSROWID 值后,即使更新该行,此值也不会更改。 请注意, IBM® 现在将保留上述列名,以用于支持行修改跟踪的表。 尝试在表中使用相同列名的用户在创建或变更表时将接收到错误。

只有在启用了行修改跟踪的模式中创建的永久按列组织的表才会启用行修改跟踪。 以下表未启用行修改跟踪,因此将不包含额外的三列:
  • 临时表
  • 外部表
  • 具体化查询表
  • 不在上面的列表中的表,这些表也不是按列组织的 (例如,按行组织的表,插入时间,维度-子句等)

以下是表中三个额外列的示例。 在对表进行描述时,用户可以看到该表的额外列:

db2 "CREATE TABLE S1.T1 (C1 INTEGER)"
db2 "DESCRIBE TABLE S1.T1"

                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
SYSROWID                        SYSIBM    BIGINT                       8     0 No
CREATEXID                       SYSIBM    BIGINT                       8     0 No
DELETEXID                       SYSIBM    BIGINT                       8     0 No
C1                              SYSIBM    INTEGER                      4     0 Yes

  4 record(s) selected.

由于这些列在内部生成的值中隐式隐藏,因此用户在从表中执行 select * (例如) 时不会看到这些列,并且用户在执行 insert , update 或 delete 语句时不需要指定这些列。 尝试修改三列中的任何一列 (通过 insert/update/delete/alter) 将被忽略或导致错误。

支持行修改跟踪的模式中对象的 Db2® 数据库限制

  • db2load 和 INGEST 的异常表不能按列组织,因此将 db2load 或 INGEST 的异常表用于启用行修改跟踪的表的建议方法是在另一模式中创建行组织表 (不同的模式,因为行组织表将导致增量模式备份失败)。 除此之外,异常表必须具有类似的定义,包括为行修改跟踪定义的隐藏列,但 SYSROWID 不能是标识列,因为这些列在异常表中不受支持。 例如:
    • 创建模式 S1 启用行修改跟踪
    • 创建模式 S2
    • CREATE TABLE S1.T1 (C1 INT)
    • CREATE TABLE S2.LOADEXTBL (SYSROWID BIGINT NOT NULL , CREATEXID BIGINT NOT NULL , DELETEXID BIGINT NOT NULL , C1 INT)
    • LOAD FROM <file> OF DEL INSERT INTO S1.T1 FOR EXCEPTION S2.LOADEXTBL
  • 启用行修改跟踪的表中用户定义的最大列数减少到 1009。
  • 在表中使用 CREATE 或 REPLACE_CREATE 选项以启用行修改跟踪的 IMPORT 可能会失败。
  • 如果至少有一个表定义为 DISTRIBUTE BY RANDOM 或包含 GENERATED ALWAYS AS IDENTITY 列,那么具有 copymode "COPY" 或 "COPYNO" 的 ADMIN_COPY_SCHEMA 将失败。
  • 不支持将已启用行修改跟踪的表变更为具体化查询表。
  • 表的分布键中不支持三个新的隐藏列 (SYSROWID , CREATEXID 和 DELETEXID) (这意味着在 DISTRIBUTE BY HASH 列列表中不允许这些列)。
  • 如果源或目标是已启用行修改跟踪的模式中的表,那么不支持 db2move
  • 三个新的隐藏列中的任何一个都不能作为索引键的一部分或包含在强制约束中。
  • 不支持启用行修改跟踪的系统周期时态表或 Bitemporal-period 表,但是应用程序周期时态表将支持行修改跟踪。
  • 不支持 CREATE VIEW ... WITH ROW MOVEMENT 已启用行修改跟踪。
  • REORG 表 ... RECLAIM 扩展数据块从已删除的 SYSROWID/CREATEXID/DELETEXID 列中回收空间。 仅针对上次 -type ONL (完全模式) 备份之前删除的行回收空间。

目录更改

SYSCAT.SCHEMATA 中名为 ROWMODIFICATIONTRACKING 的新列将指示是否启用了值为 "N" 或 "Y" 的模式进行行修改跟踪。 名为 QUIESCED 的 SYSCAT.SCHEMATA 中的新列将指示模式是由正在进行的 LOGICAL_RESTORE () 锁定,值为 "N" 还是 "Y"。

db2 DESCRIBE TABLE SYSCAT.SCHEMATA
                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
SCHEMANAME                      SYSIBM    VARCHAR                    128     0 No
OWNER                           SYSIBM    VARCHAR                    128     0 No
OWNERTYPE                       SYSIBM    CHARACTER                    1     0 No
DEFINER                         SYSIBM    VARCHAR                    128     0 No
DEFINERTYPE                     SYSIBM    CHARACTER                    1     0 No
CREATE_TIME                     SYSIBM    TIMESTAMP                   10     6 No
AUDITPOLICYID                   SYSIBM    INTEGER                      4     0 Yes
AUDITPOLICYNAME                 SYSIBM    VARCHAR                    128     0 Yes
AUDITEXCEPTIONENABLED           SYSIBM    CHARACTER                    1     0 No
DATACAPTURE                     SYSIBM    VARCHAR                      1     0 No
ROWMODIFICATIONTRACKING         SYSIBM    VARCHAR                      1     0 No
QUIESCED                        SYSIBM    VARCHAR                      1     0 No
REMARKS                         SYSIBM    VARCHAR                    254     0 Yes

db2 SELECT CAST(SCHEMANAME as CHAR(5)) as SCHEMANAME, ROWMODIFICATIONTRACKING FROM SYSCAT.SCHEMATA WHERE SCHEMANAME='S1'
SCHEMANAME ROWMODIFICATIONTRACKING
---------- -----------------------
S1         Y
  1 record(s) selected.

迁移注意事项

用户可以更改其模式以启用行修改跟踪,但是这不会修改模式中的任何表以启用行修改跟踪。 变更模式的语法如下所示:

存储在 3 新列中的值将需要额外的空间,因此启用行修改跟踪的表将耗用的页面数超过未使用的完全相同的表。 只有在模式中创建的新表才会启用行修改跟踪。 在启用模式以进行行修改跟踪之后,必须重新创建模式中的所有列表,然后才能进行逻辑模式备份。

表迁移

可以通过任何方法重新创建表,例如使用 ADMIN_MOVE_TABLE 或 CREATE TABLE ... AS ... WITH DATA (从一个表中选择 * 到同一模式中的新表)。 如果针对行修改跟踪启用了目标模式,并且目标表类型支持行修改跟踪,那么将创建为针对行修改跟踪启用的目标表。 是否为行修改跟踪启用源表不会影响将为目标表选择的内容。 如果用户尝试从源表中选择任何新的隐藏列,其中目标是在支持行修改的模式中创建的,那么这将被视为用户尝试创建具有相同名称的用户列的表并导致错误 (列名已存在)。 在 CREATE TABLE 期间,不会将新隐藏列的值从源转入目标 ... AS (全查询) WITH DATA 操作。

使用逻辑备份和复原的表数据迁移

为了帮助迁移, SYSPROC.LOGICAL_BACKUP 能够通过指定 -backup-migrate 选项来获取未启用行修改跟踪的模式的逻辑备份映像。 请注意,在此备份的整个持续时间内,仅允许对模式中的表进行读访问。 备份完成后,可以使用 SYSPROC.LOGICAL_RESTORE (-enable-row-modification-tracking) 选项复原备份映像。 在这种情况下,会将模式创建为 ENABLE ROW 修改跟踪,并且还会尝试启用该模式中的所有表。 原始模式中阻止表启用行修改跟踪的任何表 DDL/condition 都将导致备份失败。