Измените режим базы данных SQLite на чтение-запись


104

Как я могу изменить базу данных SQLite с режима "только для чтения" на "чтение-запись"?

Когда я выполнял инструкцию обновления, я всегда получал:

Ошибка SQL: попытка записи базы данных только для чтения

Файл SQLite - это записываемый файл в файловой системе.


4
Имеет ли пользователь, запускающий sqlite3 (или что-то еще, что вы используете для выполнения запроса), права записи в базу данных? Вы дважды проверяли право собственности на файлы?
Тим Пост

1
Я уверен, что у них есть на это разрешение.
user143482 05

3
Я видел это в веб-приложении, где я забыл установить GID в файле базы данных, а учетной записи «www-data» (под которой работает Apache) было отказано в доступе на запись в файл.
finnw

Ответы:


90

Это сообщение об ошибке может быть вызвано несколькими причинами:

  • База данных открыта у нескольких процессов одновременно ( см. FAQ ).

  • Есть плагин для сжатия и шифрования базы данных. Это не позволяет изменять БД.

  • Наконец, в другом FAQ говорится: «Убедитесь, что каталог, содержащий файл базы данных, также доступен для записи пользователю, выполняющему сценарий CGI». Я думаю, это потому, что движку нужно создать больше файлов в каталоге.

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

  • В системах Unix другой процесс может заменить весь файл.


28
Я бы сделал ставку на третий пункт - каталог, содержащий файл БД, также должен быть доступен для записи, чтобы можно было создать файл блокировки.
Kimvais 05

2
Первая пуля для меня: D
Vinay

1
Последний. Я всегда забываю sudo: P
Storm

4
Могу добавить к этому списку: файл базы данных был заменен во время использования. Я предпочитаю не объяснять глупость, которая привела к такому выводу.
Wim Rijnders

1
Это должно быть отмечено как ответ. В моем случае (настольное приложение) это было связано со сжатием Windows базы данных из-за того, что на основном жестком диске слишком мало места. Я думаю, что Windows спросит пользователя, хочет ли он / она сжать файлы, чтобы получить место, если пользователь скажет «да», тогда может возникнуть проблема с базой данных только для чтения.
Nandostyle

10

Я решил это, сменив владельца с root на меня для всех файлов в каталоге / db.

Просто сделайте это ls -lв этой папке, если какой-либо из файловых серверов принадлежит вам, rootпросто измените его на вас, используя:sudo chown user file


5

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


Зачем вам пытаться получить доступ к базе данных из другой базы данных?
Питер Мортенсен

Я думаю, он имел в виду из другого приложения
amaurymartiny

4

Если вы используете Android.

Убедитесь, что вы добавили разрешение на запись EXTERNAL_STORAGEв свой AndroidManifest.xml.

Добавьте эту строку в свой AndroidManifest.xmlфайл выше и вне вашего <application>тега.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Это позволит вашему приложению писать на SD-карту. Это поможет, если EXTERNAL_STORAGEименно там вы сохранили свою базу данных на устройстве.


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

большое спасибо. это также решило мою проблему. один голос за :)
Altaf Sami

4

В командной оболочке Linux я сделал:

chmod 777 <db_folder>

Где находится файл базы данных.

Оно работает. Теперь я могу получить доступ к своей базе данных и сделать запросы на вставку.


Каковы последствия для безопасности?
Питер Мортенсен

Чем это отличается от ответа Адриана ?
Питер Мортенсен

1
Это работает как быстрое решение, но позже
нужно будет заняться

5
Это предоставит все разрешения всем пользователям, что, вероятно, не то, что вам нужно с точки зрения безопасности.
Ренел Chesak

3

(это сообщение об ошибке обычно вводит в заблуждение и обычно является общей ошибкой разрешений)

В Windows

  • Если вы вводите SQL непосредственно для базы данных, убедитесь, что любое приложение, которое вы используете для запуска SQL, работает от имени администратора.
  • Если приложение пытается выполнить обновление, учетной записи, которую оно использует для доступа к базе данных, могут потребоваться разрешения для папки, содержащей файл базы данных. Например, если IIS обращается к базе данных, IUSR и IIS_IUSRS могут нуждаться в соответствующих разрешениях (вы можете попробовать это, временно предоставив этим учетным записям полный контроль над папкой, проверив, работает ли это, а затем привязав разрешения соответствующим образом)

1
Мне пришлось запустить «Браузер БД» от имени администратора.
Эбен Ру

1
Я дал «полный контроль» «всем» в Windows 10, но он все равно не работал. Однако, как заявил @EbenRoux, вам также может потребоваться запустить «Браузер БД» от имени администратора, что заставило его работать для меня.
Peaceoutside

2

У меня тоже была эта проблема сегодня.

Это было вызвано ActiveSync в Windows Mobile - папка, в которой я работал, была синхронизирована, поэтому процесс AS захватил файл БД время от времени, вызывая эту ошибку.


2

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

  1. Экземпляр базы данных открыт в другом приложении. Моя БД оказалась в "заблокированном" состоянии, поэтому она перешла в режим только для чтения. Я смог отследить это, остановив второй экземпляр приложения, использующего БД.

  2. Разрешение дерева каталогов - убедитесь, что учетная запись пользователя имеет разрешения не только на уровне файла, но и на всем верхнем уровне каталогов вплоть до / level.

Спасибо


1

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

Кроме того, SELinux может блокировать запись. Вам необходимо установить правильные разрешения.

В моем графическом интерфейсе управления SELinux (в Fedora 19) я установил флажок в строке с надписью httpd_unified (Unify HTTPD обработка всех файлов содержимого), и все было готово.


Разрешения на чтение / запись для кого?
Питер Мортенсен

Как это проверить и настроить?
SynCap

1

В Windows:

tl; dr: попробуйте открыть файл еще раз.

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

В конце концов мы обнаружили, что терпели неудачу только те потоки, которые пытались открыть базу данных сразу после того, как другой поток закрыл ее (в течение 3 мс). Мы предположили, что проблема связана с тем, что Windows (или реализация sqlite под Windows) не всегда сразу очищает файловые ресурсы после закрытия файла. Мы обошли это, выполнив тестовый запрос записи к базе данных при открытии (например, создав и затем отбросив таблицу с глупым именем). Если создание / удаление не удалось, мы ждали 50 мс и пытались снова, повторяя, пока не добились успеха или не истекло 5 секунд.

Это сработало; очевидно, просто нужно было достаточно времени, чтобы ресурсы были сброшены на диск.


1

В Ubuntu измените владельца на группу Apache и предоставьте необходимые разрешения (нет, это не 777):

sudo chgrp www-data <path to db.sqlite3>
sudo chmod 664 <path to db.sqlite3>

Обновить

Вы также можете установить разрешения для группы и пользователя .

sudo chown www-data:www-data <path to db.sqlite3>

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

Что заставляет вас думать, что файл должен принадлежать пользователю / группе Apache?
Мерфи

0

В командной строке введите папку, в которой находится файл базы данных, и выполните следующую команду:

chmod 777 databasefilename

Это предоставит все разрешения всем пользователям.


24
Что очень плохо.
Марко Кервитц

1
отличный ответ!
Джитеш Праджапати

1
Это может решить эту проблему, но не рекомендуется, поскольку это может привести к проблемам с безопасностью.
kathir raja

0

Отредактируйте БД: у меня возникли проблемы с редактированием db. В итоге мне пришлось
sudo chown «имя пользователя без полномочий root» ts3server.sqlitedb,
если это не был root, я мог редактировать файл. Имя пользователя - это имя пользователя моей учетной записи без полномочий root.

Автоматический запуск TeamSpeak: в качестве учетной записи без полномочий root
crontab -e
@reboot / путь к ts3server / aka /home/ts3server/ts3server_startscript.sh start


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.