Berkeley DB SIGBUS错误

时间:2012-05-09 08:51:43

标签: c berkeley-db

我有以下程序创建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或这是一个错误?

1 个答案:

答案 0 :(得分:0)

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

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

您还可以转到事务数据存储。这会给你更多的恢复选择,可能更少的SIGBUSes。 :)