如何计算给定 BDB 文件的 BerkeleyDB 转储/加载操作的持续时间?

Posted

技术标签:

【中文标题】如何计算给定 BDB 文件的 BerkeleyDB 转储/加载操作的持续时间?【英文标题】:How to calculate duration for a BerkeleyDB dump/load operation for a given BDB file? 【发布时间】:2016-07-30 14:06:19 【问题描述】:

我正在使用第 3 方应用程序,该应用程序使用 BerkeleyDB 作为其本地数据存储(称为 BMC Discovery)。随着时间的推移,它的 BDB 文件碎片化并变得大得离谱,BMC Software 编写了一个紧凑的实用程序,该实用程序基本上使用 db_dump 以新的文件名通过管道传输到 db_load,然后用重建的文件替换原始文件。

处理大文件所需的时间非常长,可能需要数小时,而其他一些相同大小的文件则需要一半的时间。它似乎真的取决于文件中的碎片程度和/或其中的数据类型(我假设?)。

提供的实用程序使用粗略的方法根据数据存储的总大小(由多个 BDB 文件组成)来估算持续时间。前任。如果大于 1G 说“需要几个小时”,如果大于 100G 说“需要很多小时”。这根本没有帮助。

我想知道是否有更好、更准确的方法,使用 BerkeleyDB.6.0(在 Red Hat 上)提供的命令来估计特定 BDB 文件的 db_dump/db_load 操作的持续时间?

注意:尽管这个问题提到了特定的第 3 方应用程序,但这只是为了让您了解上下文。这个问题对于 BerkelyDB 来说是通用的。

【问题讨论】:

【参考方案1】:

db_dump/db_load 是进行碎片整理的常用(便携)方式。

较新的 BDB(如过去 4-5 年,当然是 db-6.x)有一个 db_hotbackup(8) 命令,通过避免十六进制转换可能会更快。

(以下解决方案需要自定义编码)

还有一个 DB->compact(3) 调用“可选地将未使用的 Btree、Hash 或 Recno 数据库页面返回到底层文件系统。”。这可能会导致稀疏文件看起来大得离谱(使用“ls -l”),但实际上只使用了存储数据所需的块。

最后,还有 db_upgrade(8) / db_verify(8),两者都可以用 DB->set_feedback(3) 自定义,为长操作做回调(即进度条)。

首先,我会使用 db_tuner(8) 和 db_stat(8) 检查配置,并考虑一下调整 DB_CONFIG 中的参数。

【讨论】:

以上是关于如何计算给定 BDB 文件的 BerkeleyDB 转储/加载操作的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章

Subversion存储库类型

Berkeley DB 是不是只支持一种处理器操作

替换 libdb 文件以升级 Berkeley DB?

不同的 BerkeleyDB 版本有啥区别,我应该选择哪个?

关于 Berkeley DB - 创造环境之家

从 CLI 检查 Berkeley DB 文件