2016-11-06 179 views
0

我在这里基本上试图实现的是恢复脏数据库的正确方法。如何使用微软的API恢复/恢复ESE数据库

esentutl /mh db.dat产生以下输出

enter image description here

这是很好的,因为我把数据库的副本,而由另一程序中打开。

是否可以使用微软的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); 

回答

0

异常关闭并不意味着它缺少记录,并检查文件...所以这可能是一个单独的问题。上述

您例如有东西在错误的顺序...

你可以配置你的应用程序自动尝试通过添加以下以清除“脏关机” JetCreateInstance后JetInit前:

Api.JetSetSystemParameter(instance, JET_SESID.Nil, Server2003Param.AlternateDatabaseRecoveryPath, 0, Path.GetDirectoryName(databasePath)); 

(以上示例使用C#,但您明白了......)

最后一个参数是您希望修复的数据库出现的位置,因此最有可能与目录相同脏数据库文件。