psql: FATAL: cơ sở dữ liệu


723

Tôi đang sử dụng ứng dụng PostgreSql cho mac ( http://postgresapp.com/ ). Tôi đã sử dụng nó trong quá khứ trên các máy khác nhưng nó gây cho tôi một số rắc rối khi cài đặt trên macbook của tôi. Tôi đã cài đặt ứng dụng và tôi đã chạy:

psql -h localhost

Nó trở lại:

psql: FATAL:  database "<user>" does not exist

Có vẻ như tôi thậm chí không thể chạy giao diện điều khiển để tạo cơ sở dữ liệu mà nó đang cố gắng tìm. Điều tương tự xảy ra khi tôi chỉ chạy:

psql 

hoặc nếu tôi khởi chạy psql từ menu thả xuống của ứng dụng:

Số liệu thống kê máy:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

Bất kỳ trợ giúp được đánh giá cao.

Tôi cũng đã cố gắng cài đặt PostgreSql thông qua homebrew và tôi cũng gặp vấn đề tương tự. Tôi cũng đã đọc trang tài liệu ứng dụng có ghi:

Khi Postgres.app lần đầu tiên khởi động, nó sẽ tạo cơ sở dữ liệu $ USER, đây là cơ sở dữ liệu mặc định cho psql khi không được chỉ định. Người dùng mặc định là $ USER, không có mật khẩu.

Vì vậy, có vẻ như ứng dụng không tạo $ USER tuy nhiên tôi đã cài đặt-> gỡ cài đặt-cài đặt lại nhiều lần nên nó phải là thứ gì đó với máy của tôi.

Tôi đã tìm thấy câu trả lời nhưng tôi không chắc chính xác nó hoạt động như thế nào khi người dùng đã trả lời trên chuỗi này -> Bắt Postgresql Chạy trong Mac: Cơ sở dữ liệu "postgres" không tồn tại không theo dõi. Tôi đã sử dụng lệnh sau để mở psql:

psql -d template1

Tôi sẽ không trả lời câu hỏi này cho đến khi ai đó có thể đưa ra lời giải thích cho lý do tại sao điều này hoạt động.


3
Không psql -d postgres -U postgres -h localhostthể hiện điều gì? Nếu không có cờ, nó mặc định cho người dùng CLI và tôi có thể nói nó mặc định là db quản trị "postgres" nhưng tôi không có mac để kiểm tra.
bma

@bma Điều đó mang lại cho tôi psql: FATAL: vai trò "postgres" không tồn tại, mà ban đầu đã đưa tôi đến đây -> stackoverflow.com/questions/15301826/ . Tôi đã cố gắng sử dụng câu trả lời đó nhưng tôi nhận được kết quả tương tự -> psql: FATAL: cơ sở dữ liệu "người dùng" không tồn tại
Ryan Rich

Bạn đã xem nhật ký db chưa? Tôi tự hỏi nếu nhiều chi tiết sẽ được phát ra ở đó.
bma

12
Tôi đã từng gặp vấn đề tương tự. Chỉ làm createdb <user>việc cho tôi.
poshaughnessy

chạy lệnh như psql -U user -d postgres, điều này đảm bảo rằng, người dùng được kết nối với cơ sở dữ liệu postgres, đã có sẵn. Vì vậy, chúng ta cần phải vượt qua cơ sở dữ liệu trong khi đăng nhập.
Anil

Câu trả lời:


1172

Dường như trình quản lý gói của bạn không thể tạo cơ sở dữ liệu có tên $ user cho bạn. Lý do mà

psql -d template1

làm việc cho bạn là template1 là một cơ sở dữ liệu được tạo bởi chính postgres và có mặt trên tất cả các cài đặt. Bạn rõ ràng có thể đăng nhập vào template1, vì vậy bạn phải có một số quyền được cơ sở dữ liệu gán cho bạn. Hãy thử điều này tại dấu nhắc shell:

createdb

và sau đó xem nếu bạn có thể đăng nhập lại với

psql -h localhost

Điều này chỉ đơn giản sẽ tạo ra một cơ sở dữ liệu cho người dùng đăng nhập của bạn, mà tôi nghĩ là những gì bạn đang tìm kiếm. Nếu createdb thất bại, thì bạn không có đủ quyền để tạo cơ sở dữ liệu của riêng mình và bạn sẽ phải tìm ra cách khắc phục gói homebrew.


38
Trong trường hợp của tôi, tôi đã viết $ createdb -h localhostđể giải quyết lỗi could not connect to database postgres: could not connect to server. Sau đó tôi có thể kết nối với bảng điều khiển postgresql thông qua psql -h localhost.
ExiRe

Tôi vẫn nhận được một mật khẩu nhắc và không biết đó là mật khẩu nào, mật khẩu ứng dụng postgres mặc định?
LasagnaAndroid

2
Cảm ơn @Kirk. Chúng ta có thực sự cần -d template1trong lệnh đầu tiên của bạn? Tôi đã thấy "template1" trong các hướng dẫn trên Internet nhưng nó chỉ làm tôi bối rối. Theo tôi, một cách tiếp cận hợp lý hơn sẽ là 1) Tạo người dùng PostgreSQL, ví dụ: "usera" 2) Tạo cơ sở dữ liệu có cùng tên với người dùng "usera" (Tôi nghĩ điều này thật điên rồ nhưng có vẻ như PostgreQuery yêu cầu điều đó) 3) Đăng nhập vào PostgreSQL như người sử dụng siêu "postgres" và gán các đặc quyền của cơ sở dữ liệu "UserA" cho người sử dụng "UserA" (oh my god, đây có phải là cuộc sống thực?)
ericn

@eric: Mẫu -d1 chỉ ở đó để kiểm tra xem OP có thể đăng nhập không. Vì nó được tạo tại thời điểm initdb, nó luôn tồn tại và là một kiểm tra dễ dàng. Từ thời điểm đó trở đi, quy trình của bạn nói chung là "cuộc sống thực".
Kirk Roybal

@ExiRe Bạn vừa chữa khỏi một cơn đau đầu dữ dội mà tôi gặp phải với một lệnh đơn giản. Cảm ơn!
Dave Munger

193

Từ thiết bị đầu cuối, chỉ cần Chạy lệnh trên cửa sổ nhắc lệnh của bạn. (Không phải bên trong psql) .

createdb <user>

Và sau đó cố gắng chạy postgres một lần nữa.


3
Xinh đẹp! Điều này đã làm nó! Sau khi chạy này, tất cả các lệnh psql hoạt động như bùa mê! cảm ơn rất nhiều
nghĩa tự nhiên

1
Và tôi đã thử trong mẫu psql. chết tiệt
dùng1735921

2
bạn cũng có thể chạycreatedb
Mantisimo

mẹo cho người dùng như tôi;) (Không phải trong psql). có nghĩa là khi bạn vừa mở cửa sổ terminal, chỉ cần nhập lệnh createdb này làm lệnh đầu tiên và sau đó thử đăng nhập vào psql.
Rohan Dodeja

Tuyệt quá! Làm việc cho tôi trên OSX.
darkhipo

150

Theo mặc định, postgres cố gắng kết nối với cơ sở dữ liệu có cùng tên với người dùng của bạn. Để ngăn chặn hành vi mặc định này, chỉ cần chỉ định người dùng và cơ sở dữ liệu:

psql -U Username DatabaseName 

14
Cảm ơn, bạn có biết lý do cho thiết kế như vậy - tại sao trên thế giới tôi muốn đi cơ sở dữ liệu tên của tôi theo mặc định?
ericn

3
Cơ sở dữ liệu @eric thường được sử dụng bởi các dịch vụ chạy như một người dùng chuyên dụng. Vì vậy, tôi đoán chiến lược sử dụng tên người dùng làm tên cơ sở dữ liệu mặc định có thể hữu ích hơn so với sử dụng một số tên cơ sở dữ liệu mặc định cố định (ví dụ: "postgres").
dùng686249

5
Làm thế nào để bạn chạy tập lệnh SQL thực sự tạo cơ sở dữ liệu? trong trường hợp của tôi, nó luôn cố gắng kết nối với cơ sở dữ liệu <user> khi mục tiêu của tôi là tạo một DB khác: psql -U Username -f create_db.sqlđiều này sẽ trả về lỗi:database Username doesn't exists
Kostanos

Câu trả lời tuyệt vời cảm ơn, nhưng đặt ra câu hỏi tại sao nó không có trong dòng lệnh giúp đỡ? psql
Shawn Vader

1
psql -U Username postgreskhi bạn chưa có cơ sở dữ liệu nào
Anatolii Stepaniuk

59
  1. Đăng nhập với tư cách người dùng mặc định: sudo -i -u postgres
  2. Tạo người dùng mới: createuser --interactive
  3. Khi được nhắc nhập tên vai trò, hãy nhập tên người dùng linux và chọn Có cho câu hỏi siêu người dùng.
  4. Vẫn đăng nhập với tư cách người dùng postgres, tạo cơ sở dữ liệu: createdb <username_from_step_3>
  5. Xác nhận (các) lỗi đã biến mất bằng cách nhập: psqltại dấu nhắc lệnh.
  6. Đầu ra sẽ hiển thị psql (x.x.x) Type "help" for help.

Man, bạn đã tiết kiệm cho tôi rất nhiều thời gian.
Jp Reddy

Tôi cần phải làm điều này trong Windows. Đặt tên người dùng pg mới cho Linux un. Đã sửa.
RichieRich

Điều này làm việc cho tôi như sự quyến rũ
Promise Preston

42

Đăng nhập bằng cơ sở dữ liệu template1 mặc định:

#psql -d template1
#template1=# \l

  List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(3 rows)

Tạo cơ sở dữ liệu với userId của bạn:

template1=# CREATE DATABASE gogasca WITH OWNER gogasca ENCODING 'UTF8';
CREATE DATABASE

Thoát và sau đó đăng nhập lại

template1=# \q
gonzo:~ gogasca$ psql -h localhost
psql (9.4.0)
Type "help" for help.

gogasca=# \l
                                List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 gogasca   | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
 template1 | gogasca | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/gogasca         +
           |         |          |             |             | gogasca=CTc/gogasca
(4 rows)

20

Tôi đã gặp phải lỗi tương tự khi tôi cố gắng mở postgresql trên mac

psql: FATAL:  database "user" does not exist

Tôi tìm thấy lệnh đơn giản này để giải quyết nó:

phương thức1

$ createdb --owner=postgres --encoding=utf8 user

và gõ

 psql

Cách 2:

psql -d postgres

5
Phương pháp 2 đã cứu mạng tôi
tom10271

9

Có cùng một vấn đề, một đơn giản psql -d postgresđã làm điều đó (Nhập lệnh trong thiết bị đầu cuối)


6

Lỗi này cũng có thể xảy ra nếu biến môi trường PGDATABASE được đặt thành tên của cơ sở dữ liệu không tồn tại.

Trên OSX, tôi đã thấy lỗi sau khi cố gắng khởi chạy psql từ menu PostTHER.app:

psql: FATAL: database "otherdb" does not exist

Giải pháp cho lỗi là xóa export PGDATABASE=otherdbkhỏi ~/.bash_profile:

Hơn nữa, nếu PGUSER được đặt thành tên khác ngoài tên người dùng của bạn, sẽ xảy ra lỗi sau:

psql: FATAL: role "note" does not exist

Giải pháp là loại bỏ export PGUSER=notmekhỏi ~/.bash_profile.


5

Bài cài đặt postgres, trong trường hợp của tôi là 12.2, tôi đã chạy lệnh dưới đây createdb.

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 

chúc mừng điều này đã làm việc cho tôi
FaISalBLiNK

4

Vì câu hỏi này là câu hỏi đầu tiên trong kết quả tìm kiếm, dù sao tôi cũng sẽ đưa ra một giải pháp khác cho một vấn đề khác, để không có tiêu đề trùng lặp.

Thông báo lỗi tương tự có thể xuất hiện khi chạy tệp truy vấn psqlmà không chỉ định cơ sở dữ liệu. Vì không có usecâu lệnh nào trong postgresql, chúng tôi phải chỉ định cơ sở dữ liệu trên dòng lệnh, ví dụ:

psql -d db_name -f query_file.sql

1
và db template1 luôn tồn tại
Tháng Một

4

Như tài liệu createdb nêu:

Cơ sở dữ liệu đầu tiên luôn được tạo bởi lệnh initdb khi vùng lưu trữ dữ liệu được khởi tạo ... Cơ sở dữ liệu này được gọi là postgres.

Vì vậy, nếu một số bản phân phối OS / postgresql khác nhau, thì đó chắc chắn không phải là mặc định / tiêu chuẩn (chỉ cần xác minh rằng initdbtrên openSUSE 13.1 tạo ra "postgres" DB, nhưng không phải là "<user>"). Câu chuyện dài, psql -d postgresdự kiến ​​sẽ được sử dụng khi sử dụng một người dùng khác ngoài "postgres".

Rõ ràng câu trả lời được chấp nhận, chạy createdbđể tạo một DB có tên giống như người dùng, cũng hoạt động, nhưng tạo ra một DB không cần thiết.


1

có vấn đề với việc sử dụng trình điều khiển JDBC, vì vậy người ta chỉ cần thêm cơ sở dữ liệu (có thể là dự phòng tùy thuộc vào công cụ bạn có thể sử dụng) sau tên máy chủ trong URL, ví dụ: jdbc:postgres://<host(:port)>/<db-name>

thông tin chi tiết được ghi lại ở đây: http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT


Tôi biết đó là một chủ đề nhỏ khi xem xét nó chỉ được yêu cầu cho psql, nhưng Google đã đưa tôi đến đây với vấn đề của tôi vì vậy tôi nghĩ rằng nó đáng được đề cập ở đây
Andreas Dietrich

1

Kết nối với postgres thông qua superuser hiện có.

Tạo một Cơ sở dữ liệu theo tên của người dùng mà bạn đang kết nối thông qua các postgres.

create database username;

Bây giờ hãy thử kết nối qua tên người dùng


1

Hãy thử sử dụng-

psql -d postgres

Tôi cũng đã đối mặt với vấn đề tương tự khi tôi chạy psql


0

Trước hết, thật hữu ích khi tạo một cơ sở dữ liệu có tên giống như sử dụng hiện tại của bạn, để tránh lỗi khi bạn chỉ muốn sử dụng cơ sở dữ liệu mặc định và tạo các bảng mới mà không cần khai báo rõ ràng tên của db.

Thay thế "skynotify" bằng tên người dùng của bạn:

psql -d postgres -c "CREATE DATABASE skynotify ENCODING 'UTF-8';"

-d tuyên bố rõ ràng cơ sở dữ liệu nào sẽ được sử dụng làm mặc định cho các câu lệnh SQL không bao gồm rõ ràng tên db trong phiên tương tác này.

NHỮNG CƠ BẢN ĐỂ NHẬN MỘT HÌNH ẢNH R CLE RÀNG CỦA MÁY CHỦ PostgresQL của bạn có gì trong đó.

Bạn phải kết nối với cơ sở dữ liệu hiện có để sử dụng psql tương tác. May mắn thay, bạn có thể yêu cầu psql cho một danh sách các cơ sở dữ liệu:

psql -l

.

                                          List of databases
               Name               | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
----------------------------------+-----------+----------+-------------+-------------+-------------------
 skynotify                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 myapp_dev                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres                         | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ruby-getting-started_development | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
 template1                        | skynotify | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/skynotify          +
                                  |           |          |             |             | skynotify=CTc/skynotify
(6 rows)

Điều này KHÔNG khởi động bảng điều khiển tương tác, nó chỉ xuất một bảng dựa trên văn bản đến thiết bị đầu cuối.

Như một câu trả lời khác nói, postgres luôn được tạo, vì vậy bạn nên sử dụng nó làm cơ sở dữ liệu failafe của mình khi bạn chỉ muốn giao diện điều khiển bắt đầu hoạt động trên các cơ sở dữ liệu khác. Nếu nó không có ở đó, sau đó liệt kê các cơ sở dữ liệu và sau đó sử dụng bất kỳ một trong số họ.

Theo cách tương tự, chọn các bảng từ cơ sở dữ liệu:

psql -d postgres -c "\dt;"

Cơ sở dữ liệu "postgres" của tôi không có bảng, nhưng bất kỳ cơ sở dữ liệu nào sẽ xuất bảng dựa trên văn bản đến thiết bị đầu cuối (tiêu chuẩn ra).

Và để hoàn thiện, chúng ta cũng có thể chọn tất cả các hàng từ một bảng:

psql -d ruby-getting-started_development -c "SELECT * FROM widgets;"

.

 id | name | description | stock | created_at | updated_at 
----+------+-------------+-------+------------+------------
(0 rows)

Ngay cả khi không có hàng nào được trả về, bạn sẽ nhận được tên trường.

Nếu các bảng của bạn có hơn một chục hàng hoặc bạn không chắc chắn, sẽ hữu ích hơn khi bắt đầu với số lượng hàng để hiểu có bao nhiêu dữ liệu trong cơ sở dữ liệu của bạn:

 psql -d ruby-getting-started_development -c "SELECT count(*) FROM widgets;"

.

 count 
-------
     0
(1 row)

Và đừng để "1 hàng" đó làm bạn bối rối, nó chỉ đại diện cho số lượng hàng được truy vấn trả về, nhưng hàng 1 chứa số bạn muốn, là 0 trong ví dụ này.

LƯU Ý: một db được tạo mà không có chủ sở hữu được xác định sẽ được sở hữu bởi người dùng hiện tại.


0

Tôi đã thử một số giải pháp này, nhưng chúng không hiệu quả (mặc dù chúng rất đúng hướng!)

Cuối cùng, lỗi của tôi là:

FATAL: xác thực mật khẩu không thành công cho người dùng

Khi tôi chạy lệnh sau: psql

Vì vậy, sau đó tôi chạy hai lệnh này:

dropdb()
createdb()

LƯU Ý: điều này sẽ xóa db, nhưng tôi không cần nó và vì một số lý do tôi không thể truy cập pqsl nữa, vì vậy tôi đã xóa và tạo lại nó. Sau đó psqllàm việc lại.


0

Không chắc chắn nếu nó đã được thêm vào trong các câu trả lời, câu trả lời Anatolii Stepaniuk rất hữu ích đó là những điều sau đây.

psql -U Username postgres # when you have no databases yet

-1

Có vấn đề này khi cài đặt postgresql thông qua homebrew.

Phải tạo siêu người dùng "postgres" mặc định với:

người tạo - tương tác postgres trả lời y cho siêu người dùng

người tạo - người dùng tương tác trả lời y cho siêu người dùng


-3

Tôi vẫn gặp sự cố ở trên sau khi cài đặt postgresql bằng homebrew - Tôi đã giải quyết nó bằng cách đặt / usr / local / bin vào đường dẫn của tôi trước / usr / bin


-12

Theo cách giải thích đơn giản nhất; đó là vấn đề không. Chỉ cần gõ

pgres

sẽ dẫn đến phản ứng này.

pgres <db_name> 

sẽ thành công mà không có lỗi nếu người dùng có quyền truy cập db.

Người ta có thể đi vào chi tiết về các biến môi trường được xuất nhưng điều đó không cần thiết .. điều này quá cơ bản để thất bại vì bất kỳ lý do nào khác.


5
Thực sự không thích "loại vấn đề ngôn ngữ"
Kimmo Hintikka

Ngoài ra, nó không đề xuất cách giải quyết vấn đề, vì vậy không trả lời câu hỏi.
Deborah

1
chưa bao giờ nghe nói vềpgres
Glenn Plas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.