前言
众所周知,Oracle 数据库要使用实时热备份功能必须要开启归档模式,达梦数据库也是如此,必须要配置本地归档,才可以使用实时备份功能。
那么达梦数据库的归档模式是如何管理的?
介绍
达梦数据库既可以运行在归档模式下也可以运行在非归档模式下:
- 归档模式:联机日志文件中的内容将被保存至硬盘,形成归档日志文件;
- 非归档模式:则不会形成归档日志。
采用归档模式对系统的性能会产生一定影响,但对系统的安全性有更大的积极意义,当出现故障时其丢失数据的可能性更小。这是因为一旦出现介质故障,如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,而如果没有归档日志文件,则只能利用备份进行恢复到备份那一刻。
达梦数据库的归档模式可以分为 6 类:
- 本地归档:在 REDO 日志写入联机日志文件后触发,将 REDO 日志写入到本地归档文件。由归档线程完成本地归档动作,最多可以设置 8 个本地归档。
- 远程归档:远程归档专门用于 DMDSC 环境中。将写入本地归档的 REDO 日志信息,发送到远程节点,并写入远程节点的指定归档目录(共享存储)中。最多可以配置8个远程归档。
- 实时归档:在写入 REDO 日志到联机日志文件之前,通过 MAL 系统发送 REDO 日志到远程服务器,远程服务器接收到 REDO 日志后,返回确认消息后,执行后续操作。发送 REDO 日志失败,或从备库返回的数据库模式不是 STANDBY,将数据库切换为 SUSPEND,阻塞所有 REDO 日志的写入操作。只能配置 1 个实时归档。这种归档类型只能用在主从备份集群中。
- 即时归档:即时归档在主库将 REDO 日志写入联机日志文件后,再通过 MAL 系统将 REDO 日志发送到备库。即时归档是读写分离集群的实现基础,与实时归档的主要区别是发送 REDO 日志的时间不同。一个主库可以配置 1-8 个即时备库。
- 异步归档:在设定的时间点或者每隔设定时间,启动归档 REDO 日志发送。设置定时归档,必须确保至少有一个本地归档。最多可以设置 8 个异步归档。
- 同步归档:同步归档的执行流程是,主库在归档日志刷盘后,将 REDO 日志发送到备库,备库收到 REDO 日志(RLOG_PKG)后将其加入日志重演任务系统,并马上响应主库,不需要等待 REDO 日志重演结束后再响应主库。
根据功能与实现方式的不同,用户可以自行选择使用哪一种归档方式,本文主要讲解本地归档的管理方式。
开启本地归档
达梦数据库开启数据库本地归档通常可以通过以下两种方式实现:
- 方式一:通过 SQL 命令方式开启归档(数据库实例启动)
- 方式二:通过修改数据库配置文件方式开启归档(数据库实例未启动)
达梦数据库建议使用本地归档目录位置:/dmarch
:
mkdir /dmarch
chown dmdba:dinstall /dmarch
chmod -R 755 /dmarch
创建好本地归档目录之后就可以开始配置数据库。
SQL 命令方式
使用 SQL 语句配置数据库归档,语法如下:
ALTER DATABASE <修改数据库子句>;
<修改数据库子句>::= <数据库状态> | <ADD | MODIFY | DELETE> ARCHIVELOG <归档配置语句> | ARCHIVELOG CURRENT
<数据库状态>::= MOUNT | SUSPEND | OPEN [FORCE] | NORMAL | PRIMARY | STANDBY | ARCHIVELOG | NOARCHIVELOG
<归档配置语句>::= 'DEST = <归档目标>, TYPE = <归档类型>'
<归档类型>::=
LOCAL [<文件和空间限制设置>][,ARCH_FLUSH_BUF_SIZE = <归档合并刷盘缓存大小>][, HANG_FLAG=<0|1>] | REMOTE ,INCOMING_PATH = <远程归档路径> |
<文件和空间限制设置>::=[,FILE_SIZE = <文件大小>][,SPACE_LIMIT = <空间大小限制>]
查看是否开启归档模式:
-- 当前未开启归档模式
SQL> select arch_mode from v$database;
行号 ARCH_MODE
---------- ---------
1 N
登录数据库执行如下 SQL 语句:
-- 打开数据库到 mount 状态
SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 2.143(毫秒). 执行号:0.
-- 开启归档模式
SQL> ALTER DATABASE ARCHIVELOG;
操作已执行
已用时间: 48.305(毫秒). 执行号:0.
-- 注意:这里添加了本地归档参数之后,即使关闭归档模式,配置依然会存在,需要手工删除配置
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
操作已执行
已用时间: 16.683(毫秒). 执行号:0.
-- 打开数据库
SQL> ALTER DATABASE OPEN;
操作已执行
已用时间: 31.888(毫秒). 执行号:0.
-- 数据库已开启归档模式
SQL> select arch_mode from v$database;
行号 ARCH_MODE
---------- ---------
1 Y
SQL> select arch_name,arch_type,arch_dest,arch_file_size,arch_space_limit from v$dm_arch_ini;
行号 ARCH_NAME ARCH_TYPE ARCH_DEST ARCH_FILE_SIZE ARCH_SPACE_LIMIT
---------- -------------- --------- --------- -------------- ----------------
1 ARCHIVE_LOCAL1 LOCAL /dmarch 2048 102400
使用命令行开启归档后,在 /dmdata/DAMENG/
目录下会生成一个归档参数配置文件:
[dmdba@dm8:/dmdata/DAMENG]$ cat dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
ARCH_FLUSH_BUF_SIZE = 2
ARCH_HANG_FLAG = 1
切换归档,三条语句都可以执行切换:
SQL> alter database archivelog current;
操作已执行
已用时间: 1.009(毫秒). 执行号:0.
SQL> alter system archive log current;
操作已执行
已用时间: 0.722(毫秒). 执行号:0.
SQL> alter system switch logfile;
操作已执行
已用时间: 0.932(毫秒). 执行号:0.
关闭归档模式:
SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 7.742(毫秒). 执行号:0.
SQL> ALTER DATABASE NOARCHIVELOG;
操作已执行
已用时间: 11.444(毫秒). 执行号:0.
SQL> ALTER DATABASE OPEN;
操作已执行
已用时间: 10.938(毫秒). 执行号:0.
删除归档路径配置(目前达梦不允许删除本地归档配置,建议关闭归档之后,保留归档配置即可):
-- 数据库打开状态下,删除本地归档配置报错
SQL> ALTER DATABASE DELETE ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
ALTER DATABASE DELETE ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
第1 行附近出现错误[-981]:OPEN状态下仅允许删除REALTIME、TIMELY或ASYNC归档.
-- 数据库 mount 状态下,删除本地归档配置报错
SQL> alter database mount;
操作已执行
SQL> ALTER DATABASE DELETE ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
ALTER DATABASE DELETE ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
第1 行附近出现错误[-2004]:不支持的语句类型.
-- 数据库非归档模式下,删除本地归档配置报错
SQL> alter database noarchivelog;
操作已执行
SQL> ALTER DATABASE DELETE ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
ALTER DATABASE DELETE ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=102400';
第1 行附近出现错误[-810]:系统未配置归档.
配置参数文件方式
修改数据库实例的 /dmdata/DAMEGN/dm.ini 文件中 ARCH_INI 参数值:
## 查看参数文件中归档模式参数值,0 为未开启
[dmdba@dm8:~]$ cat /dmdata/DAMENG/dm.ini | grep -i arch_ini
ARCH_INI = 0 #dmarch.ini
## 修改参数文件
[dmdba@dm8:~]$ sed -i s/'ARCH_INI = 0'/'ARCH_INI = 1'/g /dmdata/DAMENG/dm.ini
## 查看修改后的参数值,1 为开启归档
[dmdba@dm8:~]$ cat /dmdata/DAMENG/dm.ini | grep -i arch_ini
ARCH_INI = 1 #dmarch.ini
新增文件 dmarch.ini 文件(如果使用命令行开启过则会自动生成一个文件,修改对应配置参数即可):
## 这里模拟没有这个文件,所以我们新建一个
[dmdba@dm8:~]$ cat<<-\EOF>/dmdata/DAMENG/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
EOF
重启数据库完成归档配置:
[dmdba@dm8:~]$ DmServiceDMSERVER restart
Stopping DmServiceDMSERVER: [ OK ]
Starting DmServiceDMSERVER: [ OK ]
查看归档是否开启:
SQL> select arch_mode from v$database;
行号 ARCH_MODE
---------- ---------
1 Y
归档日志清理
归档手动删除:
-- 归档删除相关的系统函数
SQL> select name from d t where name like 'SF_ARCHIVELOG_%';
行号 NAME
---------- --------------------------------
1 SF_ARCHIVELOG_DELETE_BEFORE_LSN
2 SF_ARCHIVELOG_DELETE_BEFORE_LSN
3 SF_ARCHIVELOG_DELETE_BEFORE_TIME
4 SF_ARCHIVELOG_DELETE_BEFORE_TIME
已用时间: 7.327(毫秒). 执行号:603.
-- 删除 7 天前的归档日志
SQL> select SF_ARCHIVELOG_DELETE_BEFORE_TIME(sysdate-7);
-- 删除某个 lsn 之前的归档
SQL> select SF_ARCHIVELOG_DELETE_BEFORE_LSN(43502);
归档自动删除:
## 配置 dmarch.ini 可以设置保留期,到期自动清理,归档日志保留时间,单位分钟
arch_reserver_time
归档日志检测
达梦数据库提供了归档校验工具 dmrachk,它可以查看归档日志的状态信息,以及校验归档日志是否连续或者存在不足的情况。
查看 dmrachk 帮助提示:
[dmdba@dm8:~]$ dmrachk help
rachk V8
version: 03134284194-20240703-234060-20108 Pack1
格式: dmrachk keyword=value
例程: dmrachk F_TYPE=2 F_PATH=/opt/a.log OP_TYPE=2
关键字 说明(默认值)
--------------------------------------------------------------------------------
F_TYPE 必选,表示读入的日志文件类型,与F_PATH配合使用
1 F_PATH必须指向归档目录
2 F_PATH必须指向某个归档文件
F_PATH 必选,对应F_TYPE的路径
OP_TYPE 可选,操作类型,对应不同的F_TYPE,默认为2
当F_TYPE = 1:
1 归档比较,比较两个目录的LSN和PTX差异
2 归档校验,检查归档文件有效性
3 归档抽取,指定新的文件,用于存储从指定seq范围的归档中抽取的数据
4 去重修复,去除归档目录下存在重复的归档日志,将存在重复的归档拷贝到备份文件路径下
5 缺失修复,使用F_PATH目录中的归档文件来修复RECV_PATH目录中的归档文件
6 密钥更新,更新归档文件加密密钥
当F_TYPE = 2:
1 归档比较,比较两个归档文件的LSN和PTX差异
2 归档校验,检查归档文件有效性
3 归档截取,不论归档是否有效,截取到最后一条有效lsn写入截取文件
CMP_FIL 归档比较必选,指定一个用于比较的归档文件
CMP_PATH 归档比较必选,指定一个用于比较的归档目录
BEGIN_LSN 归档比较和校验可选,指定归档目录时,指定排除小于该LSN的文件,默认为0表示不启用
END_LSN 归档比较和校验可选,指定归档目录时,指定排除大于该LSN的文件,默认为0表示不启用
CHECK 归档校验可选,校验级别(0, 1, 2, 3, 4, 5, 6) 0: 文件校验,1: 包校验(seq & magic),2:ptx校验,3:rrec校验,4:清理无效的归档文件, 5:各节点日志包依赖关系检查,6:修复归档文件到free之后的最后一个有效日志包。默认0,CHECK=4,CHECK=5只在F_TYPE=1时有效
BEFORE_LSN CHECK=4可选,指定归档目录,删除该LSN之前的文件。默认为0,所有LSN范围内日志均删除
BEFORE_SEQ CHECK=4可选,指定归档目录,删除该SEQ之前的文件。默认为0,所有SEQ范围内日志均删除
BEFORE_TIME CHECK=4可选,指定归档目录,删除该时间点之前的文件。默认删除所有时间点的归档
EXCLUDE_DB_MAGIC CHECK=4可选,指定归档目录,删除指定的DB_MAGIC之外的文件
ARCH_PATH_INI CHECK=5可选,指定dsc节点的归档存放路径配置文件
TRUNC_FIL 归档截取必选,指定新的文件,用于存储从归档中抽取的数据
AFTER_FREE 归档截取可选,是否校验并截取FREE之后的内容。0 不截取;1 截取。默认0
TRUNC_CHECK 归档截取可选,是否校验归档文件。0 不校验;1 校验。默认0
ARCH_BAK_PATH 去重修复必选,指定备份文件路径,用于存储归档修复过程中的重复文件
RECV_PATH 缺失修复必选,指定一个待修复的归档目录
EXTRACT_FIL 归档抽取必选,指定新的文件,用于存储从指定的seq范围的归档文件中抽取的数据
BEGIN_SEQ 归档抽取必选,指定归档目录时,抽取大于该SEQ的文件
END_SEQ 归档抽取必选,指定归档目录时,抽取小于该SEQ的文件
CYT_UPDATED_PATH 密钥更新可选,归档密钥更新目标文件所在目录。未指定时,直接在原文件上更新;若指定,则更新到新的路径,原文件保持不变
OUTPUT_FIL 可选,LOG可以指定输出到文件
DCR_INI 可选,指定dmdcr.ini路径,用于当前归档文件或者目录在ASM文件系统的情况,若不指定,则不访问ASM。默认不指定
DM_INI 可选,指定dm.ini的路径,用于获取日志加密信息
HELP 显示帮助信息
dmrachk 指定归档目录检测归档日志:
[dmdba@dm8:~]$ dmrachk F_TYPE=1 F_PATH=/dmarch
rachk V8
the database pmnt_magic: 1418059711
the database db_magic: 1447746390
/*******************************************************************/
归档文件/dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_20-43-01.log明细.
version : 0x7007
status : INACTIVE
enc_flag : FALSE
n_rpkgs : 4
pmnt_magic : 1418059711
db_magic : 1447746390
src_db_magic : 1447746390
arch_lsn : 43502
arch_seq : 3217
clsn : 43544
next_seq : 3220
g_next_seq : 3220
file len : 36864
file free : 36864
dsc seqno : 0
dsc node : 1
create time : 2024-09-18 20:43:01.555674 time_zone:+08:00
close time : 2024-09-18 20:44:00.794390 time_zone:+08:00
llog first time : 1900-01-01 00:00:00.000000 time_zone:+08:00
llog last time : 1900-01-01 00:00:00.000000 time_zone:+08:00
/*******************************************************************/
/*******************************************************************/
归档文件/dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_21-19-01.log明细.
version : 0x7007
status : INACTIVE
enc_flag : FALSE
n_rpkgs : 5
pmnt_magic : 1418059711
db_magic : 1447746390
src_db_magic : 1447746390
arch_lsn : 43665
arch_seq : 3229
clsn : 43742
next_seq : 3233
g_next_seq : 3233
file len : 49152
file free : 49152
dsc seqno : 0
dsc node : 1
create time : 2024-09-18 21:19:01.783604 time_zone:+08:00
close time : 2024-09-18 21:23:59.589803 time_zone:+08:00
llog first time : 1900-01-01 00:00:00.000000 time_zone:+08:00
llog last time : 1900-01-01 00:00:00.000000 time_zone:+08:00
/*******************************************************************/
/*******************************************************************/
归档文件/dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_21-41-33.log明细.
version : 0x7007
status : ACTIVE
enc_flag : FALSE
n_rpkgs : 6
pmnt_magic : 1418059711
db_magic : 1447746390
src_db_magic : 1447746390
arch_lsn : 43890
arch_seq : 3241
clsn : 43965
next_seq : 3246
g_next_seq : 3246
file len : 2147483648
file free : 45056
dsc seqno : 0
dsc node : 1
create time : 2024-09-18 21:41:33.701013 time_zone:+08:00
close time : 2024-09-18 21:41:33.701013 time_zone:+08:00
llog first time : 1900-01-01 00:00:00.000000 time_zone:+08:00
llog last time : 1900-01-01 00:00:00.000000 time_zone:+08:00
/*******************************************************************/
概要(节点[0]):
总计: 3 个文件
正确: 3 个文件
错误: 0 个文件
重复: 0 个文件
F_PATH的归档文件链表是不连续的。
breakpoint 0:
the left file /dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_20-43-01.log, clsn: 43544, next_seq: 3220
the right file /dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_21-19-01.log, arch_lsn: 43665, arch_seq: 3229
breakpoint 1:
the left file /dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_21-19-01.log, clsn: 43742, next_seq: 3233
the right file /dmarch/ARCHIVE_LOCAL1_0x564ADB56_EP0_2024-09-18_21-41-33.log, arch_lsn: 43890, arch_seq: 3241
the rachk tool running cost 1.143 ms, code:0
相关数据字典
最后再介绍一下归档相关的数据字典视图:
-- 显示当前实例的所有归档日志文件信息。
V$ARCHIVED_LOG
-- 用来存放归档路径等相关归档参数信息。
V$DM_ARCH_INI
-- 查询本地归档日志信息。对DMDSC集群,除了显示本地归档外,也显示远程归档信息。
V$ARCH_FILE
-- 显示当前归档任务队列信息。
V$ARCH_QUEUE
-- 用于在主库上查询各备库的日志发送统计信息。
V$ARCH_SEND_INFO
-- 查询归档状态信息,归档状态是由主库记录和维护的,此视图只在主库上查询有效,备库上的查询结果没有实际意义。
V$ARCH_STATUS
-- 显示备份集的归档信息。
V$BACKUPSET_ARCH
-- 查询 V$BACKUPSET_SEARCH_DIRS 显示当前会话已添加的备份目录,即备份集搜索目录。若用户没有添加备份目录,那么仅显示默认的备份目录。
V$BACKUPSET_SEARCH_DIRS
今天主要学习了达梦数据库的本地归档管理方式以及一些归档管理的知识,如有错误或者不足,欢迎补充。