«База данных или диск заполнен» на VACUUM с большим количеством свободного места - PullRequest
0 голосов
/ 07 ноября 2019

Я потратил час на то, чтобы прочесать многие другие потоки с этой проблемой и попытаться применить решения, но половина потоков говорит, что проблема в том, что диск заполнен (это не так), а в остальном я не смогпонять ответы, или они не сработали для меня.

Мой файл базы данных составляет 8 МБ, а мой SSD имеет 314 ГБ свободного места. Единственный другой том - это мой iCloud Drive, на котором свободно 237 МБ.

В других потоках предлагается изменить том, на котором находится временный каталог, но:

(1) На обоих моих томах достаточно свободного места. .

(2) Я не могу найти указания для , как установить временную директорию. Попытка синтаксиса, подобного следующему, приводит к синтаксической ошибке: SQLITE_TMPDIR = '/ path /'

(3) Я не могу найти указания, как показать текущий временный каталог. [ОБНОВЛЕНИЕ: ввод «env» в терминал показывает TMPDIR = / var / folder ..., который находится на моем SSD, без каких-либо ограничений пространства, о которых я знаю.]

ОБНОВЛЕНИЕ: Запуск pragma_integrity_check, я получаю:

On tree page 1206 cell 0: invalid page number 1658652726
On tree page 746 cell 0: invalid page number 205562142
On tree page 94 cell 0: invalid page number 1932643690
Page 1051 is never used
Page 1079 is never used
Page 1385 is never used

ОБНОВЛЕНИЕ: различные предлагаемые способы восстановления поврежденной базы данных терпят неудачу.

(1) RECOVER. В моем коде ниже «sqlite>» - это командная строка. Я добираюсь до него, вводя "sqlite3" в Терминал.

sqlite> $ sqlite3 -batch bad.db .recover> salvaged.sql;# Нераспознанный токен $

sqlite> sqlite3 -batch bad.db .recover> salvaged.sql;# Ошибка: рядом с "sqlite3": синтаксическая ошибка

sqlite> -batch bad.db .recover> salvaged.sql;# Ошибка: около «-»: синтаксическая ошибка

(2) VACUUM INTO

Получена синтаксическая ошибка. Обнаружил, что моя версия SQLite была слишком старой. Скачал новую версию, посмотрел инструкции по обновлению. Нашел "brew update sqlite". Пробовал, получил ошибку, Ruby слишком стар. Обновлен Ruby. Снова попробовал "brew update sqlite", получил ошибку "Ошибка: sqlite не установлен". Попробовал "brew install sqlite", получил ошибку "sqlite только для бочонка, что означает, что он не был вставлен в / usr / local, потому что macOS предоставляет более старый sqlite3."

(3) VACUUM ONE TABLE

В моей базе данных есть только одна таблица.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Лучший способ восстановить данные из поврежденной базы данных - использовать команду .recover программы командной строки sqlite3, которая выводит операторы SQL DDL для максимально возможного количества данных.

Пример:

$ sqlite3 -batch bad.db .recover > salvaged.sql

См. документацию для получения полной информации.

Возможно, вам понадобится последняя версия оболочки sqlite3, либо как загружен двоичный файл или собран из исходного кода, так как .recover был улучшен в версии 3.30.

0 голосов
/ 07 ноября 2019

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

VACUUM INTO 'recovery.db';

Если это не сработает, то попробуйте пылесосить по одной таблице за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...