Giới thiệu và Cài đặt PostgreSQL 19
1. PostgreSQL 19 — bản mới nhất (2026)
PostgreSQL 19 Beta 1 phát hành 04/06/2026 — đây là bản landmark release, đánh dấu bước tiến lớn về SQL tiêu chuẩn với khả năng truy vấn đồ thị native theo chuẩn SQL:2023. Bên cạnh đó, PG 19 mang đến hàng loạt cải tiến về atomic operations, temporal data, developer experience, và performance.
Tính năng mới trong PostgreSQL 19
SQL/PGQ — Property Graph Query
ON CONFLICT DO SELECT
DO NOTHING và DO UPDATE. Atomic get-or-create: nếu row tồn tại thì trả về nguyên bản, nếu không thì insert và trả về. Nhanh hơn 4x so với DO UPDATE SET id=id ... RETURNING * workaround vì không tạo dead tuple, không cần HOT cleanup. Pattern cực kỳ phổ biến trong API idempotency và upsert logic.FOR PORTION OF — Temporal Data
UPDATE/DELETE FOR PORTION OF cho phép thao tác dữ liệu trong khoảng thời gian chỉ định trên temporal table. Hệ thống tự động split row tại biên thời gian — ví dụ: cập nhật lương nhân viên chỉ trong Q2/2026 mà không ảnh hưởng các khoảng thời gian khác. Chuẩn SQL:2011, nền tảng cho hệ thống lưu trữ lịch sử dữ liệu doanh nghiệp.GROUP BY ALL
GROUP BY tất cả cột không phải aggregate trong SELECT. Thay vì phải liệt kê thủ công từng cột, chỉ cần viết GROUP BY ALL — code gọn hơn, tránh lỗi thiếu cột khi thêm/sửa SELECT list. Đặc biệt hữu ích trong BI query có nhiều dimension column.IGNORE NULLS — Window Functions
lead(), lag(), first_value(), last_value(), nth_value() giờ hỗ trợ IGNORE NULLS — bỏ qua giá trị NULL khi duyệt window frame. Ví dụ: lấy ngày giao dịch gần nhất không NULL trong chuỗi thời gian, hay điền giá trị missing từ dòng trước/sau. Không cần subquery phức tạp để lọc NULL.JSON COPY TO
COPY TO hỗ trợ xuất NDJSON (newline-delimited JSON) native. Tùy chọn FORCE_ARRAY để xuất JSON array thay vì từng dòng riêng lẻ. Export dữ liệu dạng JSON trực tiếp từ Postgres mà không cần json_agg() hay tool ETL bên ngoài — lý tưởng cho data pipeline và API feed.REPACK — VACUUM FULL + CLUSTER
VACUUM FULL (thu hồi disk space) và CLUSTER (sắp xếp vật lý theo index) trong một lệnh duy nhất. Chế độ CONCURRENTLY cho phép chạy online — không khóa bảng, không downtime. Giải pháp toàn diện cho bảng bị bloat nặng mà vẫn phục vụ traffic.Parallel Autovacuum
vacuum_uses_parallel_indexes.pg_plan_advice — Official Plan Hints
pg_hint_plan — giờ đã có giải pháp chính chủ, được maintain cùng core.Những cải tiến khác trong PG 19
- Online Data Checksums: Bật/tắt data checksums trên cluster đang chạy — không cần restart, không cần pg_checksums offline.
- 64-bit MultiXactOffset: Loại bỏ giới hạn wraparound 4 tỷ member — hệ thống có transaction rate cực cao không còn lo MultiXactID exhaustion.
- Memoize estimates trong EXPLAIN:
EXPLAIN ANALYZEhiển thị ước lượng cache hit % cho Memoize node — dễ đánh giá hiệu quả cache parameterized query. - pg_get_*_ddl() functions: API chính thức để trích xuất DDL —
pg_get_table_ddl(),pg_get_index_ddl(),pg_get_function_ddl(), v.v. - pg_dumpall non-text formats:
pg_dumpallhỗ trợ custom, directory, tar format — backup toàn cluster nhanh và gọn hơn. - Logical Replication cải tiến: Đồng bộ sequence,
EXCEPT TABLEtrong publication, dynamic WAL level.
Breaking changes — Lưu ý khi nâng cấp lên PostgreSQL 19
- JIT tắt mặc định (
jit = off) — giảm overhead compilation cho OLTP. Nếu bạn dùng JIT cho analytical query phức tạp, cần enable lại thủ công. - LZ4 TOAST compression mặc định thay pglz —
default_toast_compression = lz4. Nén nhanh hơn, ít CPU hơn. Cột TOAST cũ (pglz) vẫn đọc được bình thường, không cần migrate. - RADIUS authentication bị loại bỏ — nếu đang dùng RADIUS, phải chuyển sang LDAP hoặc OAuth trước khi upgrade.
- standard_conforming_strings bắt buộc = on —
\ttrong string literal là ký tự tab, không còn là\ttext. Backslash trong string literal luôn là escape character. - MD5 deprecated (warning, không error) — chuyển hẳn
password_encryption = scram-sha-256. - max_locks_per_transaction tăng gấp đôi (64→128) — shared memory tăng tương ứng. Nếu đang chạy instance nhỏ (dưới 2GB shared_buffers), kiểm tra lại tổng memory.
- log_lock_waits bật mặc định — log tự động khi transaction chờ lock quá
deadlock_timeout(thường 1s). Có thể gây nhiễu log nếu app thường xuyên chờ lock ngắn.
PostgreSQL 18 — nền tảng hiện tại (09/2025)
PostgreSQL 18 phát hành 25/09/2025 vẫn là bản stable được dùng rộng rãi nhất. Những cải tiến cốt lõi từ PG 18 tạo nền tảng cho PG 19:
Async I/O subsystem
io_method parameter.uuidv7()
uuid_generate_v4() khi cần primary key time-ordered.Virtual generated columns
amount_with_tax NUMERIC GENERATED ALWAYS AS (amount * 1.1) VIRTUAL.OLD/NEW trong RETURNING
INSERT/UPDATE/DELETE/MERGE returning được cả OLD và NEW — audit log dễ hơn rất nhiều, không cần trigger để bắt giá trị trước/sau.B-tree Skip Scan
OAuth authentication
pg_hba.conf.Version policy
Postgres release major version mỗi năm (tháng 9). Support 5 năm mỗi version.
| Version | Release | EOL |
|---|---|---|
| 19 | 09/2026 (dự kiến) | 11/2031 |
| 18 | 09/2025 | 11/2030 |
| 17 | 09/2024 | 11/2029 |
| 16 | 09/2023 | 11/2028 |
| 15 | 10/2022 | 11/2027 |
2. Cài đặt — 3 cách
Cách 1 (khuyên dùng) — Docker
# PostgreSQL 19 (mới nhất, đang Beta)
docker run --name pg19 \
-e POSTGRES_PASSWORD=mysecretpw \
-e POSTGRES_DB=learnpg \
-p 5432:5432 \
-v pgdata19:/var/lib/postgresql/data \
-d postgres:19-beta1
# PostgreSQL 18 (stable cho production)
docker run --name pg18 \
-e POSTGRES_PASSWORD=mysecretpw \
-e POSTGRES_DB=learnpg \
-p 5433:5432 \
-v pgdata18:/var/lib/postgresql/data \
-d postgres:18-alpine
Kết nối: localhost:5432 (PG 19) hoặc localhost:5433 (PG 18), user postgres, password mysecretpw.
Cách 2 — Native install
- Windows: tải từ enterprisedb.com/downloads/postgres-postgresql-downloads, installer kèm pgAdmin.
- macOS:
brew install postgresql@18(hoặcpostgresql@19khi GA). - Ubuntu/Debian:
sudo apt install -y postgresql-common sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh sudo apt install -y postgresql-18 # Stable # sudo apt install -y postgresql-19 # Khi GA
Cách 3 — Managed cloud
- Supabase (free tier hào phóng, có dashboard, hiện đang chạy PG 15/17).
- Neon (serverless Postgres, free tier, thường cập nhật version mới nhanh nhất).
- AWS RDS / Azure Database for PostgreSQL / Google Cloud SQL.
3. Tool quản lý
| Tool | Platform | Ghi chú |
|---|---|---|
| pgAdmin 4 | All | Chính chủ, free, web/desktop. Hỗ trợ PG 19. |
| DBeaver | All | Free, đa DB, query plan visual. |
| TablePlus | Mac/Win/Linux | UI đẹp nhất, free version giới hạn tab. |
| DataGrip | All | JetBrains, trả phí, smartest. |
| psql | All | CLI chính thức — học tốt nó là điểm cộng PV. |
4. psql CLI — phải biết
# Kết nối
psql -h localhost -p 5432 -U postgres -d learnpg
# Connection string
psql "postgresql://postgres:mysecretpw@localhost:5432/learnpg"
Meta-command (chỉ trong psql)
| Lệnh | Tác dụng |
|---|---|
\l | List database |
\c dbname | Connect db |
\dt | List table |
\d table | Describe table |
\di | List index |
\df | List function |
\du | List user/role |
\dn | List schema |
\dx | List extension |
\timing | Bật/tắt đo thời gian query |
\x | Toggle expanded display |
\q | Quit |
\? | Help meta-commands |
\h SELECT | Help SQL syntax |
\dt. Biết được psql nâng tầm fresher lên junior+ trong mắt phỏng vấn.5. Tạo database đầu tiên
-- Trong psql
CREATE DATABASE learnpg WITH ENCODING 'UTF8';
\c learnpg
CREATE TABLE greetings (
id BIGSERIAL PRIMARY KEY,
text TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
INSERT INTO greetings (text) VALUES ('Xin chào PostgreSQL 19!');
SELECT * FROM greetings;
Trước PG 19, pattern phổ biến là
INSERT ... ON CONFLICT DO UPDATE SET id = id RETURNING *— nhưng cách này tạo dead tuple và chậm. Từ PG 19, dùngINSERT ... ON CONFLICT DO SELECT— nhanh hơn 4x, không dead tuple, là giải pháp chính thức cho idempotency.
- Lower snake_case cho table/column (chuẩn cộng đồng).
TEXTthay vìVARCHAR(MAX)— không có giới hạn, perf giốngVARCHAR(n).BIGSERIAL=BIGINT GENERATED BY DEFAULT AS IDENTITY(cú pháp ngắn).TIMESTAMPTZ— luôn có timezone, lưu UTC.NOW()thay vìGETDATE().- Identifier với
"", không[].
6. Cấu hình ban đầu
postgresql.conf — tham số quan trọng
| Tham số | Ý nghĩa | Khởi điểm (8GB RAM) |
|---|---|---|
shared_buffers | Memory cho data cache | 2GB (25% RAM) |
effective_cache_size | Hint planner về OS cache | 6GB (75% RAM) |
work_mem | Memory mỗi query/sort | 32MB–64MB |
maintenance_work_mem | Cho VACUUM, INDEX, ALTER | 512MB |
max_connections | Số connection đồng thời | 100 (dev), tăng cẩn thận |
wal_level | Mức WAL log | replica hoặc logical |
Tham số mới hoặc thay đổi mặc định trong PG 19
| Tham số | Mặc định PG 18 | Mặc định PG 19 | Ý nghĩa |
|---|---|---|---|
jit | on | off | JIT compilation tắt mặc định — giảm overhead OLTP |
default_toast_compression | pglz | lz4 | TOAST nén LZ4 nhanh hơn, ít CPU hơn |
io_method | (không có) | worker | Phương thức async I/O từ PG 18 AIO subsystem |
max_locks_per_transaction | 64 | 128 | Tăng gấp đôi — giảm lỗi "out of shared memory" |
log_lock_waits | off | on | Tự động log khi transaction chờ lock > deadlock_timeout |
pg_hba.conf — authentication
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 scram-sha-256
scram-sha-256 cho tất cả connection mới. Nếu đang migrate từ bản cũ, cập nhật password_encryption = scram-sha-256.Reload sau khi sửa:
SELECT pg_reload_conf();
7. Schema & role
-- Postgres database có nhiều schema (mặc định: public)
CREATE SCHEMA shop;
SET search_path TO shop, public;
-- Tạo role + grant
CREATE ROLE app_user WITH LOGIN PASSWORD 'apppwd';
GRANT CONNECT ON DATABASE learnpg TO app_user;
GRANT USAGE ON SCHEMA shop TO app_user;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA shop TO app_user;
"Postgres có cluster -> database -> schema -> table. Mỗi database hoàn toàn tách biệt (không JOIN cross-database trực tiếp được). Schema giống namespace bên trong database.
publiclà default schema. SQL Server thì DB = schema container, không có khái niệm cluster."
8. Extensions — sức mạnh thực sự của Postgres
-- Xem extension có sẵn
SELECT * FROM pg_available_extensions ORDER BY name;
-- Install
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID generator (uuid_generate_v4)
CREATE EXTENSION IF NOT EXISTS pg_trgm; -- fuzzy search, similarity
CREATE EXTENSION IF NOT EXISTS pgcrypto; -- crypto, hash, gen_random_uuid
CREATE EXTENSION IF NOT EXISTS postgis; -- GIS, geometry, geography
CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- query monitoring
CREATE EXTENSION IF NOT EXISTS vector; -- pgvector cho AI embedding (cần install riêng)
"Extension system + JSONB + array type + window function đầy đủ + MVCC native. Đặc biệt: PostGIS cho GIS, pgvector cho AI embedding, pg_trgm cho fuzzy search. PG 19 thêm SQL/PGQ graph query native — không cần graph database riêng."
pg_plan_advice (official plan hints) — tạo và lock query plan ổn định. Nếu đang dùng pg_hint_plan extension, cân nhắc chuyển sang giải pháp chính thức này.9. Đặc thù Postgres cần biết ngay
- String quote: chỉ
'cho string,"cho identifier. - Concat:
||(vs+của SQL Server). - Cast:
value::type(gọn) hoặcCAST(value AS type)(chuẩn ANSI). - Boolean: kiểu
BOOLEANthật (TRUE/FALSE/NULL), không phải BIT. - Auto-increment:
BIGSERIALhoặcBIGINT GENERATED ALWAYS AS IDENTITY. - Limit:
LIMIT N OFFSET M. - Now:
NOW(),CURRENT_TIMESTAMP. - Default schema:
public. - Case sensitivity: identifier KHÔNG quote -> lowercase.
"User"khácUser. - Lệnh kết thúc:
;. Không cóGO. - PG 19:
GROUP BY ALLthay cho liệt kê cột thủ công. - PG 19:
ON CONFLICT DO SELECTcho atomic get-or-create thay DO UPDATE workaround.
10. Nâng cấp từ PostgreSQL 18 lên 19
- Audit extension — kiểm tra extension nào chưa tương thích PG 19 (đặc biệt
pg_hint_plan, RADIUS auth module). - Kiểm tra MD5 — đổi tất cả password sang SCRAM-SHA-256:
ALTER ROLE ... PASSWORD '...'trước khi upgrade. - Test pg_upgrade trên bản sao:
pg_upgrade --old-bindir /usr/lib/postgresql/18/bin --new-bindir /usr/lib/postgresql/19/bin --old-datadir ... --new-datadir ... - JIT plan — nếu OLTP, để
jit = off(default mới). Nếu analytical workload, bật lạijit = on. - LZ4 TOAST — cột TOAST cũ vẫn đọc được. Dùng
ALTER TABLE ... ALTER COLUMN ... SET COMPRESSION lz4để chuyển đổi dần. - Theo dõi log_lock_waits — nay bật mặc định, review log để phát hiện lock contention tiềm ẩn.