SQLite: কখন এটি যথেষ্ট
VPS-এ SQLite কোথায় আলাদা ডেটাবেস সার্ভারের চেয়ে ভালো, কীভাবে WAL চালু করবেন ও “database is locked” এড়াবেন, এবং কখন PostgreSQL-এ যাওয়ার সময়।
আপডেট: ২৩ আগস্ট, ২০২৬
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 | ডিস্ক স্পেস শেষ — “Overview”-তে ডিস্ক ব্যবহারের রিং দেখুন |
| রো ডিলিট করার পরেও ডেটাবেস বাড়ে | স্পেস স্বয়ংক্রিয়ভাবে ফেরত আসে না: VACUUM |
| কপি করার পর ডেটাবেস নষ্ট | চলাকালীন cp দিয়ে কপি করেছেন — শুধু .backup ব্যবহার করুন |
কখন মাইগ্রেট করবেন
লক্ষণ: WAL চালু থাকা সত্ত্বেও নিয়মিত database is locked ত্রুটি, একাধিক অ্যাপ্লিকেশন ওয়ার্কার, কয়েক মিনিট সময় নেয় এমন রিপোর্ট। স্থানান্তরের জন্য ডেটাবেস মাইগ্রেশন দেখুন।
ডেটাবেস ফাইলটি ওয়েব সার্ভার দ্বারা পরিবেশিত কোনো ডিরেক্টরিতে রাখা যাবে না।
/var/www/app.dbসরাসরি লিঙ্কের মাধ্যমে ডাউনলোড করা যায়, সাথে সব পাসওয়ার্ড ও ইউজার ডেটাও।