डालने के दौरान SQLite त्रुटि 'एक पठनीय डेटाबेस लिखने का प्रयास'?


124

मेरे पास एक SQLite डेटाबेस है जो मैं एक वेबसाइट के लिए उपयोग कर रहा हूं। समस्या यह है कि जब मैं INSERT INTOइसे करने की कोशिश करता हूं, तो मुझे एPDOException

SQLSTATE[HY000]: General error: 8 attempt to write a readonly database

मैं सर्वर में SSH'd और अनुमतियों की जाँच की, और डेटाबेस की अनुमति है

-rw-rw-r--

मैं * nix परमिशन से परिचित नहीं हूं, लेकिन मुझे इस बात का पूरा यकीन है

  • डायरेक्टरी नहीं
  • स्वामी ने अनुमतियाँ पढ़ी / लिखी हैं (यह मेरे अनुसार है ls -l)
  • समूह ने अनुमतियाँ पढ़ / लिख ली हैं
  • बाकी सभी ने केवल पढ़ने की अनुमति दी है

मैंने हर जगह देखा जो मैं sqlite3प्रोग्राम का उपयोग करना जानता था , और कुछ भी प्रासंगिक नहीं पाया।

क्योंकि मुझे नहीं पता था कि PDO डेटाबेस को खोलने के लिए क्या अनुमति देता है, मैंने किया

chmod o+w supplies.db

अब, मुझे एक और मिला PDOException:

SQLSTATE[HY000]: General error: 14 unable to open database file

लेकिन यह केवल तब होता है जब मैं डेटाबेस के खुलने के बाद किसी INSERTक्वेरी को निष्पादित करने का प्रयास करता हूं ।

क्या चल रहा है पर कोई विचार?


मूल रूप से httpd (Apache> php> PDO) आप नहीं हैं, इसलिए यह फ़ाइल का मालिक नहीं है, इसलिए इसमें लिखने की अनुमति नहीं है ... दिलचस्प ...
SparK

sudo chgrp www-data test.dbअनुमतियाँ जोड़ने के साथ मेरे लिए काम किया
Zippp

जवाबों:


305

समस्या, के रूप में यह पता चला है, पीडीओ SQLite ड्राइवर की आवश्यकता है कि है कि आप एक लिखने आपरेशन करने के लिए (जा रहे हैं है INSERT, UPDATE, DELETE,DROP , आदि), बाद में डेटाबेस फ़ोल्डर बसता था लिखने की अनुमति होना आवश्यक है वास्तविक रूप में भी, डेटाबेस फ़ाइल।

मुझे यह जानकारी पीडीओ SQLite ड्राइवर मैनुअल पेज के बहुत नीचे एक टिप्पणी में मिली ।


9
इसके अलावा, SELinux (यदि स्थापित है) लागू नहीं होना चाहिए। मुझे डेढ़ दिन लगा कि मैं यह पता लगाऊं।
स्टीव वी।

1
हम, क्षमा करें, लेकिन मैं इसे धन्यवाद देता हूं, लेकिन यह सिर्फ अस्थायी समस्या को हल करता है, मुख्य मुद्दा मेरा www-data उपयोगकर्ता www-data समूह में नहीं था।
डोरियन

5
जैसा कि मुझे पता है, युक्त फ़ोल्डर को लिखने योग्य होना चाहिए क्योंकि जब एक जर्नलिंग फ़ाइल लिखी जाएगी और इसलिए db स्वयं। वेबसर्वर के समान उपयोगकर्ता के लिए, फ़ाइल की सामग्री को दूसरे बनाए गए तदर्थ में कॉपी करने का प्रयास करें।
lcapra

4
इसके अलावा db फाइल और डायरेक्टरी जो इसमें रहती है, उनके पास लिनक्स बॉक्स पर 'www-data' का स्वामित्व होना चाहिए।
अनिसबेट

1
वर्तमान में sqlite3 में 3 फाइलें, .dbएक .db-shmऔर एक .db-walफाइलें हो सकती हैं , और निश्चित रूप से तीनों की मूल निर्देशिका, जो प्रोग्राम चलाने वाले उपयोगकर्ता के लिए सभी योग्य होनी चाहिए।
मार्कोस डेयोन

17

यह तब हो सकता है जब SQLite फ़ाइल का स्वामी स्वयं स्क्रिप्ट चलाने वाले उपयोगकर्ता के समान नहीं है। यदि संपूर्ण निर्देशिका पथ (जिस तरह से प्रत्येक निर्देशिका का अर्थ है) के समान त्रुटि नहीं हो सकती है।

SQLite फ़ाइल का मालिक कौन है? आप?

स्क्रिप्ट किसके रूप में चल रही है? अपाचे या कोई नहीं?


1
मैं SQLite फ़ाइल का मालिक हूं, लेकिन मुझे नहीं पता कि स्क्रिप्ट किसके रूप में चलती है। मैं कैसे पता लगाऊं? (ध्यान रखें, यह एक साझा होस्ट पर है और मेरे पास सीमित अनुमतिें हैं)
ऑस्टिन हाइड

1
आह, कि चीजों को और अधिक मजेदार बनाता है। यदि आप साझा होस्टिंग पर हैं, तो एक बहुत अच्छा मौका है कि स्क्रिप्ट "कोई नहीं" या "अपाचे" के रूप में चलती है। अपनी स्क्रिप्ट एक फ़ाइल ( file_put_contents('./foo.txt', 'Hello, world');) बनाएं , जो आपको दिखाएगी कि यह किसके रूप में चल रही है। संभावना है कि आपको स्क्रिप्ट बनाने के लिए SQLite डेटाबेस की आवश्यकता होगी। यह एक मनोरंजक अभ्यास हो सकता है यदि आपके पास पहले से ही अपनी वर्तमान फ़ाइल में डेटा है ...
चार्ल्स

अच्छा विचार है, लेकिन नहीं। जो भी PHP चला रहा है उसके पास विशेषाधिकार नहीं हैं, इसलिए यह फ़ाइल नहीं बना सकता है। वैसे भी क्या PHP पुनः प्राप्त कर सकता है जो उपयोगकर्ता वर्तमान में चल रहा है?
ऑस्टिन हाइड

एकमात्र तरीका POSIX एक्सटेंशन के माध्यम से लगता है , जो कि POSIX-y सिस्टम पर डिफ़ॉल्ट रूप से सक्षम है। आपके होस्टिंग प्रदाता के पास Rf TFM हो सकता है और इसे अक्षम कर सकता है, हालाँकि।
चार्ल्स

ठीक है, वे TFM ठीक है। posix_getuid()या तो काम नहीं करता है।
ऑस्टिन हाइड

6

मेरे लिए समस्या अनुमतियों के बजाय SELinux प्रवर्तन थी। स्वीकार किए गए जवाब पर एक टिप्पणी में स्टीव वी द्वारा किए गए सुझाव का पालन करते हुए , "रीड ओनली डेटाबेस" त्रुटि दूर हो गई , क्योंकि मैंने प्रवर्तन को निष्क्रिय कर दिया था।

echo 0 >/selinux/enforce

इस आदेश को चलाने पर, सबकुछ इरादा के अनुसार काम किया (सेंटोस 6.3)।

ग्रेफाइट की स्थापना के दौरान मुझे जो विशिष्ट समस्या मिली थी। मैंने ट्रिपल-चेक किया था कि अपाचे उपयोगकर्ता के स्वामित्व में है और वह मेरे ग्रेफाइट.बीबी और उसके मूल निर्देशिका दोनों को लिख सकता है। लेकिन जब तक मैंने SELinux को "फिक्स" नहीं कर दिया, तब तक मुझे जो भी मिला, वह इसके प्रभाव का एक स्टैक ट्रेस था: DatabaseError: readonly database लिखने का प्रयास


8
SELinux एक सुरक्षा उपाय है, इसलिए इसे बहुत अच्छे कारण के बिना अक्षम नहीं किया जाना चाहिए। यह पता लगाना बेहतर होगा कि SELinux पहले स्थान पर क्यों अवरुद्ध है और इसे अक्षम करने के बजाय इसे सही तरीके से कॉन्फ़िगर करें।
जेन्स वीगर

5

यह SELinux के कारण हो सकता है। यदि आप SELinux को पूरी तरह से अक्षम नहीं करना चाहते हैं, तो आपको http निर्देशिका को httpd_sys_rw_content_t पर fbtext सेट करना होगा।

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?"
restorecon -v /var/www/railsapp/db

4

मुझे यह त्रुटि तब मिली जब मैंने एक एंड्रॉइड सिस्टम पर एक डेटाबेस में लिखने की कोशिश की।

जाहिरा तौर पर sqlite3 को न केवल डेटाबेस फ़ाइल और युक्त निर्देशिका के लिए लिखने की अनुमति चाहिए (जैसा कि @ austin-hyde ने पहले ही अपने जवाब में कहा था), लेकिन पर्यावरण चर भी TMPDIR को (संभवतः योग्य) निर्देशिका को इंगित करना होगा।

अपने Android सिस्टम पर मैंने इसे सेट किया है TMPDIR="/data/local/tmp"और अब मेरी स्क्रिप्ट उम्मीद के मुताबिक चलती है :)

संपादित करें:

: यदि आप वातावरण चर सेट नहीं कर सकते, तो आप यहां सूचीबद्ध किसी दूसरी विधि का उपयोग कर सकते हैं https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations की तरहPRAGMA temp_store_directory = 'directory-name';


2

मुझे विंडोज़ के तहत IIS से एक ही त्रुटि मिली। 7. इस त्रुटि को ठीक करने के लिए मुझे sqlite डेटाबेस फ़ाइल के लिए IUSR खाते में पूर्ण नियंत्रण अनुमतियाँ मिलानी थीं। यदि आपको IIS के बजाय webmatrix के तहत sqlite का उपयोग करने की अनुमति देने की आवश्यकता नहीं है।


2

सारांश में, मैंने एक सबफ़ोल्डर में डेटाबेस फ़ाइल (* .db) डालकर समस्या को ठीक किया है।

  • सबफ़ोल्डर और उसके भीतर डेटाबेस फ़ाइल www-डेटा समूह का सदस्य होना चाहिए।
  • Www-data समूह में, आपके पास सबफ़ोल्डर और डेटाबेस फ़ाइल में लिखने का अधिकार होना चाहिए।

0

मैं अपने ब्राउज़र में यह मिल गया जब मैं का उपयोग करने से बदल http: // स्थानीय होस्ट करने के लिए http://145.900.50.20 (जहां 145.900.50.20 अपने स्थानीय IP पता है) और फिर स्थानीय होस्ट में वापस बदल दिया है - यह साथ रहने के लिए जरूरी हो गया था एक बार जब मैं एक बार बदल गया तो आईपी एड्रेस


0

मैंनें इस्तेमाल किया:

इको एक्ज़ीक्यूटिव ('वोअमी');

यह पता लगाने के लिए कि स्क्रिप्ट कौन कह रहा है (उपयोगकर्ता नाम कहें), और फिर उपयोगकर्ता को संपूर्ण एप्लिकेशन डायरेक्टरी की अनुमति दी, जैसे:

sudo chown -R: उपयोगकर्ता नाम / var / www / html / myapp

उम्मीद है कि इससे वहां किसी को मदद मिलेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.