伯克利 DB SIGBUS 错误

Posted

技术标签:

【中文标题】伯克利 DB SIGBUS 错误【英文标题】:Berkeley DB SIGBUS error 【发布时间】:2012-05-09 08:51:42 【问题描述】:

我有以下创建 Berkeley DB 环境的程序。

#include <db.h>
#include <stdio.h>

int main()

DB_ENV *env=NULL;
DB* m_db=NULL;

if(db_env_create(&env,0)==-1) printf("fail create\n");
env->set_lk_max_locks(env, 100000);
env->set_lk_max_lockers(env, 100000);
env->set_lk_max_objects(env, 100000);

if(env->open(env,"/tmp/cc", DB_INIT_MPOOL | DB_INIT_CDB, 0)!=0) 

    printf("No env, creating one\n");
    if(env->open(env, "/tmp/cc", DB_CREATE | DB_INIT_MPOOL | DB_INIT_CDB, 0) == -1)
        printf("Failed creating env\n");


env->close(env,0);  

return 0;

如果你删除 /tmp/cc/__db.002 文件(这是 Berkeley DB 创建的索引之一),然后重新运行程序,它会在打开环境时得到一个 SIGBUS(尝试映射一个非- 存在的文件)。有没有办法使用他们的 API 来避免这种情况,或者这是一个错误?

【问题讨论】:

为什么要检查文件是否存在,如果不存在,创建一个空文件? api不应该这样做吗? 【参考方案1】:

florinp,我认为这是 Berkeley DB 的错误。在继续之前确实应该检查环境中的文件是否完好无损。

当然,对于像这样被丢弃的 CDP 数据库,除了删除它并重新开始之外,您无能为力。如果这是您必须处理的常见故障类型,您可以使用查找退出状态 135 的 shell 脚本来包装您的程序,然后烘烤旧数据库并重新启动程序……但这可能会有风险,具体取决于您的应用程序.

您还可以迁移到事务性数据存储。这会给你更多的恢复选项,而且可能更少的 SIGBUS。 :)

【讨论】:

以上是关于伯克利 DB SIGBUS 错误的主要内容,如果未能解决你的问题,请参考以下文章

__db.001 在伯克利数据库中是啥意思?

什么是伯克利 DB 幻数?

未找到伯克利 DB -ldb_cxx

伯克利 DB 中的交易。快速地?

是否有可能获得平均伯克利数据库记录大小

清理 Berkeley DB 日志文件