2015-09-28 4 views
0

Я пытаюсь прочитать базу данных ESE (.edb) с использованием библиотек ManagedEsent. Тем не менее, я получаю сообщение об ошибке при создании базы данных. Кажется, что ошибка возникла во время присоединения базы данных (вызов JetAttachDatabase()).Проблемы с попыткой доступа к базе данных ESE с помощью ManagedEsent

Сообщение об ошибке, которое я получаю: «Мягкое восстановление предназначено для резервной базы данных, вместо этого следует использовать восстановление».

Ниже мой код:

JET_INSTANCE instance; 
JET_SESID sesid; 

Microsoft.Isam.Esent.Interop.SystemParameters.DatabasePageSize = 8 * 1024; 

Api.JetCreateInstance(out instance, Guid.NewGuid().ToString()); 
Api.JetInit(ref instance); 

JET_DBID dbid; 
JET_COLUMNID columnid; 
JET_TABLEID tableid; 
JET_COLUMNDEF columndef = new JET_COLUMNDEF(); 

Api.JetBeginSession(instance, out sesid, null, null); 

Api.JetAttachDatabase(sesid, @"Blah.edb", AttachDatabaseGrbit.None); 

Api.OpenDatabase(sesid, @"Blah.edb", out dbid, OpenDatabaseGrbit.None); 

Исключение я получаю:

Microsoft.Isam.Esent.Interop.EsentSoftRecoveryOnBackupDatabase 
Soft recovery is intended on a backup database. Restore should be used instead 
at Microsoft.Isam.Esent.Interop.Api.Check(Int32 err) in e:\src\codeplex_svn\codeplex\EsentInterop\Api.cs:line 2894 
at Microsoft.Isam.Esent.Interop.Api.JetAttachDatabase(JET_SESID sesid, String database, AttachDatabaseGrbit grbit) in e:\src\codeplex_svn\codeplex\EsentInterop\Api.cs:line 372 

Любые идеи, что может быть причиной этого? Возможно ли, что файл .edb, который я прикрепляю, недействителен?

ответ

1

Откуда у вас база данных? То, что вы сделали, должно работать для базы данных Cleanly-shut-down. Вам не нужны файлы журнала транзакций для этих баз данных. Но есть и грязные базы данных (когда JetTerm не закончил изящно). Для них вам понадобятся файлы журнала транзакций. А также резервные базы данных, которые немного отличаются друг от друга. Для этих баз данных вам необходимо вызвать JetRestore.

-martin

+0

Спасибо Мартину за ваш ответ. База данных находится в стороннем приложении (например, не в базе данных Microsoft/Windows). Резервные файлы базы данных отличаются от файлов данных в реальном времени (.edb)? (Я ранее пытался запустить JetRestore в моем .edb-файле, но это не сработало, возможно, потому что это не настоящий файл резервной копии?) – Joe

+0

Да, они действительно немного разные. Причина связана с днями ленточных резервных копий, когда вам приходилось писать файл последовательно. Заголовок базы данных изменяется при записи большого файла базы данных, и к концу копирования большого количества данных вам необходимо написать обновленный заголовок. Это застревает в конце файла. JetRestore должен знать, как справиться с этой разницей. –

0

Я был в состоянии получить доступ к базе данных после запуска утилиты Esentutl восстановить файл базы данных:

esentutl /p Blah.edb 

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

+1

Да, «rePair» действительно следует называть «Спасение». Он делает все возможное, чтобы сделать базу данных доступной для чтения. если он не может понять, как спасти таблицу, он просто удалит таблицу. Он разработан, чтобы позволить вам получить доступ к * некоторым * вашим данным, и нет никакой гарантии, что вы не потеряете большой кусок данных. Что касается этого, вы можете посмотреть файл 'blah.integ.raw', который создает rePair. В нем перечислены все действия, которые он выполнил. –

+0

Спасибо Мартину за то, что он направил меня в файл .raw. Я посмотрел на него, и есть несколько строк, которые немного касаются: ОШИБКА: база данных не была выключена (Dirty Shutdown) ВНИМАНИЕ: Файл базы данных слишком велик (ожидается 299536 страниц, файл - 299537 страниц) , замена подписи Blah.edb просмотр базы данных со страницы 1 на страницу 299537 ошибка -1018 страница для чтения 299537.страница была обнулена, так что онлайн-резервное копирование будет работать Вставка страницы 299537 в таблицу BadPages – Joe

+0

Я не уверен, как приложение выполняет свою резервную копию «dbb» - оно должно делать это, не останавливая сервер сначала, основываясь на Сообщения об ошибках. Я тоже заметил, что был файл .log (edb00A55.log) и .pat-файл (Blah.pat) в той же папке, что и Blah.edb, которую я взял. Должен ли я каким-то образом использовать эти файлы для восстановления базы данных без потери данных? – Joe