Подтвердить что ты не робот

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

У меня был файл 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/

Ответ 3

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

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

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

Ответ 4

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

sqlite3.exe History ".backup History-new"

Ответ 5

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

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

file is encrypted or is not a database

То, что сработало, было следующим:

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

Ответ 6

Прагма writable_schema отключает некоторые проверки целостности, поэтому эти две команды также могут помочь, сохраняя настройки db:

PRAGMA writable_schema=ON;
VACUUM;

Ответ 7

Мой метод аналогичен, предотвращает откат ошибки скрипта:

sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 database.new

Ответ 8

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

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

Откройте командную строку.

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

sqlite3.exe

(Нажмите Enter)

NAME_OF_YOUR_CORRUPTED_DATABASE > ".dump" | sqlite3 new.db

(Нажмите enter)

Все другие решения не помогли мне.

Ответ 10

Если повреждение находится на первой странице, мы не можем использовать метод ".dump" для его восстановления.

Существует инструмент под названием undark, который экспортирует все строки (удаленные или нет) из файла db, если записи не были перезаписаны. Последняя версия здесь.

Я также использовал SQLite-Deleted-Records-Parser, но не выдавал тот же тип вывода.

И есть также такие продукты, как SQLite Forensic Explorer, SQLite Repair, Sqlite Database Recovery и SQLiteDoctor.

Если вы являетесь разработчиком, вы можете избежать повторения одной и той же проблемы с помощью некоторых из них:

  • litereplica - Репликация с одним мастером с восстановлением по времени
  • litesync - синхронизация с несколькими мастерами
  • rqlite - Репликация с несколькими мастерами

Или регулярно используйте Резервный API. Хотя он переносит всю базу данных на каждую резервную копию.

И помните: если вы копируете SQLite файл или используете обычный подход резервного копирования, когда транзакция активна копия может быть повреждена.

Ответ 11

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

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

Спасибо.

Ответ 12

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

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

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

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

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

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

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

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

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

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

Ответ 13

С Sqlite 3.29.0 в CLI была введена новая команда .recover:

Добавьте команду ".recover", которая пытается восстановить столько содержимого, сколько возможно из поврежденного файла базы данных.