DSC 参数ARCH_HANG_FLAG对集群的影响
1 ARCH_HANG_FLAG 参数说明
ARCH_HANG_FLAG是一个配置参数,用于控制在本地归档写入失败时系统的行为。
官方文档说明:
- 定义:ARCH_HANG_FLAG 参数决定了当本地归档写入失败时,系统是否挂起以及如何处理写入失败的情况。
- 取值范围:0、1、2。默认为1
- 0:写入失败后不挂起,直接报错返回,不再尝试写入。
- 1:写入失败后挂起,反复尝试写入归档,直到写入成功。
- 2:写入失败后先删除最老的归档文件,再重新尝试写入,反复进行该过程直到归档写入成功,或者所有归档文件都已经被删除;若所有归档文件都已经被删除的情况下仍然写入失败,则直接报错返回,不再尝试写入。
2 环境准备与测试设计
2.1 环境说明
配置项 | 配置说明 |
---|---|
操作系统版本 | CentOS Linux release 7.9.2009 (Core) |
数据库版本 | DM Database Server x64 V8 |
DSC集群 | 2节点(DSC0,DSC1) |
共享存储 | +DMARCH0、+DMARCH1 |
归档配置 | 双路本地归档 |
本地归档1:ARCHIVE_LOCAL1 | +DMARCH0/DSC0、+DMARCH1/DSC1 |
本地归档2:ARCHIVE_LOCAL2 | /dmarch、/dmarch |
2.2 dmarch.ini文件配置
节点2示例文件:
ARCH_WAIT_APPLY = 0
ARCH_LOCAL_SHARE = 1
ARCH_LOCAL_SHARE_CHECK = 1[ARCHIVE_LOCAL1]ARCH_TYPE = LOCALARCH_DEST = +DMARCH1/DSC1ARCH_FILE_SIZE = 100ARCH_SPACE_LIMIT = 0ARCH_FLUSH_BUF_SIZE = 32ARCH_HANG_FLAG = 1[ARCHIVE_REMOTE1]ARCH_TYPE = REMOTEARCH_DEST = DSC0ARCH_INCOMING_PATH = +DMARCH0/DSC0ARCH_FILE_SIZE = 100ARCH_SPACE_LIMIT = 0ARCH_FLUSH_BUF_SIZE = 32[ARCHIVE_LOCAL2]ARCH_TYPE = LOCALARCH_DEST = /dmarchARCH_FILE_SIZE = 100ARCH_SPACE_LIMIT = 0ARCH_FLUSH_BUF_SIZE = 32ARCH_HANG_FLAG = 1
2.3 测试设计
当前集群为两节点DSC且每个节点均配置两路本地归档即ARCHIVE_LOCAL1、ARCHIVE_LOCAL2;
两路本地归档分别存放至ASM存储和本地文件系统;
为测试ARCH_HANG_FLAG参数配置对集群的影响,模拟以下场景:
- 本地第一路归档打满:
- ARCH_HANG_FLAG = 1
- ARCH_HANG_FLAG = 0
- ARCH_HANG_FLAG = 2
- 本地第二路归档打满:
- ARCH_HANG_FLAG = 1
- ARCH_HANG_FLAG = 0
- ARCH_HANG_FLAG = 2
- 本地第一、二路归档打满
2.4 测试准备动作
2.4.1 磁盘打满模拟
-- 对于本地文件系统,使用dd命令创建大文件以模拟归档目录打满
dd if=/dev/zero of=/dmarch bs=1024M count=5-- 对于ASM存储系统,使用达梦asmtool工具,创建asmfile以模拟归档目录打满
-- 使用lsdg查看磁盘组空间使用情况,创建asmfile单位为MB
$ /dm/dmdbms/bin/dmasmtool DCR_INI=/dm/dmdbms/dsc_config/dmdcr.ini
ASM> create asmfile '+DMARCH1/DSC1/fill1.dat' size 6912
2.4.2 事务操作模拟
-- 测试表创建删除
drop table test_remote_arch;CREATE TABLE test_remote_arch (id INT PRIMARY KEY,name VARCHAR(50),create_time DATETIME DEFAULT SYSDATE
);-- 模拟插入更新等操作
INSERT INTOtest_remote_arch (id, name)
SELECTLEVEL,'User_' || LEVEL
FROMDUAL CONNECT BY LEVEL <= 300000;UPDATE test_remote_arch
SETname = 'Updated_' || id
WHEREid BETWEEN 500 AND 1500;
3 测试流程及结果分析
确认两节点归档状态正常
[[29f0ffa2da81c9b9e811abbd6871f46a_MD5.png|Open: Pasted image 20250731134319.png]]
![[29f0ffa2da81c9b9e811abbd6871f46a_MD5.png]]
[[e33413c4f60cbfd942b95dabc0574f23_MD5.png|Open: Pasted image 20250731134324.png]]
![[e33413c4f60cbfd942b95dabc0574f23_MD5.png]]
3.1 第二路本地归档磁盘打满(ARCH_HANG_FLAG =1)
使用dd if=/dev/zero of=/dmarch/fillfile bs=1024M count=5
模拟归档磁盘打满
[[5086fce7b6e33c29d975096492804276_MD5.png|Open: Pasted image 20250731134711.png]]
![[5086fce7b6e33c29d975096492804276_MD5.png]]
模拟大事务操作观察如下:
数据库警告日志报错并且该日志不停刷新,表明在持续尝试写入归档日志。
而正在执行的事务挂起。
[[f804237a253b09fd98ee1b4900898a03_MD5.png|Open: Pasted image 20250731135427.png]]【节点2】
![[f804237a253b09fd98ee1b4900898a03_MD5.png]]
[[c03f2b70217d5147522f092f894ef12a_MD5.png|Open: Pasted image 20250731135525.png]]【节点1】
![[c03f2b70217d5147522f092f894ef12a_MD5.png]]
此时删除节点2创建的填充文件,再观察可知节点1和节点2均解除挂起状态且挂起事务恢复提交。
3.2 第一路本地归档磁盘打满(ARCH_HANG_FLAG =1)
模拟+DMARCH1/DSC1磁盘组打满
ASM> create asmfile '+DMARCH1/DSC1/fill.dat' size 7260
[[f6cf06d9e75fbe2712d29371b4f62b2d_MD5.png|Open: Pasted image 20250731170027.png]]
![[f6cf06d9e75fbe2712d29371b4f62b2d_MD5.png]]
模拟大事务操作观察如下:
数据库警告日志报错磁盘空间不足,此时集群整体挂起与第二路径归档打满现象相同,持续尝试写入归档日志,正在执行事务挂起且阻塞后续事务。
[[0b0343e995f4cad0a44b9d978ecda68b_MD5.png|Open: Pasted image 20250731170156.png]]【节点2】
![[0b0343e995f4cad0a44b9d978ecda68b_MD5.png]]
手动删除填充文件后,集群状态恢复,已有事务不回滚。
ASM>rm -f fill.dat
[[da960c9e37f73a9164e1dcb61da06aa1_MD5.png|Open: Pasted image 20250731170251.png]]【节点2】
![[da960c9e37f73a9164e1dcb61da06aa1_MD5.png]]
[!summary] ARCH_HANG_FLAG=1 结论
在达梦8 DSC集群环境中,配置ARCH_HANG_FLAG=1。当第一或二路本地归档磁盘空间耗尽,归档线程进入阻塞挂起状态,阻止后续日志切换和事务提交。新增事务无法提交,客户端连接呈现挂起状态(pending)。
集群整体进入停滞状态,所有节点均无法处理新请求,但已有事务未回滚。
优先保证实例存活避免数据不一致风险,但牺牲事务吞吐量。
3.3 第二路本地归档磁盘打满(ARCH_HANG_FLAG =0)
同样使用dd命令模拟归档磁盘打满,观察实例状态。
模拟大事务操作观察如下:
数据库警告日志报错磁盘空间不足,报错后,集群将该归档位置设置为INVALID,不再尝试在该目标位置写入。
[[4700e6350658d1146c217b02a4f0f83a_MD5.png|Open: Pasted image 20250731140643.png]]【节点2】
![[4700e6350658d1146c217b02a4f0f83a_MD5.png]]
此时尝试进行新事务写入,可以正常执行。
[[998decd471cd377ad25cfc0589cf367e_MD5.png|Open: Pasted image 20250731152323.png]]【节点2】
![[998decd471cd377ad25cfc0589cf367e_MD5.png]]
从数据库运行日志来看,在检测到本地归档路径空间不足时,该归档目标位置会置为INVALID,而后会持续进行检测。
检测有剩余空间则置为VALID,尝试归档写入,写入空间不足再置为INVALID。
[[2d4630846560cb647aa63fe1af9a51f6_MD5.png|Open: Pasted image 20250731153411.png]]【节点2】
![[2d4630846560cb647aa63fe1af9a51f6_MD5.png]]
手动清理填充文件后,运行日志恢复正常,对事务操作无影响。
[[9a622b814dc9e7f46a50978e8d7f6f24_MD5.png|Open: Pasted image 20250731164623.png]]
![[9a622b814dc9e7f46a50978e8d7f6f24_MD5.png]]
3.4 第一路本地归档磁盘打满(ARCH_HANG_FLAG =0)
同样使用create asmfile
命令模拟归档磁盘打满,观察实例状态。
模拟大事务操作观察如下:
数据库警告日志报错磁盘空间不足,报错后,集群将该归档位置设置为INVALID,不再尝试在该目标位置写入。
尝试进行新事务写入,可以正常执行,与第二路归档打满现象相同。
[[c47c61f598027a4c6745a062f09ba028_MD5.png|Open: Pasted image 20250731170711.png]]【节点2】
![[c47c61f598027a4c6745a062f09ba028_MD5.png]]
[[65eaba1c7be874560bb9952af5ffe06e_MD5.png|Open: Pasted image 20250731170720.png]]
![[65eaba1c7be874560bb9952af5ffe06e_MD5.png]]
在手动清理填充文件后,数据库恢复正常
[[ca9aa27511a20284add5ae80cf413ddd_MD5.png|Open: Pasted image 20250731170748.png]]
![[ca9aa27511a20284add5ae80cf413ddd_MD5.png]]
3.5 第一、二路本地归档磁盘同时打满(ARCH_HANG_FLAG =0)
分别使用dd
命令和create asmfile
命令模拟归档磁盘打满,观察实例状态。
模拟大事务操作观察如下:
数据库警告日志报错磁盘空间不足,报错后,集群将该归档位置设置为INVALID,不再尝试在该目标位置写入。
尝试进行新事务写入,可以正常执行,与单路径归档打满现象相同。
[[73bd1696b7a231792be8cbc765bd3196_MD5.png|Open: Pasted image 20250731171741.png]]【节点2】
![[73bd1696b7a231792be8cbc765bd3196_MD5.png]]
[!summary] ARCH_HANG_FLAG =0 结论
在达梦8 DSC集群环境中,配置ARCH_HANG_FLAG=0。当单路或双路本地归档磁盘空间耗尽,数据库运行日志提示归档失败磁盘空间不足。
集群事务执行不受影响,数据库持续检测归档空间。
空间不足 → 置为 INVALID → 持续检测 → 空间恢复 → 置为 VALID → 尝试写入 → 若再不足则再次置为 INVALID,以此循环。
最大限度保证了数据库可用,但可能导致归档缺失,进而影响后续数据的不完全恢复
3.6 第二路本地归档磁盘打满(ARCH_HANG_FLAG =2)
同样使用dd命令模拟归档磁盘打满,观察实例状态。
模拟大事务操作观察如下:
模拟大事务操作,数据库运行日志报错磁盘空间不足,报错后,数据库删除最早的归档文件。
不影响后续事务操作。
[[44b2a96be87ef47ee1512ceb858db0de_MD5.png|Open: Pasted image 20250731165053.png]]【节点2】
![[44b2a96be87ef47ee1512ceb858db0de_MD5.png]]
比对操作前后归档日志如下:
[[361874830c7351292a96ba6b0556bff6_MD5.png|Open: Pasted image 20250731165136.png]]
![[361874830c7351292a96ba6b0556bff6_MD5.png]]
手动清理填充文件后,数据库运行日志恢复正常,被删除归档未恢复。
如磁盘出现故障而非打满问题,将和ARCH_HANG_FLAG =1 情况相同
[[421be3215c2d6ad2c2171fc7dcedf9bb_MD5.png|Open: Pasted image 20250731173927.png]]
![[421be3215c2d6ad2c2171fc7dcedf9bb_MD5.png]]
3.7 第一路本地归档磁盘打满(ARCH_HANG_FLAG =2)
同样使用create asmfile
命令模拟归档磁盘打满,观察实例状态。
模拟大事务操作观察如下:
数据库警告日志报错磁盘空间不足,报错后,数据库删除最早的归档文件
尝试进行新事务写入,可以正常执行,与第二路归档打满现象相同。
[[7ae001033aadc646c87405650097cb30_MD5.png|Open: Pasted image 20250731171400.png]]【节点2】
![[7ae001033aadc646c87405650097cb30_MD5.png]]
[!summary] ARCH_HANG_FLAG =2 结论
在达梦8 DSC集群环境中,配置ARCH_HANG_FLAG=2。当第一或二路本地归档磁盘空间耗尽,数据库运行日志提示归档失败磁盘空间不足。会自动触发清理历史归档,集群事务执行不受影响。当所有归档均被清理,新归档仍无法写入时,则返回报错,不再尝试写入。
最大限度保证了数据库可用,但可能导致归档缺失,进而影响后续数据的不完全恢复
4 测试结论
ARCH_HANG_FLAG=1(默认值)
- 行为:当本地归档磁盘空间耗尽时,集群会挂起所有事务(包括新事务和未提交事务),持续尝试写入归档日志,直到空间恢复。
- 影响:
- 集群整体停滞,所有节点无法处理新请求。
- 优先保证数据一致性,但牺牲可用性。
- 适用场景:对数据一致性要求极高的系统,需接受服务中断风险。
ARCH_HANG_FLAG=0
- 行为:归档磁盘满时,自动将故障路径标记为 INVALID,停止写入并继续处理事务。持续检测空间,恢复后自动置为 VALID。
- 影响:
- 事务不受影响,但归档可能缺失(影响数据恢复)。
- 双路归档同时故障时仍可提供服务。
- 适用场景:高可用性优先的系统,需接受归档不完整的风险。
ARCH_HANG_FLAG=2
- 行为:磁盘满时自动删除最早归档文件以腾出空间,继续写入新归档。若所有归档均被删除仍无法写入,则报错停止。
- 影响:
- 事务不受影响,但历史归档可能丢失(影响数据恢复)。
- 空间临时不足时可自救,但需监控归档完整性。
- 适用场景:归档空间有限且允许部分历史数据丢失的场景。
5 运维建议及注意事项
参数选择原则:
- 一致性优先:ARCH_HANG_FLAG=1(如核心数据库)。需确保归档磁盘空间充足,并设置实时监控告警;
- 可用性优先:ARCH_HANG_FLAG=0(如高并发业务系统)。需配合独立备份机制,避免归档缺失导致数据无法恢复;
- 平衡策略:ARCH_HANG_FLAG=2(需定期清理归档)。结合 ARCH_SPACE_LIMIT 限制总空间。
运维建议:
- 监控归档空间:实时检测归档目录使用率,避免空间耗尽引发故障。
- 设置多路归档:配置两路本地归档(如 ASM + 本地文件系统),可以有效避免单点故障导致服务中断。
- 定期清理归档:确保归档保留策略(ARCH_SPACE_LIMIT)设置的合理性,避免历史数据丢失。
https://eco.dameng.com