пятница, 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

Отправить комментарий