ESENT辅助索引已损坏,数据库必须进行碎片整理

时间:2015-06-12 08:21:48

标签: c++ c database winapi esent

我正在尝试通过esent.dll读取未安装的EDB文件。一切都适用于4k分页数据库,但当我尝试读取8k分页数据时,它返回错误-1414 - >辅助索引已损坏,数据库必须进行碎片整理。 但是使用eseutil进行碎片整理并不能解决问题。 (eseutil来自同一个Exchange服务器的bin文件夹,创建了.edb)

    JET_ERR err;
    JET_INSTANCE instance;
    JET_SESID sesid;
    JET_DBID dbid;
    JET_TABLEID tableid;

    JET_COLUMNDEF columndef = { 0 };
    JET_COLUMNID columnid;

    Call(JetSetSystemParameter(&instance, JET_sesidNil, 64, 8192, NULL));       //JET_paramDatabasePageSize  - 64
    Call(JetSetSystemParameter(&instance, JET_sesidNil, 34, 0, NULL));          //JET_paramRecovery  - 34
    //Call(JetSetSystemParameter(&instance, JET_sesidNil, JET_paramCircularLog, 1, NULL));
    Call(JetCreateInstance(&instance, "instance"));

    Call(JetInit(&instance));
    Call(JetBeginSession(instance, &sesid, 0, 0));

        JET_PCSTR FileName = "C:\\Users\\user\\Desktop\\EDB\\First Storage Group\\Mailbox Database.edb";
    Call(JetAttachDatabase(sesid, FileName, 0));`

它不会附加数据库..在你看来,这似乎是什么问题?

2 个答案:

答案 0 :(得分:0)

首先,不建议您使用ese.dll和esent.dll创建的数据库,反之亦然。尽管API非常相似,但存在内部差异。此外,esent.dll在MSDN上发布,ese.dll未发布。

您是否有理由使用esent.dll读取ese.dll创建的数据库?

二级索引损坏通常是由操作系统排序顺序更改引起的。对数据库进行碎片整理将读取原始数据库中的所有数据,并创建一个全新的数据库。二级指数完全重建。

既然您说过脱机碎片整理(eseutil.exe -d,对吗?)并没有帮助解决问题,那么可能不是因为操作系统排序顺序的改变。这可能是由于ese.dll和esent.dll之间的另一个内部差异造成的。

您还在谈论哪个版本的ese.dll和esent.dll?许多版本的Exchange都没有使用4k页面。

答案 1 :(得分:0)

有几个JET数据库引擎。 您可以在Microsoft Jet Database Engine

阅读有关它的摘要

JET Blue适用于Exchange Server和Active Directory,可扩展存储引擎(ESE)。 esent.dll 适用于Active Directory数据库。 ese.dll 是Exchange Server的一种实现。我想使用esent.dll来读取和修改Exchange数据库会破坏它。

用于Microsoft Access的JET Red存储引擎。