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

У меня есть небольшое 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 ]

1 голос
/ 28 октября 2010

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

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

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

0 голосов
/ 31 мая 2018

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

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

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

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

...