0

Tổng hợp các lệnh psql hữu ích hay dùng

psql là công cụ dòng lệnh chính thức của PostgreSQL. Ngoài việc chạy câu SQL, nó còn có hệ thống meta-command (bắt đầu bằng \) giúp xem thông tin schema, định dạng kết quả, import/export dữ liệu và thao tác nhanh mà không cần nhớ cú pháp SQL dài.

Bài viết này gom các lệnh hay dùng nhất theo nhóm, kèm ví dụ ngắn để bạn copy và dùng ngay.

1. Kết nối và thông tin phiên làm việc

# Kết nối cơ bản
psql -h localhost -p 5432 -U postgres -d mydb

# Kết nối và chạy một lệnh rồi thoát
psql -d mydb -c "SELECT version();"

Trong phiên psql:

Lệnh Ý nghĩa
\conninfo Xem thông tin kết nối hiện tại (user, database, host, port)
\c ten_database Chuyển sang database khác
\c ten_database ten_user Chuyển database và user
SELECT current_user, current_database(), inet_server_addr(); Xem user, database và địa chỉ server
SELECT version(); Phiên bản PostgreSQL
\q Thoát

2. Liệt kê đối tượng (database, bảng, user…)

Đây là nhóm lệnh dùng nhiều nhất:

Lệnh Mô tả
\l hoặc \list Danh sách database
\l+ Danh sách database kèm kích thước
\dt Danh sách bảng trong schema hiện tại
\dt+ Bảng kèm kích thước, mô tả
\dt *.* Tất cả bảng mọi schema
\dv Danh sách view
\di Danh sách index
\df Danh sách function
\dn Danh sách schema
\du hoặc \dg Danh sách role/user
\dp hoặc \z Quyền trên bảng/view
\dT Danh sách kiểu dữ liệu

Ví dụ lọc:

\dt public.*
\df+ public.*
\du+

Dấu + thường thêm cột size, description hoặc chi tiết hơn.

3. Xem cấu trúc bảng và đối tượng

\d ten_bang          -- Cột, kiểu, constraint, index
\d+ ten_bang         -- Thêm storage, description, size ước lượng
\d ten_view
\d ten_index
\d+ ten_function

Muốn xem định nghĩa SQL của view hoặc function:

\sv ten_view
\sf ten_function

4. Định dạng và hiển thị kết quả

Khi kết quả nhiều cột, bật chế độ mở rộng cho dễ đọc:

\x on          -- Bật expanded display (từng cột một dòng)
\x auto        -- Tự bật khi kết quả rộng
\x off

Một số thiết lập hữu ích:

\pset pager off          -- Tắt pager (less)
\pset null '(null)'      -- Hiển thị NULL rõ ràng
\pset linestyle unicode  -- Kẻ bảng đẹp hơn
\timing on               -- Hiện thời gian thực thi mỗi câu lệnh
\timing off

Xuất kết quả ra file:

\o /tmp/ket_qua.txt
SELECT * FROM users LIMIT 100;
\o                   -- Tắt ghi file, quay lại màn hình

5. Chạy file, lịch sử và chỉnh sửa câu lệnh

\i /path/to/script.sql    -- Chạy file SQL
\e                        -- Mở editor để sửa câu lệnh vừa gõ
\e ten_file.sql           -- Mở file trong editor rồi chạy
\s                        -- Xem lịch sử lệnh
\g                        -- Chạy lại câu lệnh trước (hoặc gửi buffer)
\watch 5                  -- Chạy lại câu lệnh mỗi 5 giây (rất tiện khi theo dõi)

Ví dụ theo dõi số kết nối:

SELECT count(*) FROM pg_stat_activity;
\watch 2

Nhấn Ctrl+C để dừng \watch.

6. Import / export dữ liệu nhanh

\copy chạy phía client (không cần quyền superuser trên server như COPY):

-- Xuất ra CSV
\copy (SELECT * FROM orders WHERE created_at > '2026-01-01') TO '/tmp/orders.csv' WITH CSV HEADER

-- Nhập từ CSV
\copy users(id, email, name) FROM '/tmp/users.csv' WITH CSV HEADER

Xuất toàn bộ database hoặc schema thì dùng công cụ ngoài psql:

pg_dump -d mydb -F c -f mydb.dump
pg_dump -d mydb --schema-only -f schema.sql
pg_restore -d mydb_new mydb.dump

7. Giao dịch và an toàn khi thao tác

BEGIN;
-- các lệnh thay đổi dữ liệu
ROLLBACK;   -- hoặc COMMIT;

Trong psql có thể bật:

\set AUTOCOMMIT off

Khi đó mỗi câu lệnh không tự commit; bạn phải COMMIT thủ công. Nhớ bật lại on nếu không quen.

Xem câu lệnh đang chạy và khóa:

SELECT pid, usename, state, query, query_start
FROM pg_stat_activity
WHERE state <> 'idle';

SELECT * FROM pg_locks WHERE NOT granted;

8. Một số lệnh kiểm tra sức khỏe hay dùng

-- Kích thước database
SELECT pg_size_pretty(pg_database_size(current_database()));

-- Top bảng nặng nhất
SELECT relname,
       pg_size_pretty(pg_total_relation_size(relid)) AS total
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;

-- Index không dùng (cần thống kê đã chạy)
SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

-- Cache hit ratio (ước lượng)
SELECT sum(blks_hit) * 100.0 / nullif(sum(blks_hit) + sum(blks_read), 0) AS cache_hit_ratio
FROM pg_stat_database;

9. Trợ giúp ngay trong psql

\?          -- Trợ giúp meta-command
\h          -- Trợ giúp cú pháp SQL
\h CREATE TABLE
\h ALTER TABLE

Mẹo nhỏ khi dùng hàng ngày

  • Dùng \x auto và \timing on trong file ~/.psqlrc để luôn bật sẵn.
  • \dt+ và \l+ giúp phát hiện bảng/database phình to rất nhanh.
  • \watch kết hợp pg_stat_activity tiện hơn mở nhiều terminal.
  • Ưu tiên \copy khi xuất/nhập file từ máy local; dùng COPY khi file nằm trên server.
  • Trước khi DROP hoặc DELETE lớn, luôn bọc trong BEGIN … ROLLBACK để kiểm tra.

Nếu thấy hay xin cho mình 1 upvote nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí