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عبر رابط مباشر، مع جميع كلمات المرور وبيانات المستخدمين.