2012-04-03 3 views
4

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

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

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

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

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

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

Я запросил запрос «ВАКУУМ» в базе данных. Я снова пробовал свои тесты - никаких улучшений.

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

Любые предложения? Я так запутался ... Как правило, приведенный выше список может уловить большинство ошибок при программировании/настройке.

+0

Можете ли вы опубликовать код, который выполняется при возникновении ошибки? –

+0

Какую версию SQLite вы используете? И насколько велика ваша база данных? Это полезно - http://www.sqlite.org/cvstrac/tktview?tn=3094,3 –

ответ

2

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

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

Вы можете иметь проблемы с/TMP не полным в определенных точках или SQLite, не имеющим доступ к памяти для записи своего кэша страниц. Это маловероятно, хотя если ваш db равен 50kb, поскольку sqlite должен иметь возможность хранить кеш страниц в памяти.

Вы могли бы попробовать сделать копию БД в надежде, что SQLite может читать скопированную базу данных и обновить свой код, чтобы отразить, что:

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

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

+0

Хорошее предложение! Прохладные идеи. Я остановлюсь на будущих проблемах. К сожалению, в этом случае - это было связано с ошибкой ядра FreeBSD (как объясняется форумами поддержки для NearlyFreeSpeech.net). – kevinarpe

+0

Не могли бы вы сказать немного больше об ошибке? Думаю, я могу столкнуться с чем-то подобным ... –

+0

@ChrisVandevelde: Извините, NFS.net admins не представили более подробной информации о ошибке SQLite от FreeBSD <->. Однако моя проблема решена. – kevinarpe

0

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

flock testfile touch testfile 

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

Смежные вопросы