Sửa lỗi 'FATAL: role does not exist' trong PostgreSQL

beginner🐘 PostgreSQL2026-04-06| PostgreSQL (tất cả các phiên bản), Ubuntu/Debian, CentOS/RHEL, macOS, Windows

Error Message

FATAL: role "myuser" does not exist
#postgresql#quan-tri-co-so-du-lieu#xac-thuc#linux#sql

Hiểu về lỗi này

Bạn vừa thử kết nối với cơ sở dữ liệu của mình, nhưng PostgreSQL đã trả về một thông báo gây khó chịu: FATAL: role "myuser" does not exist. Đây không phải là lỗi phần mềm, mà là một lỗi tìm kiếm dữ liệu đơn giản. Khi bạn cố gắng đăng nhập, Postgres sẽ kiểm tra bảng pg_roles nội bộ của nó. Nếu không tìm thấy bản ghi nào khớp chính xác với chuỗi ký tự bạn cung cấp, nó sẽ từ chối truy cập.

Tại sao lỗi này xảy ra?

  • Thiếu role: Bạn chưa thực sự tạo người dùng trong cụm cơ sở dữ liệu (database cluster) cụ thể này.
  • Bẫy phân biệt chữ hoa/chữ thường: Bạn đã tạo "MyUser" (có dấu ngoặc kép), nhưng Postgres mặc định tìm kiếm myuser (chữ thường) khi không có dấu ngoặc kép.
  • Lỗi chuỗi kết nối: Tệp .env hoặc chuỗi kết nối của bạn có thể bị sai lỗi chính tả, hoặc đang trỏ đến sai cổng (ví dụ: 5433 thay vì 5432) nơi người dùng đó không tồn tại.
  • Giả định người dùng mặc định: Trên nhiều hệ thống Linux, Postgres mong đợi một role cơ sở dữ liệu khớp với tên người dùng hệ điều hành của bạn. Nếu người dùng Linux của bạn là "ubuntu" nhưng bạn chưa tạo role "ubuntu" trong Postgres, nó sẽ thất bại.

Cách khắc phục

1. Liệt kê các Role hiện tại

Trước tiên, hãy xem ai thực sự có quyền truy cập. Bạn cần đăng nhập với tư cách siêu người dùng (superuser) postgres để xem danh sách người dùng.

# Truy cập vào Postgres prompt
sudo -u postgres psql

# Chạy lệnh 'hiển thị người dùng'
\du

Hãy quan sát kỹ kết quả trả về. Nếu tên người dùng bạn muốn không có trong danh sách, bạn cần phải tạo nó.

2. Tạo Role còn thiếu

Bạn có thể khắc phục điều này nhanh chóng bằng giao diện SQL. Trong khi vẫn ở trong prompt psql, hãy chạy lệnh sau để tạo một người dùng cơ bản với quyền đăng nhập:

CREATE ROLE myuser WITH LOGIN PASSWORD 'your_secure_password';

Nếu người dùng này cần tạo cơ sở dữ liệu riêng—thường thấy ở các role phát triển (development)—hãy thêm thuộc tính CREATEDB:

ALTER ROLE myuser WITH CREATEDB;

3. Xử lý phân biệt chữ hoa chữ thường

Postgres rất khắt khe về việc viết hoa/thường. Nếu bạn bắt buộc phải sử dụng tên người dùng hỗn hợp hoa thường như AppUser, bạn phải đặt nó trong dấu ngoặc kép khi tạo và kết nối. Tuy nhiên, mọi thứ sẽ dễ dàng hơn nhiều nếu bạn chỉ sử dụng chữ thường cho tất cả các đối tượng cơ sở dữ liệu. Nếu bạn lỡ tạo một role có dấu ngoặc kép, bạn có thể đổi tên nó thành chữ thường để tránh rắc rối sau này:

ALTER ROLE "MyUser" RENAME TO myuser;

4. Cấp quyền truy cập cơ sở dữ liệu

Một role có thể tồn tại nhưng vẫn bị ngăn cản truy cập vào một cơ sở dữ liệu cụ thể. Để cấp quyền sở hữu toàn bộ cơ sở dữ liệu (ví dụ: project_db) cho người dùng mới của bạn, hãy chạy:

ALTER DATABASE project_db OWNER TO myuser;

Kiểm tra kết nối

Thoát khỏi prompt của siêu người dùng và thử kết nối với tư cách người dùng mới. Sử dụng cờ -h localhost để bắt buộc kết nối TCP, thao tác này thường sẽ yêu cầu nhập mật khẩu bạn vừa thiết lập.

psql -U myuser -d project_db -h localhost -W

Nếu bạn thấy prompt project_db=>, nghĩa là bạn đã đăng nhập thành công.

Mẹo chuyên nghiệp để thiết lập mượt mà

Tránh bẫy xác thực 'Peer'

Trên Linux, bạn có thể đã sửa xong role nhưng lại gặp lỗi Peer authentication failed. Điều này xảy ra vì Postgres đang cố gắng khớp tên đăng nhập Linux của bạn với tên đăng nhập DB. Để bỏ qua bước này khi phát triển cục bộ, hãy tìm tệp pg_hba.conf của bạn (thường ở /etc/postgresql/15/main/) và thay đổi phương thức từ peer thành scram-sha-256 hoặc md5.

Sử dụng thông tin xác thực mạnh

Đừng sử dụng "password" hoặc "123456" cho các role cơ sở dữ liệu của bạn, ngay cả khi phát triển cục bộ. Đó là một thói quen xấu dẫn đến rò rỉ dữ liệu khi triển khai thực tế. Tôi thường tạo các chuỗi 24 ký tự để giữ an toàn. Nếu bạn cần một cách nhanh chóng để làm việc này, Trình tạo mật khẩu từ ToolCraft là một lựa chọn tốt. Nó tạo độ hỗn loạn (entropy) cục bộ ngay trong trình duyệt của bạn, vì vậy khóa của bạn không bao giờ chạm tới máy chủ của họ.

Related Error Notes