我使用 Berkeley DB 的 db_archive 将未使用的事务日志移动到备份位置,以便进行灾难恢复。目的是将数据丢失窗口缩短到 N 分钟。因此,我每 N 分钟执行一次 db_archive。如果事务吞吐量足够高,以至于最大事务日志大小导致创建新的事务日志,并且发生数据库检查点,导致旧日志变为未使用的,则该策略将按预期工作。但是,如果吞吐量最小,则只有在达到最大事务日志大小并且检查点释放旧日志后才会发生归档。因此,由于日志未被归档,因此无法恢复这些更改。
有没有办法强制事务日志轮换,以确保即使不会导致创建新事务日志的更改也会定期存档?通过减少最大事务日志大小,情况可能会有所改善,但无法得到解决。我能想到的办法是在触发检查点和调用 db_archive 之前使用 Berkeley DB API DB_ENV->log_put() 编写自定义适当大小的事务日志条目来强制轮换,但这听起来仍然不像是一个可用于生产的解决方案。
提前感谢关于这个主题的任何补充信息!
答案1
可以做到,但是根据 4.7.25/6.2.23 源代码中现有的调用点,该场景肯定需要代码来执行此操作(没有任何实用程序调用帮助程序)。内部函数__log_newfile
可用于切换到新的日志文件:
int __log_newfile __P((DB_LOG *, DB_LSN *, u_int32_t, u_int32_t));
检查点之后,旧日志文件将变为未使用状态并可供归档。