2016-11-06 3 views
0

То, что я в основном пытаюсь достичь здесь, - это правильный способ восстановления грязной БД.Как восстановить/восстановить БД ESE с помощью API Microsoft

esentutl /mh db.dat дает следующие выходные данные

enter image description here

это хорошо, потому что я взял копию БД в то же время открыт другой программой.

Можно ли открыть БД с помощью JetBlue Api от Microsoft без надлежащего журнала & chk файлов? (ESEDatabaseView делает это как-то, nirsoft.net)

Если такой случай не представляется возможным с API Microsoft, и нужны журналы, что правильный способ восстановления БД (я уже изменил мою децибел & журналы местоположение)

вот мой код:

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#, но вы получаете точку ...)

Последний параметр - это место, где вы хотите, чтобы отремонтированная база данных отображалась, поэтому, скорее всего, это будет тот же каталог, что и грязный файл базы данных.

Смежные вопросы