DB-hub Technology Oracle Oracle GoldenGate中Extract的checkpoint

Oracle GoldenGate中Extract的checkpoint

Oracle 数据库中checkpoint和GoldenGate中的checkpoint

在Oracle 数据库中checkpoint的意思是将内存中的脏数据强制写入到磁盘的事件,其作用是保持内存中的数据与磁盘上的数据一致。SCN是用来描述该事件发生的准确的时间点

而GoldenGate中出现的checkpoint有着不同的含义。简单的说就是position,位置的意思。它记录了Extract进程在抽取事务时的进度
使用INFO showch 命令可以查看当前正在运行的Extract进程中所记录的checkpoint。

GGSCI (olinux94) 1> info ext1 showch

当GoldenGate被计划内或者是计划外中断了,为了保证事务的连续性我们从哪里续传呢?答案是:哪里中断,哪里继续。在一个繁忙的数据库中用时间戳来衡量OGG抽取进度是不准确的,因为任何一个时间点都有可能截断了正在处理中的事务。准确的记录的方法是参考该事物在发起时所在trail文件的字节位置(RBA relative byte address)。

GoldenGate Checkpoints说明

  • Checkpoint 存储了进程当前读和写的位置。 Checkpoints 保证已经改变的数据已经同步,从而阻止其他冗余的操作。
  • 通过Checkpoints 可以避免在以下情况下的数据丢失:系统或者网络故障,重启GG进程。Checkpoints支持多个Extact 或者Replicat 进程读取同一个trail 文件。
  • 默认情况下Extract 和 Replicat 进程都会在trail文件里记录checkpoints 的位置。
  • checkpoints 机制保证了Extract 和 Replicat 进程可以连续的操作。
  • Replicat 在Target 库的checkpoint 表里记录了已经提交了事务在trail 文件里的位置。这样就可以保证事务只被应用一次,即使在replicat 进程或者DB 出现故障的情况下。 为了做报告,Replicat也会在GG 安装目录的dirchk 目录里存放一个checkpoint 文件。
  • 可以在不使用checkpoint 的情况下,配置Replicat 进程使用这个本地的文件来存储checkpoint,但是使用本地的checkpoint 文件, 在数据库做了recover的情况下,不能保证数据的一致性。
  • 在事务rolled back 或 rolled forward失败的情况下,使用本地checkpoint 文件还是可以保证一致性。
  • 如果使用checkpoint table,在database recover 的情况下也可以保证数据的一致性。 所以推荐也是使用checkpoint table。
  • Checkpoint 保留了很少的记录,对于哪些很长时间内不需要的的数据会自动删除,所以checkpoint 不会对数据库造成性能上的影响。

GoldenGate Checkpoints有两种存放方式:

1.存放在GGHOME\dirchk下的文件中。

这种是默认的方法,一个进程对应一个文件。提取进程可以只使用这种模式。不需要checkpoint table。 但是这种方式在db recovery 之后可能出现数据不一致。

[oracle@olinux94 dirchk]pwd
/u01/app/oracle/ogg/dirchk
[oracle@olinux94 dirchk] ls -l
total 24
-rw-r-----. 1 oracle oinstall  4096 Jun  5 14:41 EXT1.cpb
-rw-r-----. 1 oracle oinstall 14336 Jun  5 16:50 EXT1.cpe
-rw-r-----. 1 oracle oinstall  4096 Jun  5 16:50 PMP1.cpe

2.存放在数据库指定的表中,需要单独配置。

配置步骤:

(1)在./GLOBALS文件里添加checkpoint 表名

CHECKPOINTTABLE [<owner>.<table>]   --指定的检查点记录表

(2)连上DB,创建checkpoint 表

GGSCI> DBLOGIN [SOURCEDB <dsn>][,USERID <db_user>[, PASSWORD <pw>]]
GGSCI> ADD CHECKPOINTTABLE [<owner>.<table>]   --生成这个检查点记录表

(3)在新增复制进程时可以在添加时指定checkpoint table替代nodbcheckpoint,使用数据库记录检查点信息。

示例
1. 配置./GLOBALS 参数

GGSCI (gg2) 65> view params ./GLOBALS
GGSCHEMA ggate
CHECKPOINTTABLE ggate.checkpoint

在GLOBALS 文件里指定了默认的checkpoint 之后,新的Replicat groups 在创建时会自动使用这个参数,不需要其他指令。

  1. 登录数据库,创建checkpoint表
GGSCI (gg2) 58> dblogin useridggate@gg2,password ggate
Successfully logged into database.

GGSCI (gg2) 59> add checkpointtable ggate.checkpoint
Successfully created checkpoint table GGATE.CHECKPOINT.
  1. 在创建Replicat进程时,指定checkpoint 表
GGSCI (gg2) 14> add replicatrep1,exttrail /u01/ggate/dirdat/lt, checkpointtable ggate.checkpoint

REPLICAT added.
  1. Verify
SQL> conn ggate/ggatede
Connected.

SQL> desc checkpoint

 Name                                     Null?    Type
 ------------------------------------------------- ----------------------------
 GROUP_NAME                                NOT NULL VARCHAR2(8)
 GROUP_KEY                                 NOT NULL NUMBER(19)
 SEQNO                                              NUMBER(10)
 RBA                                       NOT NULL NUMBER(19)
 AUDIT_TS                                           VARCHAR2(29)
 CREATE_TS                                 NOT NULL DATE
 LAST_UPDATE_TS                            NOT NULL DATE
 CURRENT_DIR                               NOT NULL VARCHAR2(255)


SQL> select * from checkpoint;

GROUP_NA GROUP_KEY      SEQNO        RBA AUDIT_TS                      CREATE_TS    LAST_UPDATE_ CURRENT_DIR

-------- ---------- ---------- --------------------------------------- ------------ ------------ ----------------------

REP1    3987940558         12       1564 2011-11-17 17:21:55.471376    17-NOV-11   17-NOV-11    /u01/ggate

checkpoint类型

startup checkpoint:

Extract进程启动时的信息,用多个参数描述了一个确切的时间点。包括thread,sequence,timestamp,RBA,SCN,redo log
sequence表示redo log、或者archive log的序列号。
RBA表示改时间点处于该sequence号日志文件中的字节地址。
SCN表示Oracle内部时钟

recovery checkpoint:

到目前为止还没结束的并且耗时最长的事务信息。包括thread,sequence,timestamp,RBA,SCN,redo log。
如果源端的抽取进程中断了,那么断点续传的位置就是这里了。

current checkpoint:

当前正在读取的事务信息。包括thread,sequence,timestamp,RBA,SCN,redo log

write checkpoint:

当前正在写入的trail文件信息。包括队列号(sequence),RBA,时间戳,队列文件
sequence表示trail文件的序号,有别于数据库中的同名概念。例如:trail文件ex000001的sequence为1

RBA表示当前信息在trail文件中的位置,有别于数据库中事务日志的RBA。通常这个RBA的数值等于当前正在写的trail文件的大小。
可以通过ls -al ./dirdat/ex000001来查看该文件的字节数来对比write checkpoint的RBA

示例:

查看抽取进程ex1的检查点:

GGSCI (node3) 9> info ex1 showch

EXTRACT    EX1       Last Started 2014-11-03 13:23   Status RUNNING  << 进程开始抽取事务的时间,ADD EXTRACT之后就生效了
Checkpoint Lag       00:00:03 (updated 00:00:07 ago)
Log Read Checkpoint  Oracle Redo Logs
                     2014-11-03 15:13:04  Thread 1, Seqno 21, RBA 26012672  << 2个节点的RAC就有2个Checkpoint
                     SCN 0.1614343 (1614343)
Log Read Checkpoint  Oracle Redo Logs
                     2014-11-03 15:13:02  Thread 2, Seqno 29, RBA 6584832
                     SCN 0.1614345 (1614345)

Current Checkpoint Detail:

Read Checkpoint #1  << 抽取进程的读检查点 节点1

  Oracle Threaded Redo Log

  Startup Checkpoint (starting position in the data source):
    Thread #: 1
    Sequence #: 11
    RBA: 6084096
    Timestamp: 2014-11-02 17:41:26.000000
    SCN: Not available
    Redo File:

Recovery Checkpoint 是续传时关注的位置
Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Thread #: 1
    Sequence #: 21  << 所在队列序号
    RBA: 26012176   << 所在队列中的具体位置
    Timestamp: 2014-11-03 15:13:04.000000  << 事务发起的时间戳
    SCN: 0.1614343 (1614343)
    Redo File: +DATA/prod/onlinelog/group_1.299.859509355

  Current Checkpoint (position of last record read in the data source):
    Thread #: 1
    Sequence #: 21
    RBA: 26012672
    Timestamp: 2014-11-03 15:13:04.000000
    SCN: 0.1614343 (1614343)
    Redo File: +DATA/prod/onlinelog/group_1.299.859509355

Read Checkpoint #2  << 抽取进程的读检查点 节点2

  Oracle Threaded Redo Log

  Startup Checkpoint (starting position in the data source):
    Thread #: 2
    Sequence #: 11
    RBA: 4263936
    Timestamp: 2014-11-02 17:41:26.000000
    SCN: Not available
    Redo File:

  Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Thread #: 2
    Sequence #: 29
    RBA: 6584336
    Timestamp: 2014-11-03 15:13:02.000000
    SCN: 0.1614345 (1614345)
    Redo File: +DATA/prod/onlinelog/group_3.301.859509357

  Current Checkpoint (position of last record read in the data source):
    Thread #: 2
    Sequence #: 29
    RBA: 6584832
    Timestamp: 2014-11-03 15:13:02.000000
    SCN: 0.1614345 (1614345)
    Redo File: +DATA/prod/onlinelog/group_3.301.859509357

Write Checkpoint #1

  GGS Log Trail

  Current Checkpoint (current write position):
    Sequence #: 47
    RBA: 1124760
    Timestamp: 2014-11-03 15:13:07.093886
    Extract Trail: /goldengate/dirdat/ex

CSN state information:
  CRC: E4-D6-3B-B4
  CSN: Not available

Header:
  Version = 2
  Record Source = A
  Type = 11
  # Input Checkpoints = 2
  # Output Checkpoints = 1

File Information:
  Block Size = 2048
  Max Blocks = 100
  Record Length = 4096
  Current Offset = 0

Configuration:
  Data Source = 3
  Transaction Integrity = 1
  Task Type = 0

Status:
  Start Time = 2014-11-03 13:23:05
  Last Update Time = 2014-11-03 15:13:07
  Stop Status = A
  Last Result = 0

当前源端有100万条记录:

SYS@PROD2 > select count(*) from snow.t1;

  COUNT(*)
----------
   1000000

系统时间为2014-11-03 15:37:08

SYS@PROD2 > alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SYS@PROD2 > select sysdate from dual;

SYSDATE
-------------------
2014-11-03 15:37:08

源端插入一条新数据,不提交

SYS@PROD2 > insert into snow.t1 values(1000001,'Snow');

1 row created.

SYS@PROD2 >

关闭源端所有Extract进程

GGSCI (node3) 4> stop *

Sending STOP request to EXTRACT DP1 ...
Request processed.

Sending STOP request to EXTRACT EX1 ...
Request processed.

观察最新的checkpoint信息

GGSCI (node3) 14> info ex1 showch

EXTRACT    EX1       Last Started 2014-11-03 15:41   Status RUNNING
Checkpoint Lag       00:00:02 (updated 00:00:01 ago)
Log Read Checkpoint  Oracle Redo Logs
                     2014-11-03 15:41:48  Thread 1, Seqno 21, RBA 27887616
                     SCN 0.1620285 (1620285)
Log Read Checkpoint  Oracle Redo Logs
                     2014-11-03 15:41:46  Thread 2, Seqno 29, RBA 7889920
                     SCN 0.1620284 (1620284)

Current Checkpoint Detail:

Read Checkpoint #1

  Oracle Threaded Redo Log

  Startup Checkpoint (starting position in the data source):
    Thread #: 1
    Sequence #: 21
    RBA: 27644432
    Timestamp: 2014-11-03 15:39:18.000000
    SCN: Not available
    Redo File: +DATA/prod/onlinelog/group_3.301.859509357

  Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Thread #: 1
    Sequence #: 21
    RBA: 27887120
    Timestamp: 2014-11-03 15:41:48.000000
    SCN: 0.1620285 (1620285)
    Redo File: +DATA/prod/onlinelog/group_1.299.859509355

  Current Checkpoint (position of last record read in the data source):
    Thread #: 1
    Sequence #: 21
    RBA: 27887616
    Timestamp: 2014-11-03 15:41:48.000000
    SCN: 0.1620285 (1620285)
    Redo File: +DATA/prod/onlinelog/group_1.299.859509355

Read Checkpoint #2

  Oracle Threaded Redo Log

  Startup Checkpoint (starting position in the data source):
    Thread #: 2
    Sequence #: 29
    RBA: 7750160
    Timestamp: 2014-11-03 15:39:16.000000
    SCN: Not available
    Redo File: +DATA/prod/onlinelog/group_3.301.859509357

  Recovery Checkpoint (position of oldest unprocessed transaction in the data source):
    Thread #: 2
    Sequence #: 29
    RBA: 7750160
    Timestamp: 2014-11-03 15:37:40.000000
    SCN: 0.1619666 (1619666)
    Redo File: +DATA/prod/onlinelog/group_3.301.859509357

  Current Checkpoint (position of last record read in the data source):
    Thread #: 2
    Sequence #: 29
    RBA: 7889920
    Timestamp: 2014-11-03 15:41:46.000000
    SCN: 0.1620284 (1620284)
    Redo File: +DATA/prod/onlinelog/group_3.301.859509357

Write Checkpoint #1

  GGS Log Trail

  Current Checkpoint (current write position):
    Sequence #: 48
    RBA: 1076
    Timestamp: 2014-11-03 15:41:50.718150
    Extract Trail: /goldengate/dirdat/ex

CSN state information:
  CRC: CE-DB-CE-78
  CSN: Not available

Header:
  Version = 2
  Record Source = A
  Type = 11
  # Input Checkpoints = 2
  # Output Checkpoints = 1

File Information:
  Block Size = 2048
  Max Blocks = 100
  Record Length = 4096
  Current Offset = 0

Configuration:
  Data Source = 3
  Transaction Integrity = 1
  Task Type = 0

Status:
  Start Time = 2014-11-03 15:41:29
  Last Update Time = 2014-11-03 15:41:50
  Stop Status = A
  Last Result = 0

Thread #: 1
Sequence #: 21
RBA: 27644432

Thread #: 2
Sequence #: 29
RBA: 7750160

修改抽取进程启动位置,两个进程

GGSCI (node3) 7> ALTER EXTRACT ex1, EXTSEQNO 21, EXTRBA 27644432 THREAD 1
EXTRACT altered.

GGSCI (node3) 8> ALTER EXTRACT ex1, EXTSEQNO 29, EXTRBA 7750160 THREAD 2
EXTRACT altered.

重启进程后源端发起提交命名,结束该事务。

SYS@PROD2 > commit;

Commit complete.
第1000001条数据插入完成

SYS@PROD2 > select count(*) from snow.t1;

  COUNT(*)
----------
   1000001

目标端第1000001条数据复制完成!

SQL> select count(*) from snow.t1;

  COUNT(*)
----------
   1000001

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注

Related Post