0

我正在尝试通过 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));`

而且它不会附加数据库。在您看来,这似乎是什么问题?

4

2 回答 2

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 页面。

于 2015-06-12T13:23:09.033 回答
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 存储引擎。

于 2017-09-20T09:08:45.037 回答