пятница, 18 июля 2014 г.

SQLite - ручной ремонт базы данных

Всем привет.
Иногда в результате сбоя (обычно по питанию) "ломается" база данных и как правило ломается
центральный файл FlylinkDC.sqllite и программа FlylinkDC++ падает с сообщением
об ошибке вида - SQLIte database disk image is malformed 

Автоматического ремонта у меня пока нет.
расскажу как можно сделать это руками 

1. Закрываете флайлинк
2. Качаете консольную утилиту sqlite3.exe последней версии тут http://sqlite.org/download.html (Precompiled Binaries for Windows)

    на сегодня это вот такая версия: http://sqlite.org/2014/sqlite-shell-win32-x86-3080500.zip
3. Раскрываете архив рядом с FlylinkDC.sqllite (там должен появиться файл sqlite3.exe)

4. Создаете резервный архив файлов *.sqlite
5. Cоздаете рядом бат-файл repair-sqlite.bat с содержимым

echo PRAGMA integrity_check; | sqlite3.exe FlylinkDC.sqlite
sqlite3.exe FlylinkDC.sqlite .dump > FlylinkDC.sql
sqlite3.exe FlylinkDC-new.sqlite < FlylinkDC.sql
echo PRAGMA integrity_check; | sqlite3.exe FlylinkDC-new.sqlite
ren FlylinkDC.sqlite FlylinkDC-old.sqlite
ren FlylinkDC-new.sqlite FlylinkDC.sqlite
del FlylinkDC.sql
pause


6. Запускаете repair-sqlite.bat он попытается починить базу данных.
7. После завершения батника запускаете флайлинк.
8. Сообщаете об успешном/не успешном лечении.
 
У меня на битом файле прошло вот так:

C:\!dc-db\db-sqlite-corrupt\db-bug-3>echo PRAGMA integrity_check;  | sqlite3.exe FlylinkDC.sqlite
*** in database main ***
On tree page 55555 cell 56: Rowid 8246430 out of order (max larger than parent max of 8246390)
On tree page 67284 cell 69: Rowid 8246524 out of order (max larger than parent max of 8246478)
Page 67283: btreeInitPage() returns error code 11
Error: near line 1: database disk image is malformed
C:\!dc-db\db-sqlite-corrupt\db-bug-3>sqlite3.exe FlylinkDC.sqlite .dump  1>FlylinkDC.sql
C:\!dc-db\db-sqlite-corrupt\db-bug-3>sqlite3.exe FlylinkDC-new.sqlite  0C:\!dc-db\db-sqlite-corrupt\db-bug-3>echo PRAGMA integrity_check;  | sqlite3.exe FlylinkDC-new.sqlite
ok
C:\!dc-db\db-sqlite-corrupt\db-bug-3>ren FlylinkDC.sqlite FlylinkDC-old.sqlite
C:\!dc-db\db-sqlite-corrupt\db-bug-3>ren FlylinkDC-new.sqlite FlylinkDC.sqlite
C:\!dc-db\db-sqlite-corrupt\db-bug-3>del FlylinkDC.sql
C:\!dc-db\db-sqlite-corrupt\db-bug-3>pause
 


Если ругается на другой файл БД - в батнике ставим его имя по аналогии.
  • FlylinkDC_user.sqlite
  • FlylinkDC_stat.sqlite
  • FlylinkDC_mediainfo.sqlite
  • FlylinkDC_log.sqlite
  • FlylinkDC_locations.sqlite
  • FlylinkDC_dht.sqlite

3 комментария:

Анонимный комментирует...

РАБОТАЕТ! Спасибо тебе милчеловек! Способ работает. Файл починился и диси запустился с сохранёнными данными!))) СПАСИБО!!!

Анонимный комментирует...

Здравствуйте.
Тоже повредилась база dc-клиента, зависла система, вот хочу поделиться методом восстановления, может кому понадобится.
Методом выше что-то не помогло, повреждения наверно разные могут быть. Есть программы по работе с sqlite, напр. SQLite Expert, частично вроде восстановил, но много потеряно.
В инете попалась инфа о том, что последние версии sqlite имеют команду: recover https://sqlite.org/cli.html#recover
Для меня результат лучше и быть не может. Потеряны только самые последние записи прям перед самой аварией. Пример команды:
sqlite3.exe FlylinkDC.sqlite ".recover" | sqlite3 new.sqlite

Анонимный комментирует...

UPD! Cори. Выше коммент мой. Со "старой" версией sqlite (тест с 2014) также успешное восстановление базы. Размер немного меньше, возм. не полн., но все нужное восстановлено.
Спасибо автору за пост!
Хоть DC и хоронят все уже лет 10-15, но по-моему ему еще жить и жить. :)