问题现象
客户使用一主一备做性能压测,主备机上设置了归档日志清理上下限:
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
