SQLite WindowsLinux

SQLite: unable to open database file

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

SQLite не может открыть файл базы: путь неверный, нет каталога, нет прав на запись в каталог (нужно для временных файлов) либо диск только для чтения. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Путь
  5. Права
  6. Прочее

#Что означает ошибка

Сообщение
sqlite3.OperationalError: unable to open database file

Ошибка SQLite «unable to open database file» (код 14, SQLITE_CANTOPEN) возникает, когда файл или каталог недоступен: неверный путь, нет прав, каталог не существует, путь слишком длинный, либо нет места. Для записи SQLite требует права на сам файл и на каталог (для журнала).

Определите точный путь, который использует приложение.

Затем проверьте права.

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

#Причины и решения

Возможная причинаКак узнатьЧто делать
Указан неверный путьВ журнале относительный data/app.db, а рабочий каталог отличается от ожидаемого.Сверить абсолютный путь и каталог запуска службы.
Не существует каталог или файлПроверка Test-Path/ls не находит каталог или существующую рабочую базу.Уточнить верное расположение; не создавать пустую базу автоматически.
Недостаточно прав процессаФайл есть, но у учётной записи службы нет чтения, записи или доступа к каталогу.Настроить минимальные права только для конкретной учётной записи.
Переполненный диск или проблемная ФСdf -h/df -i показывают отсутствие места или ошибки работы с томом.Освободить место безопасно и проверить хранилище, не удаляя SQLite WAL.

#Пошаговое решение

  1. Определите абсолютный путьСначала определите, какой файл SQLite пытается открыть приложение. В настройках или сообщении ошибки найдите путь к .db/.sqlite и рабочий каталог процесса: относительный путь, например data/app.db, зависит от того, откуда запущена программа. В Python проверьте Path('data/app.db').resolve(); в PHP — realpath() для существующего файла или абсолютный путь, выстроенный от __DIR__. Не создавайте новую пустую базу только потому, что файл не найден: многие SQLite-библиотеки создают её автоматически, скрывая неверный путь.
  2. Проверьте существование каталогаНа сервере или компьютере от имени пользователя приложения найдите указанный каталог и проверьте его существование: Linux — ls -ld /абсолютный/путь/каталог, Windows — через Проводник либо Test-Path в PowerShell. Если каталог не существует, выясните правильное местоположение файла по конфигурации и резервным копиям. Создавайте каталог только если приложение действительно должно создавать там новую базу; не копируйте случайный файл с похожим именем и не запускайте миграции, пока не определили нужную базу.
  3. Проверьте права на файл и каталогЕсли путь правильный, проверьте права на файл, каталог и родительские каталоги для конкретной учётной записи службы. В Linux выполните namei -l /путь/к/app.db и ls -l /путь/к/app.db, затем узнайте пользователя процесса (ps -eo user,pid,cmd с фильтрацией по имени службы); в Windows откройте свойства файла → «Безопасность». Для записи SQLite требуется доступ на запись не только к файлу, но и к каталогу для создания журналов/WAL. Не выполняйте chmod 777 или рекурсивную смену владельца всей папки сайта.
  4. Проверьте место и блокировкиНа файловой системе проверьте место: Linux — df -h /путь/к/каталогу и df -i /путь/к/каталогу; Windows — «Этот компьютер» → свойства диска. Если файл размещён на сетевой или облачно синхронизируемой папке, учтите особенности блокировок SQLite, особенно в режиме WAL: предпочтительно держать рабочую базу на надёжном локальном диске. Не удаляйте файлы -wal и -shm при работающем приложении: это может повредить незавершённые транзакции. При признаках повреждения сначала делайте согласованную копию.
  5. Откройте файл от имени того же пользователяПроверяйте подключение от той же учётной записи, под которой запущено приложение, и к полному пути, а не под root: на Linux администратор может использовать sudo -u ИМЯ_СЛУЖБЫ sqlite3 /путь/к/app.db 'PRAGMA quick_check;' на существующей базе при наличии sqlite3. Вывод ok подтверждает лишь успешную проверку целостности на чтение, не право выполнить запись. Если приложение открывает файл, но пишет attempt to write a readonly database, переходите к проверке разрешений на запись; если database is locked, сначала ищите конкурирующий процесс.

#Путь

Выведите абсолютный путь: убедитесь, что каталог существует (ls -ld /path). Относительные пути ломаются, когда изменяется рабочая папка. На Windows экранируйте обратные слеши. В URI-форме file: пробелы и спецсимволы кодируются. Проверьте, что имя файла не содержит недопустимых символов.

#Права

Linux: ls -l data.db и ls -ld каталог. Веб-сервер (www-data, nginx) должен иметь запись: sudo chown www-data:www-data data.db . и chmod 664 data.db, chmod 775 каталог. SELinux: ls -Z, restorecon. Docker: проверьте владельца тома. Windows: вкладка «Безопасность» в свойствах.

#Прочее

Проверьте свободное место (df -h) и квоты. Файл не должен быть заблокирован другим процессом (антивирус, резервное копирование). Не используйте сетевые файловые системы без поддержки блокировок. Если используется PHP open_basedir, он может запрещать путь. Проверьте журнал приложения и выполните sqlite3 путь напрямую от имени того же пользователя: sudo -u www-data sqlite3 /path/data.db ".tables".

Linux · Терминал (Bash)Команда
Проверка существования и разрешений без открытия SQLite: sqlite3 по отсутствующему пути может создать новую пустую базу.
# Пример диагностических команд Linux: точные пути и пользователь зависят от установки.
ls -ld /var/www/app
ls -l /var/www/app/data.db
namei -l /var/www/app/data.db
df -h /var/www/app

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.