SQLite: khi nào nó là đủ
Khi nào SQLite trên VPS tốt hơn một máy chủ cơ sở dữ liệu riêng, cách bật WAL và tránh “database is locked”, và khi nào đã đến lúc chuyển sang PostgreSQL.
Cập nhật 23 tháng 8, 2026
SQLite là cơ sở dữ liệu nằm trong một tệp duy nhất — không dịch vụ, không cổng, không mật khẩu. Với một bot, một bảng điều khiển nhỏ hay một trang web ít ghi dữ liệu, đây là lựa chọn phù hợp: nó không ngốn bộ nhớ, mà VDS-1 chỉ có 2 GB, và cũng chẳng có gì cần cấu hình.
Khi nào nên dùng
Phù hợp:
- Bot Telegram và Discord, bộ đếm, cài đặt;
- trang web có hàng nghìn lượt đọc và vài chục lượt ghi mỗi phút;
- mọi dự án trên một máy duy nhất, không có kế hoạch thêm máy chủ thứ hai.
Không phù hợp:
- nhiều tiến trình cùng ghi dữ liệu một lúc;
- cơ sở dữ liệu lớn hơn vài chục gigabyte;
- truy cập qua mạng từ máy khác — SQLite đơn giản là không làm được điều này.
Trong trường hợp thứ hai và thứ ba, hãy dùng PostgreSQL hoặc MySQL.
Làm việc với tệp
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
Tệp cơ sở dữ liệu phải nằm trên đĩa cục bộ của máy và thuộc sở hữu của người dùng chạy ứng dụng:
chown appuser:appuser /srv/app/data/app.db
chmod 640 /srv/app/data/app.db
Thư mục chứa cơ sở dữ liệu cũng phải ghi được: SQLite tạo các tệp tạm -wal và -shm bên cạnh nó.
Cài đặt bắt buộc
Hai thiết lập pragma loại bỏ hầu hết các vấn đề:
PRAGMA journal_mode = WAL;
PRAGMA busy_timeout = 5000;
WAL cho phép các tiến trình đọc đọc dữ liệu trong khi đang ghi — nếu không có nó, mọi lượt đọc đều bị lượt ghi chặn. busy_timeout khiến client chờ năm giây thay vì báo lỗi ngay lập tức. Hãy đặt chúng mỗi lần mở kết nối trong mã, chứ không phải đặt một lần trong console.
Sao lưu
Bạn không thể sao chép tệp bằng cp thông thường khi ứng dụng đang chạy — bạn sẽ nhận được một cơ sở dữ liệu bị hỏng. Có một lệnh an toàn tích hợp sẵn:
sqlite3 /srv/app/data/app.db ".backup '/srv/backups/app-$(date +%F).db'"
Hãy đưa nó vào cron và chuyển bản sao ra khỏi máy: VPS không có sao lưu tự động và cũng không có snapshot. Cách làm tổng quát được trình bày trong sao lưu cơ sở dữ liệu.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân |
|---|---|
database is locked | Không bật WAL hoặc busy_timeout, hoặc một tiến trình thứ hai đang giữ giao dịch kéo dài |
attempt to write a readonly database | Không có quyền trên tệp hoặc thư mục |
disk I/O error | Hết dung lượng đĩa — kiểm tra vòng dung lượng đĩa trong “Tổng quan” |
| Cơ sở dữ liệu phình to sau khi xóa các hàng | Không gian không được thu hồi tự động: VACUUM |
| Cơ sở dữ liệu bị hỏng sau khi sao chép | Bạn đã sao chép bằng cp khi đang chạy — chỉ dùng .backup |
Khi nào cần di chuyển
Dấu hiệu: lỗi database is locked thường xuyên ngay cả khi đã bật WAL, nhiều worker của ứng dụng, các báo cáo mất vài phút để tính. Để di chuyển, xem di chuyển cơ sở dữ liệu.
Tệp cơ sở dữ liệu không được nằm trong thư mục do máy chủ web phục vụ.
/var/www/app.dbcó thể bị tải xuống qua một liên kết trực tiếp, kèm theo toàn bộ mật khẩu và dữ liệu người dùng.