Как я могу записать в файл базы данных SQLite в веб-пространстве проекта SourceForge?

У меня есть небольшое CGI-приложение на основе Perl, которое я запускаю в веб-пространстве проекта, предусмотренном для проекта SourceForge. Это приложение хранит данные в файле базы данных SQLite (v. 3).

Когда я запускаю тестовые сценарии из оболочки, я могу читать и писать в этот файл SQLite. Однако, когда код CGI выполняется Apache, он имеет доступ только для чтения. Операции записи приводят к ошибке файла журнала:

error.log.web-2:[Wed Oct 27 14:40:22 2010] [error] [client 127.0.0.1] DBD::SQLite::db do failed: unable to open database file

В целях тестирования я проверял разрешения для этого файла SQLite вплоть до 777. Без разницы.

Тем не менее, есть несколько забавных предостережений в веб-пространстве проекта SourceForge, и мне интересно, не запутался ли я этим. Как правило, основная файловая система веб-сервера доступна только для чтения Apache. Если у вас есть файлы, которые должны быть доступны для записи во время выполнения, вы должны хранить их в специальном "постоянном" каталоге в другом месте... и создавать символические ссылки из вашего веб-пространства на фактические файлы в этом каталоге.

Я сделал это, и разрешения установлены на 777 как для символической ссылки, так и для фактического файла SQLite в расположении "постоянства". Я знаю, что этот механизм работает в целом, потому что я делаю то же самое с файлами кэша и журналов, и он работает там.

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

2 ответа

Решение

Я считаю, что ответ на этот вопрос заключается в том, что это не может быть сделано. Дальнейшие исследования SQLite говорят мне, что драйвер должен получить блокировку файла базы данных, прежде чем он сможет выполнять какие-либо операции записи. Этот тип блокировки не может быть получен, когда фактический файл находится на другом компьютере с его файловой системой, смонтированной перекрестно.

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

Короче говоря, если вы натолкнулись на этот вопрос, потому что у вас возникла та же проблема... либо ищите другой хостинг в веб-пространстве, либо может быть пора пересмотреть ваше приложение и перейти к MySQL или какой-либо другой БД (SourceForge дает вам бесплатный хостинг MySQL в любом случае).

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

https://www.sqlite.org/tempfiles.html

Если вы не можете записать временные файлы, то вы не можете делать какие-либо записи в файл базы данных sqlite. Если вы переключите его на: memory: базу данных, вы можете получить или использовать прагму, упомянутую @ bob.faist PRAGMA temp_store = MEMORY, но на самом деле вы должны диагностировать и исправить проблему с разрешениями, если это возможно.

Используйте эти команды, чтобы увидеть, есть ли у вас разрешение на запись в этих местах файлов.

ls -l app.db
getfacl app.db
ls -l -d .  # check the directory to see if you can write the temp files there
getfacl .

использование chmod или же setfacl -m исправить файлы или папки, чтобы позволить вам писать в них.

Также проверьте свое дисковое пространство.

df -k

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

Надеюсь, это поможет.

Другие вопросы по тегам