SQLite veritabanı modunu okuma-yazma olarak değiştirin


102

Bir SQLite veritabanını salt okunurdan okuma-yazmaya nasıl değiştirebilirim?

Güncelleme ifadesini çalıştırdığımda, her zaman şunu elde ederim:

SQL hatası: salt okunur bir veritabanı yazmaya çalışın

SQLite dosyası, dosya sistemindeki yazılabilir bir dosyadır.


4
Sqlite3'ü çalıştıran kullanıcının (veya sorguyu yürütmek için kullandığınız her neyse) db'ye yazma izni var mı? Dosya sahipliğini iki kez kontrol ettiniz mi?
Tim Post

1
Eminim bunu yapmak için izinleri vardır.
user143482

3
Bunu, veritabanı dosyasında GID'yi ayarlamayı unuttuğum ve "www-data" hesabının (Apache'nin altında çalıştığı) dosyaya yazma erişiminin reddedildiği bir web uygulamasında gördüm.
finnw

Yanıtlar:


87

Bu hata mesajının birkaç nedeni olabilir:

  • Birkaç işlemin veritabanı aynı anda açık olmasını sağlar ( bkz. SSS ).

  • Veritabanını sıkıştırmak ve şifrelemek için bir eklenti var. DB'nin değiştirilmesine izin vermez.

  • Son olarak, başka bir SSS : "Veritabanı dosyasını içeren dizinin CGI komut dosyasını çalıştıran kullanıcıya da yazılabilir olduğundan emin olun." Sanırım bunun nedeni motorun dizinde daha fazla dosya oluşturması gerekiyor.

  • Tüm dosya sistemi, örneğin bir çökme sonrasında yalnızca okunabilir.

  • Unix sistemlerinde, başka bir işlem tüm dosyanın yerini alabilir.


27
Teklifimi üçüncü maddeye verirdim - DB dosyasını içeren dizin de yazılabilir olmalı, böylece kilit dosyası oluşturulabilir.
Kimvais

1
Benim için ilk kurşun: D
Vinay

1
Sonuncusu. Sudo'yu her zaman unutuyorum: P
Storm

4
Bu listeye ekleyebilirim: veritabanı dosyası kullanım sırasında değiştirildi. Bu sonuca götüren aptallığı açıklamak zorunda kalmamayı tercih ederim.
Wim Rijnders

1
Bu cevap olarak işaretlenmelidir. Benim durumumda (Bir masaüstü uygulaması), ana sabit diskin çok az yer kaplaması nedeniyle Windows Veritabanını sıkıştırmakla ilgiliydi. Sanırım windows, kullanıcıya yer açmak için dosyaları sıkıştırmak isteyip istemediğini soracak, eğer kullanıcı evet derse o zaman salt okunur veritabanı sorunu ortaya çıkabilir.
Nandostyle

10

Bunu, / db dizinindeki tüm dosyalarda sahibi kökten bana değiştirerek çözdüm.

Sadece yapmak ls -ldosyalayıcıda herhangi aitse, o klasörde rootsırf sizin için değişim kullanılarak:sudo chown user file


5

Bu hata genellikle veritabanınıza zaten bir uygulama tarafından erişildiğinde ve siz ona başka bir uygulamayla erişmeye çalıştığınızda meydana gelir.


Neden başka bir veritabanından bir veritabanına erişmeye çalışasınız?
Peter Mortensen

Sanırım başka bir uygulamadan kastetti
amaurymartiny

4

Android kullanıyorsanız.

Sayfanıza yazma iznini eklediğinizden emin olun EXTERNAL_STORAGE.AndroidManifest.xml .

Bu satırı AndroidManifest.xmldosyanıza <application>etiketinizin üstüne ve dışına ekleyin .

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

Bu, uygulamanızın sdcard'a yazmasına izin verecektir. Bu, EXTERNAL_STORAGEveritabanınızı cihazda sakladığınız yerdeyse yardımcı olacaktır .


Bu benim sorunumu çözdü. Soruyu daha fazla ayrıntı verecek ve okunması daha kolay olacak şekilde değiştirdim.
prolink007

çok teşekkürler. benim sorunumu da çözdü. için bir
artı

3

Linux komut kabuğunda şunları yaptım:

chmod 777 <db_folder>

Veritabanı dosyası nerede bulunur.

İşe yarıyor. Artık veritabanıma erişebilir ve giriş sorguları yapabilirim.


Güvenlik çıkarımları nelerdir?
Peter Mortensen


1
Hızlı bir çözüm olarak işe yarıyor, ancak daha sonra daha güvenli bir çözüm için
araştırılması gerekiyor

5
Bu, tüm kullanıcılara tüm izinleri verecektir, ki bu muhtemelen güvenlik açısından istediğiniz şey değildir.
RENEL Chesak

3

(bu hata mesajı genellikle yanıltıcıdır ve genellikle genel bir izin hatasıdır)

Windows'ta

  • Doğrudan veritabanına karşı SQL yayınlıyorsanız, SQL'i çalıştırmak için kullandığınız uygulamanın yönetici olarak çalıştığından emin olun.
  • Bir uygulama güncellemeyi deniyorsa, veritabanına erişmek için kullandığı hesabın veritabanı dosyanızı içeren klasörde izinlere ihtiyacı olabilir. Örneğin, IIS veritabanına erişiyorsa, IUSR ve IIS_IUSRS'nin her ikisi de uygun izinlere ihtiyaç duyabilir (bu hesaplara klasör üzerinde geçici olarak tam kontrol vererek, bunun çalışıp çalışmadığını kontrol ederek ve ardından uygun şekilde izinleri bağlayarak bunu deneyebilirsiniz)

1
Yönetici olarak "DB Browser" ı çalıştırmam gerekiyordu.
Eben Roux

1
Windows 10'da "Herkese" "tam denetim" verdim ve yine de çalışmıyordu. Ancak, @EbenRoux'nun da belirttiği gibi, Yönetici olarak "DB Browser" ı çalıştırmanız gerekebilir, bu da benim için çalışmasını sağladı.
barış dışında

2

Bugün ben de bu problemi yaşadım.

Bunun nedeni Windows Mobile'daki ActiveSync idi - çalıştığım klasör senkronize edildi, bu nedenle AS işlemi zaman zaman bu hataya neden olan DB dosyasını yakaladı.


1

Linux'ta, veritabanı dosyasını içeren tüm klasöre okuma / yazma izinleri verin.

Ayrıca, SELinux yazmayı engelliyor olabilir. Doğru izinleri ayarlamanız gerekir.

SELinux Yönetim GUI'mde (Fedora 19'da), httpd_unified (Tüm içerik dosyalarının HTTPD işlemlerini birleştir) etiketli satırdaki kutuyu işaretledim ve hazırdım.


Kimler için okuma / yazma izinleri?
Peter Mortensen

Nasıl kontrol edilir ve ayarlanır?
SynCap

1

Windows'ta:

tl; dr: Dosyayı yeniden açmayı deneyin.

Sistemimiz bu sorundan muzdaripti ve bu kesinlikle bir izin sorunu değildi, çünkü programın kendisi veritabanını çoğu zaman birçok iş parçacığından yazılabilir olarak açabilir, ancak bazen (yalnızca Windows'ta, OSX'te değil), bir iş parçacığı, programdaki diğer tüm iş parçacıkları herhangi bir zorluk yaşamasa bile bu hataları alacaktır.

Sonunda, başarısız olan iş parçacıklarının yalnızca başka bir iş parçacığı kapatıldıktan hemen sonra veritabanını açmaya çalışanlar olduğunu keşfettik (3 ms içinde). Sorunun, Windows'un (veya windows altındaki sqlite uygulamasının) bir dosyayı kapattıktan sonra dosya kaynaklarını her zaman hemen temizlememesinden kaynaklandığını tahmin ettik. Bunu, açılışta db'ye karşı bir test yazma sorgusu çalıştırarak aştık (örneğin, aptal bir ada sahip bir tablo oluşturup sonra bırakarak). Oluşturma / bırakma başarısız olursa, 50 ms bekledik ve başarılı oluncaya veya 5 saniye geçene kadar tekrar ederek tekrar denedik.

İşe yaradı; Görünüşe göre, kaynakların diske akması için yeterli zaman olması gerekiyordu.


1

Kişisel deneyimi paylaşmak için, sonunda her ikisini de düzelten bu hatayla karşılaştım. Sorununuzla ilgili olmayabilir, ancak görünen o ki bu hata o kadar geneldir ki gazilyonlarca şeyle ilişkilendirilebilir.

  1. Veritabanı örneği başka bir uygulamada açık. DB'm "kilitli" durumda olduğu için salt okunur moda geçti. DB'yi paylaşan uygulamanın 2. bir örneğini durdurarak onu takip edebildim.

  2. Dizin ağacı izni - lütfen kullanıcı hesabının yalnızca dosya düzeyinde değil, / düzeyine kadar tüm üst dizin düzeyinde izne sahip olduğundan emin olun.

Teşekkürler


1

Ubuntu'da, sahibi Apache grubuna değiştirin ve doğru izinleri verin (hayır, 777 değil):

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

Güncelleme

Grup ve kullanıcı için de izinleri ayarlayabilirsiniz .

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

4
Kullanıcıyı değil , grubu değiştirdiniz (bu iyi ve muhtemelen kullanıcıyı değiştirmekten daha iyidir, ancak cevabınız yanıltıcıdır).
Auspex

Dosyanın Apache kullanıcısına / grubuna ait olması gerektiğini düşündüren nedir?
Murphy

0

Komut satırından veritabanı dosyanızın bulunduğu klasörü girin ve aşağıdaki komutu yürütün:

chmod 777 databasefilename

Bu, tüm kullanıcılara tüm izinleri verecektir.


24
Bu oldukça kötü.
Marco Kerwitz

1
mükemmel cevap !
Jitesh Prajapati

1
Bu sorunu çözebilir ancak güvenlik sorununa neden olabileceği için önerilmez.
kathir raja

0

DB'yi düzenleyin: Veri tabanını düzenlerken sorunlar yaşıyordum. Ben zorunda sona erdi
sudo chown 'olmayan kök adı' ts3server.sqlitedb
kök değildi sürece, ben dosyayı düzenleyebilir olarak. Kullanıcı adı, root olmayan hesabımın kullanıcı adıdır.

TeamSpeak'i otomatik başlatma: root olmayan hesabınız olarak
crontab -e
@reboot / ts3server'a giden yol / aka /home/ts3server/ts3server_startscript.sh start


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.