归档是实现数据守护系统的重要技术手段,根据功能与实现方式的不同,DM 数据库的

归档可以分为 5 类:本地归档、远程归档、实时归档、即时归档和异步归档。其中,本地

归档和远程归档日志的内容与写入时机与数据库模式相关;主库 Redo 日志写入联机日志文件后,再进行本地归档和远程归档;备库收到主库产生的 Redo 日志后,直接进行本地归档 和远程归档,同时启动 Redo 日志重演。

1 本地归档

Redo 日志本地归档(Local),就是将 Redo 日志写入到本地归档日志文件的过程。

配置本地归档情况下,Normal/Primary 模式库在 Redo 日志写入联机 Redo 日志文件后,将对应的 RLOG_PKG 由专门的归档线程写入本地归档日志文件中。Standby 模式库收到主 库产生的 Redo 日志后,直接进行本地归档,写入本地归档日志文件中,同时启动 Redo 日 志重演。

Normal/Primary 模式库归档日志文件保存的是当前节点产生的 Redo 日志,归档日

志文件内容与联机日志内容保持一致。Standby 模式库重演日志重新产生的 Redo 日志只 写入联机日志文件,归档日志文件保存主库产生的 Redo 日志,因此备库联机日志文件内容和归档日志文件内容是不完全一致的。采用这种归档实现方式后,可以确保数据守护系统中所有节点的归档日志文件内容是完全一致的。

与联机 Redo 日志文件可以被覆盖重用不同,本地归档日志文件不能被覆盖,写入其中

的 Redo 日志信息会一直保留,直到用户主动删除;如果配置了归档日志空间上限,系统会 自动删除最早生成的归档 Redo 日志文件,腾出空间。本地归档文件在配置的归档目录下生 成并保存,如果磁盘空间不足,且没有配置归档日志空间上限(或者配置的上限超过实际空 间),系统将自动挂起,直到用户主动释放出足够的空间后继续运行。

DM 提供了按指定的时间或指定的 LSN 删除归档日志的系统函数,分别为

SF_ARCHIVELOG_DELETE_BEFORE_TIME 和

SF_ARCHIVELOG_DELETE_BEFORE_LSN,但用户需要谨慎使用。例如,在守护系统中,

如果备库故障了,主库继续服务,主库的日志在继续增长。此时如果删除尚未同步到备库的

主库归档日志,那么备库重启之后,会由于备库收到的日志缺失导致主备库无法正常同步数

据。

2 远程归档

远程归档专门用于 DMDSC 环境中。

所谓远程归档(REMOTE ARCHIVE),顾名思义就是将归档目录配置在远程节点上。远

程归档采用双向配置的方式,双向配置远程归档就是两个节点将自己的远程归档相互配置在

对方机器上。集群中所有的节点,都拥有一套包括所有节点的,完整的归档日志文件。

具体有两种配置方式:一是共享本地归档的远程归档,即将远程归档目录配置为另一节

点的本地归档目录,以此来共享它的本地归档日志文件;二是通过 MAL 发送的远程归档,

即将写入本地归档的 REDO 日志信息,通过 MAL 发送到远程节点,并写入远程节点的指定 归档目录中,形成远程归档日志文件。

配置远程归档后,DMDSC 集群中每个实例完整保存了集群所有实例产生的 Redo 日志,

任意实例都可以像访问本地归档一样,访问所有实例产生的归档日志。

远程归档的使用场景:

1.执行数据库恢复时,恢复工具(如 DMRMAN)所在节点需要访问其他各节点归档日志。

2.DMDSC 守护系统中进行主、备库异步归档日志的同步或备库恢复时,DMDSC 控制节

点作为发送端,需要访问其他从节点的归档日志。

3 归档文件

备库归档机制调整后,备库归档日志文件写入的并不是自己重演生成的 Redo 日志,而

是直接将主库产生的 Redo 日志写入到本地归档日志文件中。为了区分生成 Redo 日志和写

入 Redo 日志的库,归档日志文件头增加了几个 MAGIC 字段:

n PMNT_MAGIC

永久魔数,用来唯一标识数据库,初始化数据库时生成并保持不

变(DDL_CLONE 还原库除外),数据守护集群中所有主备库的 PMNT_MAGIC 是相同的。只 有 DDL_CLONE 还原库的 PMNT_MAGIC 会发生改变,当一个库使用 DDL_CLONE 备份集还 原并恢复之后,在执行 RECOVER DATABASE „„ UPDATE DB_MAGIC 时,PMNT_MAGIC 会发生改变。

n DB_MAGIC

数据库魔数,数据库初始化时生成,数据库还原后重新生成新的

DB_MAGIC,数据守护集群中所有主备库的 DB_MAGIC 是不同的。归档日志文件使用

DB_MAGIC 标识写入 Redo 日志的库。

n SRC_DB_MAGIC 源库魔数,产生 Redo 日志数据库的 DB_MAGIC 值;主库归档

日志文件中 SRC_DB_MAGIC 与 DB_MAGIC 相同;备库归档日志文件中 SRC_DB_MAGIC 与 主库的 DB_MAGIC 值相同。

Primary/Normal 模式库本地归档日志文件的命名方式调整为:

―ARCH_NAME_DB_MAGIC[SEQNO]_日期时间.log‖

其中 ARCH_NAME 是在 dmarch.ini 中配置的 LOCAL/REMOTE 归档名称,DB_MAGIC

是生成日志的数据库魔数,SEQNO 代表 DSC 节点号,日期时间是归档日志文件的创建时间。

例如:

―ARCHIVE_LOCAL1_0x567891[0]_2019-03-20_10-35-34.log‖

Standby 模式库(备库)生成的归档日志文件的命名方式调整为:

―STANDBY_ARCHIVE_DB_MAGIC[SEQNO]_日期时间.log‖

其中 STANDBY_ARCHIVE 表示备库生成的归档日志文件,DB_MAGIC 是生成日志的数

据库(主库)魔数,SEQNO 代表主库对应的 DSC 节点号,日期时间是归档日志文件的创建时间。

例如:

―STANDBY_ARCHIVE_0x123456[0]_2019-03-20_10-35-34.log

4 实时归档

与本地归档写入保存在磁盘中的日志文件不同,实时归档(Realtime)将主库产生的

Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。实时 归档只在主库生效,一个主库可以配置 1~8 个实时备库。

实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将 Redo

日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_PKG,将原 KEEP_PKG 加入日志重演任务系统,并马上响应主库,不需要等待 Redo 日志重演结束后再响应主库。 主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将 Redo 日志写入联机日志文件中。

另外,实时归档也可以支持读写分离集群,实时归档也分为两种模式:事务一致模式和

高性能模式,这两种模式的具体含义和下一小节“2.2.11.5”中的说明完全相同,区别仅

在于配置为实时归档时,dmarch.ini 中的 ARCH_WAIT_APPLY 配置项默认值为 0,即采用高性能模式。

5 即时归档

即时归档(Timely)在主库将 Redo 日志写入联机日志文件后,通过 MAL 系统将 Redo

日志发送到备库。即时归档与实时归档的主要区别是 Redo 日志的发送时机不同。一个主库 可以配置 1~8 个即时备库。

根据备库重演 Redo 日志和响应主库时机的不同,即时归档分为两种模式:事务一致模

式和高性能模式。即时归档模式根据配置文件 dmarch.ini 中的 ARCH_WAIT_APPLY 配置 项(默认值为 1)来确定,1 表示事务一致模式,0 表示高性能模式。

n 事务一致模式

主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发

送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交 请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行, 查询结果都满足 READ COMMIT 隔离级要求。

n 高性能模式 与实时归档一样,备库收到主库发送的 Redo 日志后,马上响应

主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下

延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。

事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完

成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则

通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。用户应该根据实际情况,选择合

适的即时归档模式。

6 异步归档

异步归档(Async)由主、备库上配置的定时器触发,根据异步备库的 KEEP LSN 信

息,扫描本地归档目录获取 Redo 日志,并通过 MAL 系统将 Redo 日志发送到异步备库。

异步备库的 Redo 日志重演过程与实时归档等其他类型的归档完全一致。

每个 Primary 或 Standby 模式的数据库最多可以配置 8 个异步备库,Normal 模式

下配置的异步备库会自动失效。异步备库可以级联配置,异步备库本身也可以作为源库配置

异步备库。

7 归档状态

本地归档、实时归档和即时归档均包含两种状态:Valid 和 Invalid。异步归档只有

一种归档状态:Valid。

n Valid

归档有效,正常执行各种数据库归档操作。

n Invalid

归档无效,主数据库不发送联机 Redo 日志到备数据库。

在不同的归档类型中,归档状态转换时机不同。具体转换时机描述如下:

1. 主备库启动后,主库到所有备库的归档默认为 Valid 状态,守护进程 Open 主库

前,根据主备库日志同步情况,将数据不一致备库的归档修改为 Invalid 状态。

2. 备库故障恢复,从主库同步历史数据后,守护进程将主库修改为 Suspend 状态,

并将主库到备库的归档状态从 Invalid 修改为 Valid。当守护进程再次 Open 主库后,主备库数据重新恢复为一致状态。

3. 主库发送日志到实时备库失败挂起,守护进程处理 Failover 过程中,将主库到

备库的归档状态修改为 Invalid。

4. 主库发送即时归档失败后,直接将主库到备库的归档改为 Invalid 状态。

5. 异步归档始终保持 Valid 状态,一旦归档失败马上返回,等待下一次触发再继续

发送。