手动恢复的示例

本实例说明了手动恢复所涉及的工作。 以下 SQL 语句由用户 nhowe 执行。 返回了错误 -698。
dbaccess
CREATE DATABASE tmp WITH LOG;
CREATE TABLE t (a int);
CLOSE DATABASE;
CREATE DATABASE tmp@apex WITH LOG;
CREATE TABLE t (a int);
CLOSE DATABASE;
DATABASE tmp;
BEGIN WORK;
INSERT INTO t VALUES (2);
INSERT INTO tmp@apex:t VALUES (2);
COMMIT WORK;
### return code -698
以下摘要引用自当前数据库服务器上的逻辑日志:
addr      len   type      xid      id   link

.....
17018    16         CKPOINT  0       0     13018    0
 
18018    20         BEGIN    2       1     0        08/27/91 10:56:57
   3482     nhowe


1802c    32         HINSERT  2       0     18018    1000018  102
   4  
1804c    40         CKPOINT  0       0     17018    1

   begin    xid      id addr     user

   1        2          1  1802c    nhowe

19018    72         BEGPREP  2       0     1802c   6d69    1

19060    16         COMMIT   2       0     19018   08/27/91 11:01:38

1a018    16         ENDTRANS 2       0     19060   580543
以下摘要引用自数据库服务器 apex 上的逻辑日志:
addr      len   type      xid      id   link

.....
16018    20         BEGIN    2             1   0        08/27/91
   10:57:07 3483     pault


1602c    32         HINSERT  2       0     16018    1000018  102
   4

1604c    68         PREPARE  2       0     1602c      eh

17018    16         HEURTX   2       0     1604c          1

17028    12         CLR      2       0     1602c

17034    16         ROLLBACK 2       0     17018    08/27/91 11:01:22

17044    40         CKPOINT  0       0     15018    1

      begin    xid      id addr     user
      1        2        1  17034    --------

18018    16         ENDTRANS 2       0     17034     8806c3
   ....

首先您要尝试将当前数据库服务器日志中的事务与 apex 数据库服务器日志中的事务相匹配。BEGPREP 和 PREPARE 日志记录均包含 GTRID。您可以通过使用 onlog -l 以及查看 BEGPREP 和 PREPARE 日志记录的数据部分来抽取 GTRID。GTRID 在数据部分中偏移了 22 字节,长为 68 字节。更为简单但是准确度较低的方法是查看 COMMIT 或 ROLLBACK 记录的时间。 虽然由于将落实(或回滚)消息从协调者传输至参与者所用时间而导致稍有延迟,但这两个时间必须很接近。(第二个方法缺乏准确度,因为虽然来自同一协调者的并发事务很可能不在同一时间落实,但并发事务是可以在同一时间落实的。)

更正该样本情况
  1. 查找所有已更新的记录。
  2. 使用 onlog 和记录类型表来识别记录类型(插入、删除、更新)。
  3. 使用每个记录的 onlog -l 输出以获取本地 xid、表空间数和行标识。
  4. 通过将表空间数与 systables 系统目录表的 partnum 列中的值相比较,从而将表空间数映射到表名。
  5. 运用您的应用程序知识来确定需要哪一操作来更正该情况。
在本示例中,不同日志中 COMMIT 和 ROLLBACK 记录上的时间戳记很接近。没有其他活动事务造成另一并发的落实或回滚的可能性。在这种情况下,当前数据库服务器上落实了已分配行标识 102(十六进制)或 258(十进制)的插入 (HINSERT)。 因此,补偿事务如下:
DELETE FROM t WHERE rowid = 258