我在这里基本上试图实现的是恢复脏数据库的正确方法。如何使用微软的API恢复/恢复ESE数据库
esentutl /mh db.dat
产生以下输出
这是很好的,因为我把数据库的副本,而由另一程序中打开。
是否可以使用微软的JetBlue Api打开数据库而没有正确的日志& chk文件? (ESEDatabaseView确实不知何故,nirsoft.net)
如果这样的情况下,是不可能与微软的API,以及需要记录,什么是恢复数据库的正确方法(我改变了DB的&日志的位置)
这里是我的代码:
wpath p2 = L"C:\\m.db";
ULONG unPageSize;
long jet_err = JetGetDatabaseFileInfoW(p2.file_string().c_str(), &unPageSize, sizeof(unPageSize), JET_DbInfoPageSize);
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramDatabasePageSize, unPageSize, NULL);
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramRecovery, 0, "Off");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramLogFilePath, 0, "C:\\");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramSystemPath, 0, "C:\\");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramAlternateDatabaseRecoveryPath, 0, "C:\\");
if (jet_err != JET_errSuccess) {
return false;
}
JET_INSTANCE instance = { 0 };
jet_err = JetCreateInstance(&instance, "instance");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetInit(&instance);
if (jet_err != JET_errSuccess) {
JetTerm(instance);
return false;
}
JET_SESID sesid;
jet_err = JetBeginSession(instance, &sesid, 0, 0);
if (jet_err != JET_errSuccess) {
JetTerm(instance);
return false;
}
jet_err = JetAttachDatabaseW(sesid, pathESEDbLocation.file_string().c_str(), JET_bitDbReadOnly);
if (jet_err != JET_errSuccess) {
JetEndSession(sesid, 0);
JetTerm(instance);
return false;
}
JetAttachDatabaseW
失败-550 JET_errDatabaseDirtyShutdown
编辑我发现没有任何检查点和日志文件的调用esenutl /p data.dat
也解决了这个问题。我已经使用JetExternalRestoreW
命令尝试,但它不断抛出#define JET_errFileNotFound -1811 /* File not found */
JET_RSTMAP_W p = {L"C:/Users/user/AppData/Local/Temp/db/db.dat", L"C:/Users/user/AppData/Local/Temp/db/db.dat"};
jet_err = JetExternalRestoreW(nullptr, L"C:/Users/user/AppData/Local/Temp/db/", &p, 1,L"C:/Users/igalk/AppData/Local/Temp/db/", 0, 0, nullptr);