Skip to content
VDS · قواعد البيانات

SQLite: متى تكفي

أين تكون SQLite على VPS أفضل من خادم قاعدة بيانات منفصل، وكيف تُفعّل WAL وتتجنب «database is locked»، ومتى يحين وقت الانتقال إلى PostgreSQL.

آخر تحديث 23 أغسطس 2026

SQLite قاعدة بيانات في ملف واحد — بلا خدمة، بلا منفذ، بلا كلمة مرور. بالنسبة لبوت أو لوحة صغيرة أو موقع بكتابات غير متكررة، فهي الخيار الصحيح: لا تستهلك الذاكرة، وVDS-1 يمتلك 2 GB فقط منها، ولا يوجد ما يُضبط.

متى تستخدمها

مناسبة لـ:

  • بوتات Telegram وDiscord، والعدادات، والإعدادات؛
  • المواقع التي تبلغ قراءاتها آلافًا وكتاباتها عشرات في الدقيقة؛
  • أي مشروع على جهاز واحد دون خطط لخادم ثانٍ.

غير مناسبة لـ:

  • عمليات متعددة تكتب في الوقت نفسه بشكل نشط؛
  • قاعدة بيانات أكبر من بضع عشرات من الغيغابايتات؛
  • الوصول عبر الشبكة من جهاز آخر — لا تستطيع SQLite ذلك ببساطة.

في الحالتين الثانية والثالثة، استخدم PostgreSQL أو MySQL.

العمل مع الملف

apt install -y sqlite3
sqlite3 /srv/app/data/app.db
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO users (name) VALUES ('test');
.tables
.schema users
.quit

يجب أن يكون ملف قاعدة البيانات على القرص المحلي للجهاز ومملوكًا لمستخدم التطبيق:

chown appuser:appuser /srv/app/data/app.db
chmod 640 /srv/app/data/app.db

يجب أن يكون الدليل الذي يحتوي على قاعدة البيانات قابلًا للكتابة أيضًا: تُنشئ SQLite ملفات -wal و-shm المؤقتة بجانبه.

الإعدادات المطلوبة

إعدادان من pragma يزيلان معظم المشكلات:

PRAGMA journal_mode = WAL;
PRAGMA busy_timeout = 5000;

يتيح WAL للقارئين القراءة أثناء تنفيذ كتابة — وبدونه يُحجب أي قارئ بسبب الكاتب. يجعل busy_timeout العميل ينتظر خمس ثوانٍ بدلًا من الفشل فورًا. اضبطهما في كل مرة تفتح فيها اتصالًا في الشيفرة، وليس مرة واحدة في الطرفية.

النسخ الاحتياطية

لا يمكنك نسخ الملف باستخدام cp العادي أثناء تشغيل التطبيق — ستحصل على قاعدة بيانات تالفة. هناك أمر آمن مدمج:

sqlite3 /srv/app/data/app.db ".backup '/srv/backups/app-$(date +%F).db'"

ضع الأمر في cron وانقل النسخة خارج الجهاز: لا يمتلك VPS نسخًا احتياطية تلقائية ولا لقطات أيضًا. يُغطى النهج العام في النسخ الاحتياطي لقواعد البيانات.

الأخطاء الشائعة

العَرَضالسبب
database is lockedلا يوجد WAL أو busy_timeout، أو عملية ثانية تحتفظ بمعاملة طويلة
attempt to write a readonly databaseلا توجد أذونات على الملف أو الدليل
disk I/O errorنفدت مساحة القرص — تحقق من حلقة استخدام القرص في «نظرة عامة»
تنمو قاعدة البيانات بعد حذف الصفوفلا تُستعاد المساحة تلقائيًا: VACUUM
قاعدة بيانات تالفة بعد النسخنسخت باستخدام cp أثناء التشغيل — استخدم .backup فقط

متى تنتقل

العلامات: أخطاء database is locked متكررة حتى مع تفعيل WAL، وعمال تطبيق متعددون، وتقارير تستغرق دقائق لحسابها. للانتقال، راجع ترحيل قاعدة البيانات.

يجب ألا يكون ملف قاعدة البيانات في دليل يخدمه خادم الويب. يمكن تنزيل /var/www/app.db عبر رابط مباشر، مع جميع كلمات المرور وبيانات المستخدمين.