通常情况下,Oracle GoldenGate 的 trail 文件中是不会包含数据库的 SCN 信息的,要在 trail 文件中记录此信息,必须在 Extract 进程参数中设置 TOKENS

示例如下:
--Normal extract mapping--
TABLE scott.* ;

--To use tokens--
TABLE scott.*, tokens (tk-scn = @getenv("ORATRANSACTION", "SCN"));

设置 tokens 后 Extract 进程会在 trail 文件中写入一个 token ,其中包含 SCN 的详细信息。下面我们通过实验来详细了解一下设置 tokens 和不设置的区别。

设置 tokens 前:
GGSCI (prod.oracle.com) 1> view params ESCOTT
EXTRACT escott
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID ggs, PASSWORD register
EXTTRAIL ./dirdat/aa
TABLE scott.EMP_GGS, tokens (tk-scn = @getenv("ORATRANSACTION", "SCN"));
TABLE scott.DEPT_GGS, tokens (tk-scn = @getenv("ORATRANSACTION", "SCN"));

Logdump 15 >open ./dirdat/aa000016
Current LogTrail is /home/oracle/ggs/dirdat/aa000016
Logdump 16 >ghdr on
Logdump 17 >detail data
Logdump 18 >usertoken detail
Logdump 51 >n


Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 120 (x0078) IO Time : 2013/03/21 23:31:55.000.000
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 131 AuditPos : 6994960
Continued : N (x00) RecCount : 1 (x01)

2013/03/21 23:31:55.000.000 Insert Len 120 RBA 1079
Name: SCOTT.EMP_GGS
After Image: Partition 4 G s
0000 000a 0000 0000 0000 0000 1cd4 0001 0008 0000 | ....................
0004 4d49 4d49 0002 0009 0000 0005 434c 4552 4b00 | ..MIMI........CLERK.
0300 0a00 0000 0000 0000 001e de00 0400 1500 0031 | ...................1
3938 372d 3132 2d31 373a 3030 3a30 303a 3030 0005 | 987-12-17:00:00:00..
000a 0000 0000 0000 0001 3880 0006 000a ffff 0000 | ..........8.........
0000 0000 0000 0007 000a 0000 0000 0000 0000 0014 | ....................
Column 0 (x0000), Len 10 (x000a)
0000 0000 0000 0000 1cd4 | ..........
Column 1 (x0001), Len 8 (x0008)
0000 0004 4d49 4d49 | ....MIMI
Column 2 (x0002), Len 9 (x0009)
0000 0005 434c 4552 4b | ....CLERK
Column 3 (x0003), Len 10 (x000a)
0000 0000 0000 0000 1ede | ..........
Column 4 (x0004), Len 21 (x0015)
0000 3139 3837 2d31 322d 3137 3a30 303a 3030 3a30 | ..1987-12-17:00:00:0
30 | 0
Column 5 (x0005), Len 10 (x000a)
0000 0000 0000 0001 3880 | ........8.
Column 6 (x0006), Len 10 (x000a)
ffff 0000 0000 0000 0000 | ..........
Column 7 (x0007), Len 10 (x000a)
0000 0000 0000 0000 0014 | ..........

下面我们来看看在 Extract 进程参数中加入 tokens 设置后,插入一条记录在 trail 文件中的记录

GGSCI (prod.oracle.com) 3> view params escott
TABLE scott.EMP_GGS;
EXTRACT escott
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID ggs, PASSWORD register
EXTTRAIL ./dirdat/aa
TABLE scott.EMP_GGS, tokens (tk-scn = @getenv("ORATRANSACTION", "SCN"));
TABLE scott.DEPT_GGS, tokens (tk-scn = @getenv("ORATRANSACTION", "SCN"));

插入一条记录后,trail 文件切到下一队列
GGSCI (prod.oracle.com) 8> info ESCOTT,detail
EXTRACT ESCOTT Last Started 2013-03-21 23:42 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:09 ago)
Log Read Checkpoint Oracle Redo Logs
2013-03-21 23:43:34 Seqno 132, RBA 290816
SCN 0.1364750 (1364750)
Target Extract Trails:
Remote Trail Name Seqno RBA Max MB
./dirdat/aa 17 1333 5

Logdump 54 >open ./dirdat/aa000017
Current LogTrail is /home/oracle/ggs/dirdat/aa000017
Logdump 55 >ghdr on
Logdump 56 >detail data
Logdump 57 >usertoken on
Logdump 58 >usertoken detail
Logdump 59 >n

Logdump 61 >n


Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 120 (x0078) IO Time : 2013/03/21 23:43:34.000.000
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 132 AuditPos : 289296
Continued : N (x00) RecCount : 1 (x01)

2013/03/21 23:43:34.000.000 Insert Len 120 RBA 1079
Name: SCOTT.EMP_GGS
After Image: Partition 4 GU s
0000 000a 0000 0000 0000 0000 1cd5 0001 0008 0000 | ....................
0004 4d49 4e49 0002 0009 0000 0005 434c 4552 4b00 | ..MINI........CLERK.
0300 0a00 0000 0000 0000 001e de00 0400 1500 0031 | ...................1
3938 372d 3132 2d31 373a 3030 3a30 303a 3030 0005 | 987-12-17:00:00:00..
000a 0000 0000 0000 0001 3880 0006 000a ffff 0000 | ..........8.........
0000 0000 0000 0007 000a 0000 0000 0000 0000 0014 | ....................
Column 0 (x0000), Len 10 (x000a)
0000 0000 0000 0000 1cd5 | ..........
Column 1 (x0001), Len 8 (x0008)
0000 0004 4d49 4e49 | ....MINI
Column 2 (x0002), Len 9 (x0009)
0000 0005 434c 4552 4b | ....CLERK
Column 3 (x0003), Len 10 (x000a)
0000 0000 0000 0000 1ede | ..........
Column 4 (x0004), Len 21 (x0015)
0000 3139 3837 2d31 322d 3137 3a30 303a 3030 3a30 | ..1987-12-17:00:00:0
30 | 0
Column 5 (x0005), Len 10 (x000a)
0000 0000 0000 0001 3880 | ........8.
Column 6 (x0006), Len 10 (x000a)
ffff 0000 0000 0000 0000 | ..........
Column 7 (x0007), Len 10 (x000a)
0000 0000 0000 0000 0014 | ..........

User tokens: 15 bytes
tk-scn : 1364750

这里显示的 tk-scn : 1364750 正是我们要显示的数据库 SCN 号。

下面我们来做一个更精确的测试,我们更新一条记录,并记录插入记录前后的 SCN 号,然后
到 trail 文件中查看是否确实如此。

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

1365152
SQL> update scott.emp_ggs set ename = 'DANIEL' where empno = 7381;

1 row updated
SQL> commit;

Commit complete
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

1365155

修改记录前的数据库 SCN 为 1365152,修改后的为 1365155,那么修改记录时的 SCN 应该在二者之间:

Logdump 62 >n


Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 28 (x001c) IO Time : 2013/03/21 23:53:03.000.000
IOType : 15 (x0f) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 132 AuditPos : 526352
Continued : N (x00) RecCount : 1 (x01)

2013/03/21 23:53:03.000.000 FieldComp Len 28 RBA 1333
Name: SCOTT.EMP_GGS
After Image: Partition 4 GU s
0000 000a 0000 0000 0000 0000 1cd5 0001 000a 0000 | ....................
0006 4441 4e49 454c | ..DANIEL
Column 0 (x0000), Len 10 (x000a)
0000 0000 0000 0000 1cd5 | ..........
Column 1 (x0001), Len 10 (x000a)
0000 0006 4441 4e49 454c | ....DANIEL

User tokens: 15 bytes
tk-scn : 1365154