DM LSN 与 Oracle SCN 对比
1 DM LSN 和 Oracle SCN 概念
DM LSN(Log Sequence Number)是由系统自动维护的 Bigint 类型数值,具有自动递增、 全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。LSN 取值范围 0~正无穷大,新建的库 LSN 为 0,以后日志每被写入 一次,LSN 值增加 1。
物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理 系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性。
DM 数据库中与 LSN 相关的信息 ,可以通过查询 V\$RLOG 和 V\$RAPPLY_PARALLEL_INFO 表来获取。
Oracle SCN(System Change Number,系统改变号)是一个由系统内部进行维护的序列号。当系统需要更新时自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志,是数据库中非常重要的数据结构。注意SCN是有上限的,最大值参考官方文档或者在数据库中进行查询。
在数据库中SCN是作为一种类时钟机制来标记数据库动作。比如每当有一个事务发生,数据库会用一个SCN对它进行标记。SCN全局唯一,随时间的增长而增长,除非重建数据库这个值才会被重置。在数据库中,SCN就像血液一样无处不在,比如数据文件头,控制文件,数据块头,日志文件等都标记着SCN。也正因此数据库的一致性维护和SCN密切相关。不管是数据库备份还是恢复都是离不开SCN的。
2 DM LSN分类及与Oracle SCN对比
DM 主要包括以下几种类型的 LSN:
- CUR_LSN 是系统已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值,大小等于 CUR_LSN + 1,然后再修改 CUR_LSN=CUR_LSN+1。
(Oracle:Current SCN,Oracle 中表示当前数据库已分配的最大 SCN 值,随事务提交递增。CUR_LSN 更强调物理事务,Current SCN 同时支持逻辑事务和 MVCC。) - FILE_LSN 是已经写入联机 Redo 日志文件的日志包的最大 LSN 值。每次将 Redo 日志包 RLOG_PKG 写入联机 Redo 日志文件后,都要修改 FILE_LSN 值。
(Oracle:Redo Log SCN,表示已写入 Redo 日志的 SCN 值,FILE_LSN 明确与日志包。RLOG_PKG绑定,Redo Log SCN 与日志组管理相关。) - FLUSH_LSN 是已经发起日志刷盘请求,但还没有真正写入联机 Redo 日志文件的最大 LSN 值。
(无对标,FLUSH_LSN 是 DM 特有的概念,Oracle 没有明确区分“已发起刷盘但未写入”的 SCN,日志刷盘由 LGWR 异步处理。) - CKPT_LSN 是检查点 LSN,所有 LSN ≤ CKPT_LSN 的物理事务修改的数据页, 都已经从 Buffer 缓冲区写入磁盘,CKPT_LSN 由检查点线程负责调整。
(Oracle:Checkpoint SCN database,表示检查点完成时,所有 SCN ≤ Checkpoint SCN 的数据修改已写入数据文件[V$DATAFILE]。) - APPLY_LSN 是备库已写入联机 Redo 日志文件的日志包的原始最大 LSN 值,此 LSN 取自主库对应的原始日志包中的最大 LSN 值。如果主库是 DMDSC 集群,备库分别为主库每一个节点维护一个 APPLY_LSN。
(Oracle:Applied SCN,DG中表示备库已应用的主库 Redo 日志的 SCN 值。APPLY_LSN 在 DMDSC 集群中为主库每个节点单独维护,Applied SCN 在 Oracle Data Guard 中是全局的。) - RPKG_LSN 是备库重演 LSN,表示备库已经重演完成的最大 LSN。如果主库是 DMDSC 集群,备库分别为主库每一个节点维护一个 RPKG_LSN
(Oracle:Replayed SCN,DG中表示备库已重演(应用到数据库)的 SCN 值。RPKG_LSN 在 DMDSC 集群中为主库每个节点单独维护,Replayed SCN 是统一的。)
与上述 LSN 对应,DM 数据守护(Datawatch)也定义了一批 LSN:
- CLSN 与 CUR_LSN 保持一致,数据库已经分配的最大 LSN 值。
- FLSN 与 FILE_LSN 保持一致,已写入联机日志文件的 LSN 值。
- ALSN 与 APPLY_LSN 保持一致,备库已写入联机日志文件的原始 LSN 值。
- RLSN 与 RPKG_LSN 保持一致,备库已经重演完成的最大 LSN 值。
- SLSN 是 Standby LSN 的缩写,表示备库明确可重演的最大 LSN 值。
- KLSN 是 Keep LSN 的缩写,表示备库已经收到、但未明确是否可以重演的 RLOG_PKG 的最大 LSN 值。
- 在读写分离集群中 KLSN == SLSN。
3 DM LSN 查询方式
LSN 相关信息通过查询 V$RLOG 和 V$RAPPLY_PARALLEL_INFO 表获取。
SELECT CUR_LSN, FILE_LSN, CKPT_LSN FROM V$RLOG;
对于 DMDSC 集群中的 APPLY_LSN 和 RPKG_LSN,可通过 V$RAPPLY_PARALLEL_INFO 查看每个主库节点的对应值。