我正在尝试通过esent.dll读取已卸载的EDB文件。一切都适用于4k分页数据库,但是当我尝试读取8k分页数据库时,它返回错误1414->二级索引已损坏,必须对数据库进行碎片整理。
但是使用eseutil进行碎片整理无法解决问题。 (eseutil是从创建.edb的同一交换服务器的bin文件夹中获得的)

    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));`


而且它不会附加数据库。.您认为这是什么问题?

最佳答案

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

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

二级索引损坏通常是由于OS排序顺序更改所致。对数据库进行碎片整理将从原始数据库读取所有数据,并创建一个全新的数据库。二级索引已完全重新创建。

由于您说过脱机碎片整理(eseutil.exe -d,对吗?)不能解决问题,所以它可能不是由于操作系统排序顺序更改引起的。这可能是由于ese.dll和esent.dll之间的另一个内部差异。

您到底在谈论哪个版本的ese.dll和esent.dll? Exchange尚未在许多版本中使用4k页。

09-04 16:14
查看更多