Как восстановить поврежденную базу данных 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
то, что сработало, следующее.
- сделал резервную копию старого файла БД
- пусть Коди создать новый файл БД
- проверил этой сбоку формат заголовка sqlite файлы
- открыл оба файла с помощью шестнадцатеричного редактора (bless) и проверил первые 96 байт
- первые 40 байт, где разные и я скопировал первые 40 байт из нового файла БД в файл БД
- после этого мой файл базы данных еще раз работать !!!
Что-то поделился в этом блоге -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" со всеми восстановленными записями.