ฉันจะเปลี่ยนฐานข้อมูล SQLite จากอ่านอย่างเดียวเป็นอ่านเขียนได้อย่างไร
เมื่อฉันดำเนินการคำสั่งอัพเดตฉันมักจะได้รับ:
ข้อผิดพลาด SQL: พยายามเขียนฐานข้อมูลแบบอ่านอย่างเดียว
ไฟล์ SQLite เป็นไฟล์ที่เขียนได้บนระบบไฟล์
ฉันจะเปลี่ยนฐานข้อมูล SQLite จากอ่านอย่างเดียวเป็นอ่านเขียนได้อย่างไร
เมื่อฉันดำเนินการคำสั่งอัพเดตฉันมักจะได้รับ:
ข้อผิดพลาด SQL: พยายามเขียนฐานข้อมูลแบบอ่านอย่างเดียว
ไฟล์ SQLite เป็นไฟล์ที่เขียนได้บนระบบไฟล์
คำตอบ:
ข้อความแสดงข้อผิดพลาดนี้อาจมีสาเหตุหลายประการ:
หลายกระบวนการเปิดฐานข้อมูลในเวลาเดียวกัน ( ดูคำถามที่พบบ่อย )
มีปลั๊กอินสำหรับบีบอัดและเข้ารหัสฐานข้อมูล ไม่อนุญาตให้แก้ไข DB
สุดท้ายคำถามที่พบบ่อยอื่นกล่าวว่า: "ตรวจสอบให้แน่ใจว่าไดเร็กทอรีที่มีไฟล์ฐานข้อมูลสามารถเขียนได้โดยผู้ใช้ที่เรียกใช้สคริปต์ CGI" ฉันคิดว่านี่เป็นเพราะเอ็นจิ้นต้องการสร้างไฟล์เพิ่มเติมในไดเร็กทอรี
ระบบไฟล์ทั้งหมดอาจอ่านได้อย่างเดียวเช่นหลังจากเกิดข้อขัดข้อง
ในระบบ Unix กระบวนการอื่นสามารถแทนที่ไฟล์ทั้งหมดได้
ฉันแก้ไขสิ่งนี้โดยเปลี่ยนเจ้าของจากรูทเป็นฉันในไฟล์ทั้งหมดบน / db dir
เพียงแค่ทำls -l
ในโฟลเดอร์นั้นหากมี filer เป็นของคุณroot
เพียงแค่เปลี่ยนเป็นคุณโดยใช้:sudo chown user file
ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อมีการเข้าถึงฐานข้อมูลของคุณโดยแอปพลิเคชันหนึ่งอยู่แล้วและคุณกำลังพยายามเข้าถึงด้วยแอปพลิเคชันอื่น
(โดยทั่วไปข้อความแสดงข้อผิดพลาดนี้ทำให้เข้าใจผิดและมักเป็นข้อผิดพลาดในการอนุญาตทั่วไป)
บน Windows
หากใช้ Android.
ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มสิทธิ์ในการเขียนลงEXTERNAL_STORAGE
ในAndroidManifest.xml
ไฟล์.
เพิ่มบรรทัดนี้ในAndroidManifest.xml
ไฟล์ของคุณด้านบนและด้านนอก<application>
แท็กของคุณ
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
เพื่อให้แอปพลิเคชันของคุณเขียนลง sdcard สิ่งนี้จะช่วยได้หากคุณEXTERNAL_STORAGE
เป็นที่ที่คุณเก็บฐานข้อมูลไว้ในอุปกรณ์
ในเชลล์คำสั่ง Linux ฉันทำ:
chmod 777 <db_folder>
ที่มีไฟล์ฐานข้อมูล
มันได้ผล. ตอนนี้ฉันสามารถเข้าถึงฐานข้อมูลของฉันและทำการแทรกแบบสอบถาม
ฉันมีปัญหานี้ในวันนี้เช่นกัน
มันเกิดจาก ActiveSync บน Windows Mobile - โฟลเดอร์ที่ฉันกำลังทำงานอยู่ถูกซิงค์ดังนั้นกระบวนการ AS จึงคว้าไฟล์ DB เป็นครั้งคราวทำให้เกิดข้อผิดพลาดนี้
เพื่อแบ่งปันประสบการณ์ส่วนตัวฉันพบกับข้อผิดพลาดนี้ซึ่งในที่สุดก็แก้ไขทั้งสองอย่าง อาจไม่จำเป็นต้องเกี่ยวข้องกับปัญหาของคุณ แต่ดูเหมือนว่าข้อผิดพลาดนี้เป็นเรื่องธรรมดามากจนสามารถนำมาประกอบกับสิ่งต่างๆนับล้าน
อินสแตนซ์ฐานข้อมูลเปิดในแอปพลิเคชันอื่น ดูเหมือนว่าฐานข้อมูลของฉันจะอยู่ในสถานะ "ล็อก" ดังนั้นจึงเปลี่ยนเป็นโหมดอ่านอย่างเดียว ฉันสามารถติดตามได้โดยหยุดอินสแตนซ์ที่ 2 ของแอปพลิเคชันที่แชร์ฐานข้อมูล
สิทธิ์ไดเร็กทอรีทรี - โปรดตรวจสอบให้แน่ใจว่าบัญชีผู้ใช้มีสิทธิ์ไม่เพียง แต่ในระดับไฟล์ แต่อยู่ในระดับไดเร็กทอรีบนทั้งหมดจนถึง / ระดับ
ขอบคุณ
บน Linux ให้สิทธิ์ในการอ่าน / เขียนแก่ทั้งโฟลเดอร์ที่มีไฟล์ฐานข้อมูล
นอกจากนี้ SELinux อาจบล็อกการเขียน คุณต้องตั้งค่าสิทธิ์ที่ถูกต้อง
ใน SELinux Management GUI ของฉัน (บน Fedora 19) ฉันทำเครื่องหมายที่ช่องบนบรรทัดที่มีข้อความว่า httpd_unified (รวมการจัดการ HTTPD ของไฟล์เนื้อหาทั้งหมด) และฉันก็พร้อมที่จะไป
บน Windows:
tl; dr: ลองเปิดไฟล์อีกครั้ง
ระบบของเราประสบปัญหานี้และแน่นอนว่าไม่ใช่ปัญหาสิทธิ์เนื่องจากโปรแกรมจะสามารถเปิดฐานข้อมูลที่เขียนได้จากหลายเธรดเกือบตลอดเวลา แต่ในบางครั้ง (เฉพาะใน Windows เท่านั้นไม่ใช่บน OSX) เธรดจะได้รับข้อผิดพลาดเหล่านี้แม้ว่าเธรดอื่น ๆ ทั้งหมดในโปรแกรมจะไม่มีปัญหา
ในที่สุดเราก็พบว่าเธรดที่ล้มเหลวเป็นเพียงเธรดที่พยายามเปิดฐานข้อมูลทันทีหลังจากเธรดอื่นปิดไปแล้ว (ภายใน 3 มิลลิวินาที) เราคาดเดาว่าปัญหาเกิดจากการที่ Windows (หรือการใช้งาน sqlite ใน windows) ไม่ได้ล้างทรัพยากรไฟล์ในทันทีเมื่อปิดไฟล์ เราทำได้โดยการเรียกใช้ test write query กับ db เมื่อเปิด (เช่นสร้างแล้ววางตารางด้วยชื่อโง่ ๆ ) หากการสร้าง / วางล้มเหลวเราจะรอ 50 มิลลิวินาทีแล้วลองอีกครั้งทำซ้ำจนกว่าเราจะสำเร็จหรือ 5 วินาทีผ่านไป
มันทำงาน; เห็นได้ชัดว่าต้องมีเวลาเพียงพอสำหรับทรัพยากรที่จะล้างออกไปยังดิสก์
ใน 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>
จากบรรทัดคำสั่งป้อนโฟลเดอร์ที่มีไฟล์ฐานข้อมูลของคุณและดำเนินการคำสั่งต่อไปนี้:
chmod 777 databasefilename
การดำเนินการนี้จะให้สิทธิ์ทั้งหมดแก่ผู้ใช้ทุกคน
แก้ไขฐานข้อมูล: ฉันมีปัญหาในการแก้ไขฐานข้อมูล ฉันต้อง
sudo chown 'ชื่อผู้ใช้ที่ไม่ใช่รูท' ts3server.sqlitedb
ตราบใดที่มันไม่ใช่รูทฉันสามารถแก้ไขไฟล์ได้ ชื่อผู้ใช้คือชื่อผู้ใช้ของบัญชีที่ไม่ใช่รูทของฉัน
เริ่ม TeamSpeak โดยอัตโนมัติ: เป็น
crontab บัญชีที่ไม่ใช่รูทของคุณ -e
@reboot / path ไปยัง ts3server / aka /home/ts3server/ts3server_startscript.sh start
ในเส้นทางโครงการ Terminal django_project #
sudo chown django:django *