PostgreSQL: cài đặt và cơ sở dữ liệu đầu tiên của bạn
Cài đặt PostgreSQL trên VDS, role và cơ sở dữ liệu đầu tiên, cách xác thực hoạt động trong pg_hba.conf, và khắc phục lỗi kết nối.
Cập nhật 23 tháng 8, 2026
PostgreSQL là lựa chọn mặc định cho các ứng dụng viết bằng Python, Node.js và Go. Nó xử lý dữ liệu nghiêm ngặt hơn MySQL và xử lý các truy vấn phức tạp tốt hơn.
Cài đặt
apt update && apt install -y postgresql postgresql-contrib # Debian, Ubuntu
systemctl enable --now postgresql
Trên AlmaLinux và CentOS Stream, bạn cần tạo cluster thủ công:
dnf install -y postgresql-server postgresql-contrib
postgresql-setup --initdb
systemctl enable --now postgresql
Kiểm tra phiên bản và trạng thái:
sudo -u postgres psql -c "SELECT version();"
Role và cơ sở dữ liệu
Trong PostgreSQL, người dùng được gọi là role. Hãy tạo một role riêng cho mỗi dự án:
sudo -u postgres psql
CREATE ROLE shop WITH LOGIN PASSWORD 'long-random-password';
CREATE DATABASE shop OWNER shop ENCODING 'UTF8';
REVOKE ALL ON DATABASE shop FROM PUBLIC;
Chuỗi kết nối cho ứng dụng:
postgresql://shop:password@127.0.0.1:5432/shop
Kiểm tra từ người dùng hệ thống:
psql "postgresql://shop:password@127.0.0.1:5432/shop" -c "\dt"
Xác thực
Hai tệp quyết định ai có thể đăng nhập và từ đâu.
/etc/postgresql/17/main/postgresql.conf:
listen_addresses = 'localhost'
port = 5432
/etc/postgresql/17/main/pg_hba.conf — các quy tắc được đọc từ trên xuống dưới, và quy tắc khớp đầu tiên sẽ được áp dụng:
local all postgres peer
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
Phương thức peer nghĩa là “người dùng hệ thống khớp với role” — đó là lý do sudo -u postgres psql hoạt động mà không cần mật khẩu, trong khi lệnh tương tự từ người dùng khác thì không.
Sau khi chỉnh sửa: systemctl reload postgresql. Tuyệt đối không dùng phương thức trust — nó cho phép bất kỳ ai vào mà không cần mật khẩu.
Để truy cập từ bên ngoài, hãy đọc truy cập từ xa: bạn không được mở cổng ra bên ngoài mà không giới hạn theo địa chỉ.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân |
|---|---|
role "..." does not exist | Bạn đang kết nối bằng người dùng hệ thống không có role |
password authentication failed | Quy tắc trong pg_hba.conf yêu cầu phương thức khác, hoặc chưa đặt mật khẩu |
could not connect to server: No such file or directory | Dịch vụ không chạy, hoặc dùng cổng khác |
permission denied for schema public | Từ phiên bản 15 trở lên, bạn phải cấp quyền trên public một cách tường minh: GRANT ALL ON SCHEMA public TO shop; |
FATAL: sorry, too many clients | max_connections đã cạn — hãy thiết lập pool ở phía ứng dụng |
Log: /var/log/postgresql/ hoặc journalctl -u postgresql.
Các bước tiếp theo
- Tinh chỉnh bộ nhớ theo tier — trên VDS-1, các giá trị mặc định thấp hơn đáng kể so với nhu cầu.
- Sao lưu —
pg_dumpvà khôi phục. - Di chuyển cơ sở dữ liệu từ máy chủ khác.
Đừng cấp cho ứng dụng một role superuser. Một role chủ sở hữu cơ sở dữ liệu thông thường có thể làm mọi thứ cần thiết, nhưng không thể xóa các cơ sở dữ liệu lân cận nếu một lần migration gặp lỗi.