এসকিউএলাইট ত্রুটি inোকানোর সময় 'পঠনযোগ্য ডাটাবেস লেখার প্রচেষ্টা'?


124

আমার কাছে একটি এসকিউএল ডাটাবেস রয়েছে যা আমি কোনও ওয়েবসাইটের জন্য ব্যবহার করছি। সমস্যাটি হ'ল আমি যখন INSERT INTOএটি চেষ্টা করি তখন আমি একটি পাইPDOException

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

আমি সার্ভারে এসএসএইচ করলাম এবং অনুমতিগুলি পরীক্ষা করলাম, এবং ডাটাবেসটির অনুমতি রয়েছে

-rw-rw-r--

আমি * নিক্স অনুমতিগুলির সাথে তেমন পরিচিত নই তবে আমি নিশ্চিত যে এর অর্থ

  • ডিরেক্টরি নয়
  • মালিক পড়ার / লেখার অনুমতি পড়েছে (এটি আমার মতে ls -l)
  • গোষ্ঠীতে পড়ার / লেখার অনুমতি রয়েছে
  • বাকি প্রত্যেকেরই কেবল অনুমতি পড়ার অনুমতি রয়েছে

আমি sqlite3প্রোগ্রামটি যেভাবে ব্যবহার করতে জানতাম সেদিকেও নজর রেখেছি এবং প্রাসঙ্গিক কোনও কিছুই পাইনি।

কারণ PDO ডেটাবেস খোলার চেষ্টা করছে কি অনুমতি নিয়ে আমি জানতাম না, তা করেছি

chmod o+w supplies.db

এখন, আমি অন্যটি পেয়েছি PDOException:

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

ডাটাবেস খোলার পরে যখন আমি কোনও INSERTক্যোয়ারী চালানোর চেষ্টা করি তখনই এটি ঘটে ।

কি চলছে কোন ধারণা?


মূলত httpd (অ্যাপাচি> পিএইচপি> পিডিও) আপনি নন, সুতরাং এটি ফাইলটির নিজস্ব নয়, সুতরাং এতে লেখার অনুমতি নেই ... আকর্ষণীয় ...
স্পার্ক

sudo chgrp www-data test.dbঅনুমতি যোগ করার সাথে আমার জন্য কাজ করেছে
জিপ্প

উত্তর:


305

সমস্যা, যেমন দেখা যাচ্ছে যে, PDO SQLite চালক প্রয়োজন যে যে আপনি একটি লেখার অপারেশন কি করতে যাচ্ছি (হয় INSERT, UPDATE, DELETE, DROP, ইত্যাদি), তারপর ডাটাবেসের ফোল্ডারের বসবাস লেখার অনুমতি থাকতে হবে প্রকৃত সেইসাথে, ডাটাবেস ফাইল।

আমি পিডিও এসকিউএল ড্রাইভার ড্রাইভার ম্যানুয়াল পৃষ্ঠার একেবারে নীচে একটি মন্তব্যে এই তথ্যটি পেয়েছি ।


9
এছাড়াও, সেলইনাক্স (ইনস্টল থাকলে) অবশ্যই প্রয়োগ করা উচিত নয়। আমাকে তা দেবার জন্য দেড় দিন সময় নিয়েছে।
স্টিভ ভি।

1
হুম, দুঃখিত, তবে আমি ধন্যবাদ জানাই এটি ছিল তবে এটি কেবল সাময়িকভাবে সমস্যাটি সমাধান করেছে, মূল সমস্যাটি ছিল আমার www-ডেটা ব্যবহারকারী www-ডেটা গ্রুপে ছিল না।
ডোরিয়ান

5
আমি জানি, ধারণকৃত ফোল্ডারটি অবশ্যই লিখনযোগ্য হবে কারণ লেখার সময় একটি জার্নালিং ফাইল তৈরি হবে এবং তাই নিজেই ডিবি। ওয়েবসভার হিসাবে একই ব্যবহারকারী থাকতে, ফাইলের বিষয়বস্তু অন্য নির্মিত অ্যাডহকটিতে অনুলিপি করার চেষ্টা করুন।
Lcapra

4
এছাড়াও যে ডিবি ফাইল এবং ডিরেক্টরি এটিতে থাকে তার অবশ্যই লিনাক্স বাক্সগুলিতে 'www-ডেটা' এর মালিকানা থাকতে হবে।
আনিসবেট

1
বর্তমানে sqlite3 এ 3 টি ফাইল থাকতে পারে .db, একটি, .db-shmএবং একটি .db-walফাইল এবং অবশ্যই তিনটির মূল ডিরেক্টরি রয়েছে যা অবশ্যই প্রোগ্রামটি চালিত ব্যবহারকারীর জন্য সমস্ত লিখিত হতে হবে।
মার্কোস ডায়োনি 15

17

এই ঘটতে পারে নিজেই SQLite ফাইল মালিক না স্ক্রিপ্ট চালাতে ব্যবহারকারী হিসাবে একই। একই ডিরেক্টরি ত্রুটিগুলি ঘটতে পারে যদি পুরো ডিরেক্টরি পাথ (পথে প্রতিটি ডিরেক্টরি অর্থ) না লেখা যায়।

SQLite ফাইলের মালিক কে? আপনি?

স্ক্রিপ্টটি কে চলছে? আপাচে না কেউ?


1
আমি এসকিউএলাইট ফাইলের মালিক, তবে স্ক্রিপ্টটি কার হিসাবে চলছে তা আমি জানি না। আমি কীভাবে জানতে পারি? (মনে রাখবেন, এটি একটি শেয়ার্ড হোস্টে রয়েছে এবং আমার কাছে সীমিত অনুমতি রয়েছে)
অস্টিন হাইড

1
আহ, এটি জিনিসগুলিকে আরও মজা দেয়। আপনি যদি শেয়ার্ড হোস্টিংয়ে থাকেন তবে স্ক্রিপ্টটি "কেউ নয়" বা "অ্যাপাচি" হিসাবে চালিত হওয়ার খুব ভাল সুযোগ রয়েছে। আপনার স্ক্রিপ্টে একটি ফাইল তৈরি করুন ( file_put_contents('./foo.txt', 'Hello, world');), এটি আপনাকে দেখাবে যে এটি কে চলছে। সম্ভাবনাগুলি হ'ল আপনার স্ক্রিপ্টটি এসকিউএল ডাটাবেস তৈরি করতে হবে। আপনার বর্তমান ফাইলে যদি ইতিমধ্যে ডেটা থাকে তবে এটি একটি বিনোদনমূলক অনুশীলন হতে পারে ...
চার্লস

ভাল ধারণা, কিন্তু না। পিএইচপি যে হিসাবে চলমান রয়েছে তার লেখার অধিকার নেই, সুতরাং এটি ফাইলটি তৈরি করতে পারে না। পিএইচপি কি বর্তমানে এটি ব্যবহার করছে তা ব্যবহারকারীর পুনরুদ্ধার করতে পারে?
অস্টিন হাইড

POSIX এক্সটেনশনের মাধ্যমে একমাত্র উপায় বলে মনে হচ্ছে , যা POSIX-y সিস্টেমে ডিফল্টরূপে সক্ষম করা হয়েছে। যদিও আপনার হোস্টিং সরবরাহকারীর টিএফএম আর ডি অক্ষম থাকতে পারে ।
চার্লস

ঠিক আছে, তারা টিএফএম ঠিক আছে, ঠিক আছে। posix_getuid()কাজ করে না।
অস্টিন হাইড

6

আমার জন্য সমস্যাটি অনুমতিগুলির চেয়ে সেলইনাক্স প্রয়োগকারী ছিল । স্বীকৃত উত্তরের একটি মন্তব্যে স্টিভ ভি এর দেওয়া পরামর্শ অনুসরণ করে "প্রয়োগযোগ্য পঠনযোগ্য ডাটাবেস" ত্রুটিটি একবার কার্যকর হয়ে যায় enforcement

echo 0 >/selinux/enforce

এই কমান্ডটি চালানোর পরে, সবকিছু ইচ্ছাকৃতভাবে কাজ করেছে (CentOS 6.3))

গ্রাফাইট সেট আপ করার সময় আমি যে নির্দিষ্ট সমস্যার মুখোমুখি হয়েছিলাম তা হ'ল। আমি ট্রিপল-চেক করেছিলাম যে অ্যাপাচি ব্যবহারকারীর মালিকানাধীন এবং আমার গ্রাফাইট.ডিবি এবং এর মূল ডিরেক্টরি উভয়কেই লিখতে পারে। তবে আমি সেলইনাক্সকে "স্থির" না করা পর্যন্ত, আমার যা কিছু পেয়েছিল তা হ'ল: ডাটাবেসএরর: একটি পঠনযোগ্য ডেটাবেস লেখার চেষ্টা


8
সেলইনক্স একটি সুরক্ষা ব্যবস্থা, সুতরাং খুব ভাল কারণ ব্যতীত অক্ষম করা উচিত নয়। SELinux কেন প্রথম স্থানে ব্লক করছে এবং এটি অক্ষম করার পরিবর্তে এটি সঠিকভাবে কনফিগার করা আরও ভাল হবে।
জেনস ওয়েগার

5

এটি সেলইনাক্সের কারণে হতে পারে। আপনি যদি SELinux সম্পূর্ণরূপে অক্ষম করতে না চান, আপনাকে ডিবি ডিরেক্টরি fcontext সেট করতে হবে httpd_sys_rw_content_t।

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

4

যখন আমি অ্যান্ড্রয়েড সিস্টেমে একটি ডাটাবেসে লেখার চেষ্টা করেছি তখন আমি এই ত্রুটিটি পেয়েছি।

স্পষ্টতই sqlite3 কেবলমাত্র ডাটাবেস ফাইল এবং ধারণকারী ডিরেক্টরিতে (যেমন @ অস্টিন-হাইড ইতিমধ্যে তার উত্তরে বলেছে) লেখার অনুমতি প্রয়োজন নয়, তবে পরিবেশের পরিবর্তনশীলটিকে TMPDIRএকটি (সম্ভবত লেখার যোগ্য) ডিরেক্টরিতে নির্দেশ করতে হবে।

আমার অ্যান্ড্রয়েড সিস্টেমে আমি এটি সেট করেছি TMPDIR="/data/local/tmp"এবং এখন আমার স্ক্রিপ্টটি প্রত্যাশা অনুযায়ী চলবে :)

সম্পাদনা:

আপনি যদি পরিবেশের ভেরিয়েবলগুলি সেট করতে না পারেন তবে আপনি এখানে তালিকাভুক্ত অন্য পদ্ধতিগুলির মধ্যে একটি ব্যবহার করতে পারেন: https://www.sqlite.org/tempfiles.html#temporary_file_stores_locations likePRAGMA temp_store_directory = 'directory-name';


2

আমি আইআইএস থেকে উইন্ডোজ under এর নীচে একই ত্রুটি পেয়েছি this আপনি যদি আইআইএসের পরিবর্তে ওয়েবম্যাট্রিক্সের অধীনে স্ক্লাইট ব্যবহার করেন তবে আপনাকে অনুমতিগুলি পরিবর্তন করতে হবে না।


2

সংক্ষেপে, আমি সাবফোল্ডারে ডাটাবেস ফাইল (* .db) রেখে সমস্যার সমাধান করেছি।

  • এর মধ্যে থাকা সাবফোল্ডার এবং ডাটাবেস ফাইলটি অবশ্যই www-ডেটা গ্রুপের সদস্য হতে হবে।
  • Www-ডেটা গ্রুপে আপনার অবশ্যই সাবফোল্ডার এবং ডাটাবেস ফাইলটিতে লেখার অধিকার থাকতে হবে।

0

আমি আমার ব্রাউজারে এই পেয়েছিলাম যখন আমি ব্যবহার থেকে পরিবর্তিত HTTP: // স্থানীয় হোস্ট করার http://145.900.50.20 (যেখানে 145.900.50.20 আমার স্থানীয় IP ঠিকানা) এবং তারপর স্থানীয় হোস্ট ফিরে পরিবর্তিত - এটা সঙ্গে থাকতে প্রয়োজন ছিল আইপি অ্যাড্রেস একবার আমি একবার যে পরিবর্তিত হয়েছিল


0

আমি ব্যবহার করতাম:

প্রতিধ্বনি এক্সিকিউট ('হোয়ামি');

স্ক্রিপ্টটি কে চালাচ্ছেন তা জানতে (ব্যবহারকারীর নাম বলুন) এবং তারপরে পুরো অ্যাপ্লিকেশন ডিরেক্টরিতে ব্যবহারকারীর অনুমতি দেওয়া হয়েছে, যেমন:

sudo chown -R: ব্যবহারকারীর নাম / var / www / html / myapp

আশা করছি এটা ওখানে কাওকে সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.