ошибка ввода-вывода диска с SQLite - PullRequest
4 голосов
/ 03 апреля 2012

У меня есть (крошечный) динамический веб-сайт, который (примерно) представляет собой Perl CGI-скрипт, использующий базу данных SQLite. Пакет DBI - это уровень абстракции, используемый в Perl.

Около недели назад я начал видеть это сообщение об ошибке:

disk I/O error(10) at dbdimp.c line 271

Поскольку это хост-сайт, на котором работает Apache, я не могу увидеть, заполнен ли жесткий диск (почти). Доступ к команде "df" отключен .... но я использовал (UNIX) команду оболочки "yes> blah", чтобы проверить, может ли диск создавать новые файлы. Моя база данных очень маленькая - менее 50 килобайт.

Я проверил права доступа к файлам и директориям: Директория и все родители - это + r, a + x (все + для чтения / выполнения). Каталог, содержащий мой файл базы данных SQLite, также является + w (все + запись). Сам файл базы данных имеет + w, + r (все + чтение / запись).

Я написал простую программу на Perl, чтобы проверить, могу ли я выполнить неудачный запрос выбора: он работает нормально.

Я выполнил запрос "VACUUM" в базе данных. Я попробовал свои тесты снова - без улучшений.

Я сбросил базу данных SQLite в необработанный SQL (используя команду оболочки SQLite ".dump") и перестроил. Я попробовал свои тесты снова - без улучшений.

Есть предложения? Я так растерялся ... Обычно приведенный выше список может отлавливать большинство ошибок программирования / настройки.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2018

Еще одна причина для этого:

  • Файл базы данных доступен для записи
  • Файл журнала базы данных (заканчивающийся -journal ) имеет значение , а не с возможностью записи

Когда файл базы данных недоступен для записи, вы получаете ошибку «readonly database». Когда он доступен для записи, а файл журнала - нет, вместо него появляется «Ошибка ввода-вывода».

2 голосов
/ 04 апреля 2012

К сожалению, sqlite3.h не очень описывает, в чем конкретно заключается проблема.Код ошибки 10 определен здесь:

#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */

У вас может быть проблема с заполнением / tmp в определенных точках или sqlite, не имеющим доступа к памяти для записи своего кэша страницы.Это маловероятно, однако, если ваша база данных составляет 50 КБ, поскольку sqlite должен иметь возможность хранить кэш вашей страницы в памяти.

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

$sqlite3 your.db
sqlite> begin immediate;
<press CTRL+Z>
$cp your.db copyofyour.db
$exit
sqlite> rollback;

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

0 голосов
/ 20 января 2014

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

flock testfile touch testfile

Например, файловые системы NFS могут демонстрировать это поведение в зависимости от конфигурации сервера NFS.

...