已索引

DM 最终是通过 dm.ini 和 dmarch.ini 来配置归档。
DM 数据库的归档可以分为 5 类:本地归档、远程归档、实时归档、即时归档和异步归档。

本地归档

本地归档就是将 REDO 日志写入到本地归档文件。最多可以设置 8 个本地归档。

开启归档

SQL> alter database mount;
SQL> alter database archivelog;
SQL> alter database add archivelog 'type=local,dest=/dmdb/dmarch/DMDB,file_size=1024,space_limit=10240';
这儿的 /dmdb/arch 其实是一个目录,其下生成归档文件,每个文件大小1G,总大小达到10G时,就会删除最旧的归档文件。
SQL> alter database open;
SQL> select t.* from v$dm_arch_ini t;

关闭归档

SQL> alter database mount;
SQL> alter database noarchivelog;
SQL> alter database delete archivelog 'type=local,dest=/dmdb/dmarch/DMDB';
SQL> alter database open;

也可以直接修改参数文件来配置。

SQL> select PARA_NAME,PARA_VALUE,SESS_VALUE,FILE_VALUE,PARA_TYPE,DESCRIPTION from v$dm_ini t where para_name like '%ARCH_INI%';

LINEID     PARA_NAME PARA_VALUE SESS_VALUE FILE_VALUE PARA_TYPE DESCRIPTION
---------- --------- ---------- ---------- ---------- --------- -----------
1          ARCH_INI  1          1          1          SYS       dmarch.ini

$ cat /dmdb/data/DEMODB/dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments

    ARCH_WAIT_APPLY      = 0        

[ARCHIVE_LOCAL1]
    ARCH_TYPE            = LOCAL        
    ARCH_DEST            = /dmdb/dmarch/DMDB        
    ARCH_FILE_SIZE       = 1024        
    ARCH_SPACE_LIMIT     = 10240        
    ARCH_FLUSH_BUF_SIZE  = 0        
    ARCH_HANG_FLAG       = 1        

也可以使用管理器来配置管理。如果是图形界面,先系统管理修改为配置,再到归档配置中去配置。

手动生成归档

alter SYSTEM SWITCH LOGFILE; 注意这个命令不是切换在线 redo 文件
alter DATABASE ARCHIVELOG CURRENT;
alter SYSTEM ARCHIVE LOG CURRENT;
这三条命令有什么区别?为什么都没有生成新的归档文件且现有归档文件的日志戳也没有更新。

归档文件的删除

SF_ARCHIVELOG_DELETE_BEFORE_LSN
SF_ARCHIVELOG_DELETE_BEFORE_TIME(sysdate -7);

案例描述:业务繁忙期间,出现磁盘 IO 不定时繁忙的情况。
问题原因:配置了归档的空间上限(归档达到此上限),生成新的归档日志前删除旧的归档日志文件。
解决办法:配置 JOB 作业,在业务空闲期定时清理 N 天之前的归档文件。

远程归档

远程归档专门用于 DMDSC 环境中。所谓远程归档(REMOTE ARCHIVE),顾名思义就是将归档目录配置在远程节点上。远程归档采用双向配置的方式,双向配置远程归档就是两个节点将自己的远程归档相互配置在对方机器上。集群中所有的节点,都拥有一套包括所有节点的,完整的归档日志文件。最多可以配置 8 个远程归档。

实时归档(Realtime)

在写入 REDO 日志到日志文件之,通过 MAL 系统发送 REDO 日志到远程服务器,远程服务器收到 REDO 日志后,返回确认消息。收到确认消息后,执行后续操作。发送 REDO 日志失败, 或从备库返回的数据库模式不是 STANDBY,将数据库切换为 SUSPEND 状态,阻塞所有 REDO 日志的写入操作。 换句话说,主库在 redo 日志写入联机日志文件前,将 redo 日志发送到备库,备库重演,不用等到重演完成,就回复主库收到日志了,主库立马写联机日志文件。实时归档只在主库生效。一个主库可以配置 1~8 个实时备库。

《DM8 - Data Watch And Read Write Shunt V4.0.pdf》:2.4 实时主备 > 2.4.1 主要功能 > 7. 读写分离访问:
在备库查询的实时性要求不高的条件下,实时主备也可以配置接口的读写分离属性访问,实现读写分离功能特性。详见 2.6 读写分离集群章节。

《DM8 - Data Watch And Read Write Shunt V4.0.pdf》:2.2 基本概念 > 2.2.11 归档介绍 > 2.2.11.4 实时归档
实时归档也可以支持读写分离集群,实时归档也分为两种模式:事务一致模式和高性能模式,可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。这两种模式的具体含义和即时归档中的完全相同,区别仅在于配置为实时归档时,dmarch.ini 中的 ARCH_WAIT_APPLY 配置项默认值为 0,即
采用高性能模式。

《DM8 - Data Watch And Read Write Shunt V4.0.pdf》:2.2 基本概念 > 2.2.11 归档介绍 > 2.2.11.4 实时归档
实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将Redo 日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原 KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库,不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将Redo 日志写入联机日志文件中。

实时归档流程图
图片来源:《DM8 - Data Watch And Read Write Shunt V4.0.pdf》:2.4 实时主备 > 2.4.2 归档流程

主库生成联机 Redo 日志,当触发日志写文件操作后,日志线程先将 RLOG_PKG 发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合法则返回错误信息,合法则作为 KEEP_RLOG_PKG 保留在内存中,原有 KEEP_RLOG_PKG 的 Redo 日志加入 Apply 任务队列进行 Redo 日志重演,并响应主库日志接收成功。当有
多个备库时,主库需要收到所有备库的响应消息才继续后续操作。

即时归档(Timely)

即时归档在主库将 Redo 日志写入联机 Redo 日志文件,再通过 MAL 系统将 Redo 日志发送到备库。即时归档与实时归档的主要区别是发送 Redo 日志的时机不同。一个主库可以配置 1~8 个即时备库。

dmarch.ini 中的 ARCH_WAIT_APPLY 表示是否等待重演完成。取值 0:高性能模式, 1:事务一致模式。本地归档取值NULL。

  • 事务一致模式
    主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。
  • 高性能模式
    与实时归档一样,备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。

事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。用户应该根据实际情况,选择合适的即时归档模式。

即时归档流程图
图片来源:《DM8 - Data Watch And Read Write Shunt V4.0.pdf》:2.6 读写分离集群 > 2.6.1 归档流程

异步归档(Async)

在设定的时间点或者每隔设定时间,启动归档 REDO 日志发送。设置定时归档,必须确保至少有一个本地归档。系统调度线程根据设定,触发归档 REDO 日志发送事件。通过 MAL 系统,获取远程服务器的当前 LSN,生成发送归档 REDO 日志任务,加入任务队列。归档任务线程获取任务,通过 MAL 系统,发送到远程服务器。

异步归档由主、备库上配置的定时器触发,根据异步备库的 KEEP LSN 信息,扫描本地归档目录获取 Redo 日志,并通过 MAL 系统将 Redo 日志发送到异步备库。异步备库的 Redo 日志重演过程与实时归档等其他类型的归档完全一致。

每个 Primary 或者 Standby 模式的库都可以配置最多 8 个异步备库,Normal 模式下配置的异步备库会自动失效。异步备库可以级联配置,异步备库本身也可以作为源库配置异步备库。配置了异步备库的 Primary 或者 Standby 模式的库,统称为源库。可以在实时主备、MPP 主备和读写分离集群的主库和备库上配置异步备库,异步备库可级联配置,异步备库本身也可以作为源库配置异步备库。

异步备库一般用于历史数据统计、周期报表等对数据实时性要求不高的业务场合。异步归档时机可以选择在源库空闲的时候,可避免源库的业务高峰期同步数据对性能的影响。

同步归档(Sync)

同步归档(Sync)在主库归档日志刷盘后,通过 MAL 系统将 Redo 日志发送到备库。同步备库的 Redo 日志重演过程与实时归档等其他类型的归档完全一致。一个主库可以配置1~8 个同步备库。

同步归档的执行流程为:主库在归档日志刷盘后,将 Redo 日志发送到备库,备库收到Redo 日志(RLOG_PKG)后,将其加入日志重演任务系统,并马上响应主库,不需要等待Redo 日志重演结束后再响应主库。

-- By 许望(RHCA、OCM、VCP)
最后修改:2025 年 03 月 13 日 02 : 30 PM
如果觉得我的文章对你有用,请随意赞赏