Как восстановить поврежденную базу данных SQLite3?

это следующий вопрос к ранее ответившему сообщению:есть ли утилита командной строки для проверки баз данных SQLite в Linux?

если база данных выдает следующую ошибку:

$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed

есть ли обработка очистки, которая может быть выполнена для восстановления базы данных в полезное состояние? Даже при потенциальной потере некоторых коррумпированных записей?

спасибо

8 ответов


Если бы был какой-либо автоматический метод, SQLite уже смог бы это сделать.

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

$ sqlite3 mydata.db ".dump" | sqlite3 new.db

однако, это не всегда возможно.

самый простой и надежный способ-восстановить файл базы данных из резервной копии.


у меня был файл sqlite, который был поврежден, который показал бы такой симптом.

select count(*) from corruptTable;
return:38000;

но когда я попытаюсь загрузить записи с

select * from corruptTable;

он вернет только 7 записей.

Я пробовал несколько вещей, но эти шаги были наиболее успешными.

на mac откройте терминал и запустите эти команды в поврежденной базе данных. (это команды sqlite3, поэтому вы должны иметь возможность использовать другие редакторы sqlite3 или аналогичные команды в прочие системы.)

1 sqlite3 dbWithCorruptTable.sqlite (Obviously replace "dbWithCorruptTable" to your sqlite3 file that has the corrupt table)
2 .mode insert
3 .output dump_all.sql
4 .dump
5 .exit
6 Manually edit the dump_all.sql file in a text editor and remove the transaction statements. Usually there is a "BEGIN TRANSACTION" statement on the 2nd line of the file and a "ROLLBACK" statement on the last line. Remove these and save the file

эти шаги были предприняты с этого веб-сайта: http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/


Если база данных серьезно повреждена, то .dump будет содержать ошибки, и некоторые данные могут быть потеряны.

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

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


я смог восстановить файл истории Chrome (который является файлом базы данных sqlite3) следующим образом:

sqlite3.exe History ".backup History-new"

Я знаю, что это старый вопрос, но я все равно хотел бы поделиться своим решением. Моя проблема заключалась в том, что база данных sqlite3 Коди(xbmc) была повреждена

.дамп не работал в моем случае

file is encrypted or is not a database

то, что сработало, следующее.

  1. сделал резервную копию старого файла БД
  2. пусть Коди создать новый файл БД
  3. проверил этой сбоку формат заголовка sqlite файлы
  4. открыл оба файла с помощью шестнадцатеричного редактора (bless) и проверил первые 96 байт
  5. первые 40 байт, где разные и я скопировал первые 40 байт из нового файла БД в файл БД
  6. после этого мой файл базы данных еще раз работать !!!

Что-то поделился в этом блоге -http://wordpress.semnaitik.com/2017/02/01/repair-sqlite-database/

автор говорит, что мы можем исправить поврежденную базу данных SQLite вручную. Как? Сначала мы можем экспортировать базу данных SQLite в файл SQL. И после этого мы можем импортировать его обратно в SQLite в SQL. Понятия не имею, полезно это или нет. Вы можете попробовать один раз. Сообщение в блоге содержит полезную информацию о базе данных SQLite и ее повреждении.

спасибо.


Это сработало для меня:

загрузите пакет инструментов sqlite3 из здесь и поставить его в любую папку. Поместите поврежденную базу данных в ту же папку.

открыть командную строку.

введите следующее:

и sqlite3.exe

(Клавиша Enter)

NAME_OF_YOUR_CORRUPTED_DATABASE> ".дамп " / sqlite3 new.db

(нажмите enter)

все остальные решения не работают для меня.


следующее исправление работало для восстановления моей базы данных без запуска каких-либо инструментов командной строки.

Я получил сообщение об ошибке "образ диска базы данных искажен", когда я работал с одной из моих таблиц, поэтому я запустил [PRAGMA integrity_check], который вернул

главный фрилист: количество свободных страниц в заголовке слишком мало

на странице дерева 16198 ячейка 1: 2-я ссылка на страницу 14190

страница 16988 никогда не используется

страница 46637 никогда используется

строка 4493 отсутствует в индексе indexname1

строка 4493 отсутствует в индексе indexname2

строка 4493 отсутствует в индексе indexname3

Я сначала сохранил схему для таблицы с плохими индексами, чтобы я мог воссоздать эти индексы. Затем я отбросил индексы 1, 2 и 3 с помощью команды [drop index_]. Я экспортировал свои таблицы одну за другой в файлы JSON, а затем усек каждую таблицу. Запуск проверки целостности в этот момент был успешный. Затем я добавил три индекса обратно с помощью команды [create index_] и импортировал записи каждой таблицы из их экспорта файлов JSON. Выполнение команды проверки целостности по-прежнему возвращает "ok" со всеми восстановленными записями.