问题现象

客户使用一主一备做性能压测,主备机上设置了归档日志清理上下限:

ARCH_CLEAN_LOWER_THRESHOLD=12G

ARCH_CLEAN_UPPER_THRESHOLD=16G

但实际压测的过程,预期归档日志不应该超过16G,但还是产生了100G+的归档日志,占用了较多存储空间,最终磁盘空间满,客户怀疑归档清理策略没起效。

问题的风险及影响

客户环境为测试环境,影响测试业务的开展。

问题影响的版本

YashanDB版本:23.1.3.101

问题发生原因

归档日志在备份之前不会自动清理,设置归档上下限的同时,还需要设置归档日志清理忽略备份:

ARCH_CLEAN_IGNORE_MODE=BACKUP

解决方法及规避方式

设置ARCH_CLEAN_IGNORE_MODE=BACKUP,使用alter database delete archivelog all触发清理归档:

SQL> alter system set ARCH_CLEAN_IGNORE_MODE=BACKUP;
Succeed.
SQL> alter system set ARCH_CLEAN_LOWER_THRESHOLD=12G;
Succeed.
SQL> alter system set ARCH_CLEAN_UPPER_THRESHOLD=16G;
Succeed.
SQL> alter database delete archivelog all;
Succeed.

问题分析和处理过程

确认归档参数情况

SQL> show parameter ARCH
 
NAME VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
ARCHIVE_LOCAL_DEST ?/archive
ARCHIVE_DEST_1
ARCHIVE_DEST_2
ARCHIVE_DEST_3
ARCHIVE_DEST_4
ARCHIVE_DEST_5
ARCHIVE_DEST_6
ARCHIVE_DEST_7
ARCHIVE_DEST_8
ARCHIVE_DEST_9
ARCHIVE_DEST_10
ARCHIVE_DEST_11
ARCHIVE_DEST_12
ARCHIVE_DEST_13
ARCHIVE_DEST_14
ARCHIVE_DEST_15
ARCHIVE_DEST_16
ARCHIVE_DEST_17
ARCHIVE_DEST_18
ARCHIVE_DEST_19
ARCHIVE_DEST_20
ARCHIVE_DEST_21
ARCHIVE_DEST_22
ARCHIVE_DEST_23
ARCHIVE_DEST_24
ARCHIVE_DEST_25
ARCHIVE_DEST_26
ARCHIVE_DEST_27
ARCHIVE_DEST_28
ARCHIVE_DEST_29
ARCHIVE_DEST_30
ARCHIVE_DEST_31
ARCHIVE_DEST_32
ARCH_CLEAN_UPPER_THRESHOLD 16G
ARCH_CLEAN_LOWER_THRESHOLD 12G
ARCH_CLEAN_IGNORE_MODE NONE
ENABLE_ARCH_DATA_IGNORE_BACKUP FALSE
 
37 rows fetched.
 
SQL>

发现设置归档上下限但没有设置归档日志清理忽略备份。

YashanDB归档日志除了发送到备机之外,还可以使用backup命令做备份,详细参考YashanDB Doc

系统从安全的角度考虑,需要把日志备份之后,才允许删除,除非用户指定该场景下可以忽略备份。详细参考YashanDB Doc

客户的场景是需要主备同步,但是不需要备份拷贝,因此修改参数为ARCH_CLEAN_IGNORE_MODE=BACKUP

修改参数并验证

修改参数为ARCH_CLEAN_IGNORE_MODE=BACKUP可以使用alter database delete archivelog all; 检查日志是否清理掉,从而验证日志清理策略符合预期:

SQL> alter system set ARCH_CLEAN_IGNORE_MODE=BACKUP;
Succeed.
SQL> alter database delete archivelog all;
Succeed.

那么问题来了:是不是客户设置ARCH_CLEAN_IGNORE_MODE=BACKUP之后,日志就一定不会超过ARCH_CLEAN_UPPER_THRESHOLD呢?

答案是还是有可能超过。上面配置ARCH_CLEAN_IGNORE_MODE=BACKUP是忽略备份,所以还需要同步到备机之后,归档日志才能删除。客户的场景是一主一备做压测,备机同步日志较多,实际会有短暂备机没有同步完,导致归档日志超过上限一些的情况。

经验总结

归档日志在备份之前不会自动清理,设置归档上下限的同时,还需要设置归档日志清理忽略备份:ARCH_CLEAN_IGNORE_MODE=BACKUP