เปลี่ยนโหมดฐานข้อมูล SQLite เป็นอ่าน - เขียน


108

ฉันจะเปลี่ยนฐานข้อมูล SQLite จากอ่านอย่างเดียวเป็นอ่านเขียนได้อย่างไร

เมื่อฉันดำเนินการคำสั่งอัพเดตฉันมักจะได้รับ:

ข้อผิดพลาด SQL: พยายามเขียนฐานข้อมูลแบบอ่านอย่างเดียว

ไฟล์ SQLite เป็นไฟล์ที่เขียนได้บนระบบไฟล์


4
ผู้ใช้ที่เรียกใช้ sqlite3 (หรืออะไรก็ตามที่คุณใช้เพื่อดำเนินการสืบค้น) มีสิทธิ์เขียนไปยังฐานข้อมูลหรือไม่ คุณได้ตรวจสอบความเป็นเจ้าของไฟล์อีกครั้งหรือไม่?
ทิมโพสต์

1
ฉันแน่ใจว่าพวกเขาได้รับอนุญาตให้ทำ
user143482

3
ฉันเคยเห็นสิ่งนี้ในเว็บแอปที่ฉันลืมตั้งค่า GID ในไฟล์ฐานข้อมูลและบัญชี "www-data" (ที่ Apache ทำงานอยู่) ถูกปฏิเสธการเข้าถึงไฟล์
finnw

คำตอบ:


92

ข้อความแสดงข้อผิดพลาดนี้อาจมีสาเหตุหลายประการ:

  • หลายกระบวนการเปิดฐานข้อมูลในเวลาเดียวกัน ( ดูคำถามที่พบบ่อย )

  • มีปลั๊กอินสำหรับบีบอัดและเข้ารหัสฐานข้อมูล ไม่อนุญาตให้แก้ไข DB

  • สุดท้ายคำถามที่พบบ่อยอื่นกล่าวว่า: "ตรวจสอบให้แน่ใจว่าไดเร็กทอรีที่มีไฟล์ฐานข้อมูลสามารถเขียนได้โดยผู้ใช้ที่เรียกใช้สคริปต์ CGI" ฉันคิดว่านี่เป็นเพราะเอ็นจิ้นต้องการสร้างไฟล์เพิ่มเติมในไดเร็กทอรี

  • ระบบไฟล์ทั้งหมดอาจอ่านได้อย่างเดียวเช่นหลังจากเกิดข้อขัดข้อง

  • ในระบบ Unix กระบวนการอื่นสามารถแทนที่ไฟล์ทั้งหมดได้


30
ฉันจะเสนอราคาให้กับสัญลักษณ์แสดงหัวข้อย่อยที่สาม - ไดเร็กทอรีที่มีไฟล์ DB ควรสามารถเขียนได้เพื่อให้สามารถสร้างไฟล์ล็อกได้
Kimvais

2
หัวข้อย่อยแรกสำหรับฉัน: D
Vinay

1
อันสุดท้าย. ฉันมักจะลืม sudo: P
Storm

4
ฉันสามารถเพิ่มในรายการนี้: ไฟล์ฐานข้อมูลถูกแทนที่ระหว่างการใช้งาน ฉันไม่ต้องการอธิบายความโง่เขลาที่นำไปสู่ข้อสรุปนี้
Wim Rijnders

1
สิ่งนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบ ในกรณีของฉัน (แอปเดสก์ท็อป) มันเกี่ยวข้องกับ Windows การบีบอัดฐานข้อมูลเนื่องจากฮาร์ดดิสก์หลักมีพื้นที่เหลือน้อยเกินไป ฉันคิดว่า windows จะถามผู้ใช้ว่าต้องการบีบอัดไฟล์เพื่อให้ได้พื้นที่หรือไม่หากผู้ใช้ตอบว่าใช่ปัญหาฐานข้อมูลแบบอ่านอย่างเดียวอาจเกิดขึ้น
Nandostyle

10

ฉันแก้ไขสิ่งนี้โดยเปลี่ยนเจ้าของจากรูทเป็นฉันในไฟล์ทั้งหมดบน / db dir

เพียงแค่ทำls -lในโฟลเดอร์นั้นหากมี filer เป็นของคุณrootเพียงแค่เปลี่ยนเป็นคุณโดยใช้:sudo chown user file


6

ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อมีการเข้าถึงฐานข้อมูลของคุณโดยแอปพลิเคชันหนึ่งอยู่แล้วและคุณกำลังพยายามเข้าถึงด้วยแอปพลิเคชันอื่น


ทำไมคุณถึงพยายามเข้าถึงฐานข้อมูลจากฐานข้อมูลอื่น
Peter Mortensen

ฉันคิดว่าเขาหมายถึงแอปพลิเคชั่นอื่น
amaurymartiny

5

(โดยทั่วไปข้อความแสดงข้อผิดพลาดนี้ทำให้เข้าใจผิดและมักเป็นข้อผิดพลาดในการอนุญาตทั่วไป)

บน Windows

  • หากคุณกำลังออก SQL โดยตรงกับฐานข้อมูลตรวจสอบให้แน่ใจว่าแอปพลิเคชันใดก็ตามที่คุณใช้เพื่อเรียกใช้ SQL นั้นทำงานในฐานะผู้ดูแลระบบ
  • หากแอปพลิเคชันพยายามอัปเดตบัญชีที่ใช้ในการเข้าถึงฐานข้อมูลอาจต้องการสิทธิ์ในโฟลเดอร์ที่มีไฟล์ฐานข้อมูลของคุณ ตัวอย่างเช่นหาก IIS กำลังเข้าถึงฐานข้อมูล IUSR และ IIS_IUSRS ทั้งคู่อาจต้องการการอนุญาตที่เหมาะสม (คุณสามารถลองสิ่งนี้ได้โดยให้บัญชีเหล่านี้ควบคุมโฟลเดอร์อย่างสมบูรณ์ชั่วคราวตรวจสอบว่าใช้งานได้หรือไม่จากนั้นผูกสิทธิ์ตามความเหมาะสม)

1
ฉันต้องเรียกใช้ "DB Browser" ในฐานะผู้ดูแลระบบ
Eben Roux

1
ฉันให้ "การควบคุมทั้งหมด" กับ "ทุกคน" ใน Windows 10 แต่ก็ยังใช้ไม่ได้ อย่างไรก็ตามตามที่ @EbenRoux ระบุไว้คุณอาจต้องเรียกใช้ "DB Browser" ในฐานะผู้ดูแลระบบซึ่งทำให้มันใช้งานได้สำหรับฉัน
peaceoutside

4

หากใช้ Android.

ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มสิทธิ์ในการเขียนลงEXTERNAL_STORAGEในAndroidManifest.xmlไฟล์.

เพิ่มบรรทัดนี้ในAndroidManifest.xmlไฟล์ของคุณด้านบนและด้านนอก<application>แท็กของคุณ

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

เพื่อให้แอปพลิเคชันของคุณเขียนลง sdcard สิ่งนี้จะช่วยได้หากคุณEXTERNAL_STORAGEเป็นที่ที่คุณเก็บฐานข้อมูลไว้ในอุปกรณ์


สิ่งนี้ช่วยแก้ปัญหาของฉันได้ ฉันแก้ไขคำถามเพื่อให้รายละเอียดมากขึ้นและอ่านง่ายขึ้น
prolink007

ขอบคุณมาก. มันช่วยแก้ปัญหาของฉันด้วย หนึ่งโหวตให้ :)
Altaf Sami

4

ในเชลล์คำสั่ง Linux ฉันทำ:

chmod 777 <db_folder>

ที่มีไฟล์ฐานข้อมูล

มันได้ผล. ตอนนี้ฉันสามารถเข้าถึงฐานข้อมูลของฉันและทำการแทรกแบบสอบถาม


ผลกระทบด้านความปลอดภัยคืออะไร?
Peter Mortensen

สิ่งนี้แตกต่างจากคำตอบของเอเดรียนอย่างไร?
Peter Mortensen

1
ใช้งานได้เป็นวิธีแก้ปัญหาที่รวดเร็ว แต่จำเป็นต้องขุดหาวิธีแก้ปัญหาที่ปลอดภัยกว่าในภายหลัง
troydo42

5
การดำเนินการนี้จะให้สิทธิ์ทั้งหมดแก่ผู้ใช้ทุกคนซึ่งอาจไม่ใช่สิ่งที่คุณต้องการจากจุดยืนด้านความปลอดภัย
Renel Chesak

2

ฉันมีปัญหานี้ในวันนี้เช่นกัน

มันเกิดจาก ActiveSync บน Windows Mobile - โฟลเดอร์ที่ฉันกำลังทำงานอยู่ถูกซิงค์ดังนั้นกระบวนการ AS จึงคว้าไฟล์ DB เป็นครั้งคราวทำให้เกิดข้อผิดพลาดนี้


2

เพื่อแบ่งปันประสบการณ์ส่วนตัวฉันพบกับข้อผิดพลาดนี้ซึ่งในที่สุดก็แก้ไขทั้งสองอย่าง อาจไม่จำเป็นต้องเกี่ยวข้องกับปัญหาของคุณ แต่ดูเหมือนว่าข้อผิดพลาดนี้เป็นเรื่องธรรมดามากจนสามารถนำมาประกอบกับสิ่งต่างๆนับล้าน

  1. อินสแตนซ์ฐานข้อมูลเปิดในแอปพลิเคชันอื่น ดูเหมือนว่าฐานข้อมูลของฉันจะอยู่ในสถานะ "ล็อก" ดังนั้นจึงเปลี่ยนเป็นโหมดอ่านอย่างเดียว ฉันสามารถติดตามได้โดยหยุดอินสแตนซ์ที่ 2 ของแอปพลิเคชันที่แชร์ฐานข้อมูล

  2. สิทธิ์ไดเร็กทอรีทรี - โปรดตรวจสอบให้แน่ใจว่าบัญชีผู้ใช้มีสิทธิ์ไม่เพียง แต่ในระดับไฟล์ แต่อยู่ในระดับไดเร็กทอรีบนทั้งหมดจนถึง / ระดับ

ขอบคุณ


1

บน Linux ให้สิทธิ์ในการอ่าน / เขียนแก่ทั้งโฟลเดอร์ที่มีไฟล์ฐานข้อมูล

นอกจากนี้ SELinux อาจบล็อกการเขียน คุณต้องตั้งค่าสิทธิ์ที่ถูกต้อง

ใน SELinux Management GUI ของฉัน (บน Fedora 19) ฉันทำเครื่องหมายที่ช่องบนบรรทัดที่มีข้อความว่า httpd_unified (รวมการจัดการ HTTPD ของไฟล์เนื้อหาทั้งหมด) และฉันก็พร้อมที่จะไป


สิทธิ์ในการอ่าน / เขียนสำหรับใคร
Peter Mortensen

จะตรวจสอบและตั้งค่าได้อย่างไร?
SynCap

1

บน Windows:

tl; dr: ลองเปิดไฟล์อีกครั้ง

ระบบของเราประสบปัญหานี้และแน่นอนว่าไม่ใช่ปัญหาสิทธิ์เนื่องจากโปรแกรมจะสามารถเปิดฐานข้อมูลที่เขียนได้จากหลายเธรดเกือบตลอดเวลา แต่ในบางครั้ง (เฉพาะใน Windows เท่านั้นไม่ใช่บน OSX) เธรดจะได้รับข้อผิดพลาดเหล่านี้แม้ว่าเธรดอื่น ๆ ทั้งหมดในโปรแกรมจะไม่มีปัญหา

ในที่สุดเราก็พบว่าเธรดที่ล้มเหลวเป็นเพียงเธรดที่พยายามเปิดฐานข้อมูลทันทีหลังจากเธรดอื่นปิดไปแล้ว (ภายใน 3 มิลลิวินาที) เราคาดเดาว่าปัญหาเกิดจากการที่ Windows (หรือการใช้งาน sqlite ใน windows) ไม่ได้ล้างทรัพยากรไฟล์ในทันทีเมื่อปิดไฟล์ เราทำได้โดยการเรียกใช้ test write query กับ db เมื่อเปิด (เช่นสร้างแล้ววางตารางด้วยชื่อโง่ ๆ ) หากการสร้าง / วางล้มเหลวเราจะรอ 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
Murphy

0

จากบรรทัดคำสั่งป้อนโฟลเดอร์ที่มีไฟล์ฐานข้อมูลของคุณและดำเนินการคำสั่งต่อไปนี้:

chmod 777 databasefilename

การดำเนินการนี้จะให้สิทธิ์ทั้งหมดแก่ผู้ใช้ทุกคน


24
ซึ่งค่อนข้างแย่.
Marco Kerwitz

1
คำตอบที่สมบูรณ์แบบ!
Jitesh Prajapati

1
อาจแก้ปัญหานี้ได้ แต่ไม่แนะนำเนื่องจากอาจทำให้เกิดปัญหาด้านความปลอดภัย
kathir raja

0

แก้ไขฐานข้อมูล: ฉันมีปัญหาในการแก้ไขฐานข้อมูล ฉันต้อง
sudo chown 'ชื่อผู้ใช้ที่ไม่ใช่รูท' ts3server.sqlitedb
ตราบใดที่มันไม่ใช่รูทฉันสามารถแก้ไขไฟล์ได้ ชื่อผู้ใช้คือชื่อผู้ใช้ของบัญชีที่ไม่ใช่รูทของฉัน

เริ่ม TeamSpeak โดยอัตโนมัติ: เป็น
crontab บัญชีที่ไม่ใช่รูทของคุณ -e
@reboot / path ไปยัง ts3server / aka /home/ts3server/ts3server_startscript.sh start


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.