psql: FATAL: 数据库 "<user>" 不存在

993
我正在使用Mac上的Postgres.app。我以前在其他机器上使用过它,但在我的MacBook上安装时遇到了一些问题。我已经安装了这个应用程序并运行了以下命令:
psql -h localhost

它返回:
psql: FATAL:  database "<user>" does not exist

看起来我甚至无法运行控制台来创建它试图找到的数据库。当我只运行以下命令时,同样的事情发生:
psql

或者,如果我从应用程序的下拉菜单中启动psql:
机器统计:
- OSX 10.8.4 - psql (PostgreSQL) 9.2.4
非常感谢您的帮助。
我还尝试使用Homebrew安装PostgreSQL,但遇到了相同的问题。我还阅读了应用程序的文档,其中提到:
“当Postgres.app首次启动时,它会创建$USER数据库,这是在未指定数据库时psql的默认数据库。默认用户是$USER,没有密码。”
所以似乎应用程序没有创建$USER。然而,我已经安装->卸载->重新安装了几次,所以问题肯定出在我的机器上。
我找到了答案,但是我不确定它的工作原理,因为回答这个帖子的用户没有跟进。我使用了以下命令来打开psql:
psql -d template1

5
psql -d postgres -U postgres -h localhost 显示什么内容? 没有标志时,默认使用CLI用户,我本来会说它默认使用 "postgres" 管理员数据库,但我没有苹果电脑进行测试。 - bma
@bma 这让我得到了 psql: FATAL: role "postgres" does not exist 的错误信息,这也是我来到这里的原因 -> https://dev59.com/VWUp5IYBdhLWcg3wY29V。我尝试使用那个答案,但是我得到了相同的结果 -> psql: FATAL: database "user" does not exist。 - Ryan Rich
你有查看数据库日志吗?我想那里可能会有更详细的信息。 - bma
33
我遇到了同样的问题。只需要运行 createdb <user> 就可以解决。 - poshaughnessy
4
运行以下命令:psql -U 用户名 -d postgres,确保用户连接到已存在的Postgres数据库。因此我们需要在登录时传递数据库参数。 - Anil
23个回答

1485

看起来你的软件包管理器未能为你创建名为$user的数据库。原因是

psql -d template1

对您有用的是,template1是由Postgres自己创建的数据库,并且存在于所有安装中。您显然可以登录到template1,因此必须将一些权限分配给您的数据库用户。请在shell提示符下尝试以下操作:

createdb

然后尝试使用相同的登录信息再次登录

psql -h localhost

这将为您的登录用户创建一个数据库,我认为这正是您要寻找的。如果createdb失败,则表示您没有足够的权限来创建自己的数据库,您需要找出如何修复homebrew包的问题。


55
在我的情况下,我写了 $ createdb -h localhost 来解决错误信息 could not connect to database postgres: could not connect to server。之后,我可以通过命令 psql -h localhost 连接到 PostgreSQL 控制台。 - ExiRe
我仍然收到一个密码提示,不知道是哪个密码,哪个是默认的postgres应用程序密码? - LasagnaAndroid
2
谢谢@Kirk。您第一条命令中真的需要-d template1吗?我在互联网上的教程中看到过"template1",但它只会让我糊涂。在我看来,更合乎逻辑的方法是:1)创建PostgreSQL用户,例如 "usera";2)创建与用户“usera”同名的数据库(我认为这很疯狂,但似乎PostgreSQL要求这样做);3)以超级用户“postgres”的身份登录PostgreSQL,并将数据库“usera”的特权授予用户“usera”(天啊,这是真实的生活吗?)。 - ericn
@eric:-d template1 只是为了检查操作员是否能够登录而存在的。由于它是在 initdb 时间创建的,因此它始终存在,并且是一个简单的检查。从那时起,您的过程通常就是“现实生活”中的过程。 - Kirk Roybal
1
创建一个全新的数据库只是为了让用户登录似乎不是一个好主意。根据其他答案,使用psql -d postgres更值得一些赞。 - Peter Ellis
显示剩余3条评论

328

从终端中,只需在您的命令提示窗口上运行该命令。(不要在psql内部运行)

createdb <user>

然后尝试再次运行Postgres。


2
我正在尝试使用psql模板。该死。 - user1735921
12
你可以直接运行createdb - Mantisimo
3
对于像我这样的用户的提示 ;)(不在psql内部)。这意味着当您打开终端窗口时,只需输入此createdb作为第一个命令,然后尝试登录psql。 - Rohan Dodeja
太棒了!在我的OSX上运行成功。 - darkhipo
1
createdb: error: database creation failed: ERROR: permission denied to create database - reducing activity
createdb: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket? - Rafs

249

默认情况下,Postgres尝试连接与您的用户名相同的数据库。要防止这种默认行为,只需指定用户和数据库:

psql -U Username DatabaseName 

30
谢谢,你知道这种设计的原因吗?为什么默认情况下我想要进入我的名字数据库呢? - ericn
3
数据库通常被作为专用用户运行的服务所使用。所以我猜使用用户名作为默认数据库名称的策略可能比使用一些固定的默认数据库名称(例如“postgres”)更有用。 - user686249
8
怎样运行创建数据库的SQL脚本?在我的情况下,它总是尝试连接到<user>数据库,而我的目标是创建另一个数据库: psql -U 用户名 -f create_db.sql 但会返回错误: database 用户名 doesn't exist - Kostanos
非常好的答案,谢谢。但这也引出了一个问题,为什么它没有在命令行帮助中提到呢?psql --help - Shawn Vader
7
如果您还没有数据库,可以使用psql -U 用户名 postgres命令进行登录。请注意,这是一个命令行命令,可以在终端或命令提示符中执行。 - Anatolii Stepaniuk
这是可怕的设计,因为您可以首先作为postgres用户登录,而无需指定数据库(显然,因为可能不存在)。此外,用户存在于单个数据库范围之外。这种行为根本不直观。 - AlexMayle

84
  1. 以默认用户登录:sudo -i -u postgres
  2. 创建新用户:createuser --interactive
  3. 当提示角色名称时,请输入Linux用户名,并选择超级用户的选项。
  4. 仍然作为postgres用户登录,创建数据库:createdb <step_3的用户名>
  5. 通过输入psql命令确认错误是否已消除。
  6. 输出应该显示psql (x.x.x) Type "help" for help.

我需要在Windows中完成这个任务。将新的pg用户名设置为Linux un。已修复。 - RichieRich
如果您不想让用户成为超级用户,在(4)中请在具有sudo权限的Linux帐户中运行以下命令:sudo -u <username> createdb <dbname> - XPMai

58

使用默认模板1数据库进行登录:

#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)

使用您的userId创建一个数据库:

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

退出并重新登录

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)

27

在安装完PostgreSQL后,我运行了以下命令createdb,我的版本是12.2。

$ createdb `whoami`

$ psql

psql (12.2)
Type "help" for help.

macuser=# 

27

当我尝试在Mac上打开postgresql时,遇到了同样的错误。

psql: FATAL:  database "user" does not exist

我发现了一个简单的命令来解决这个问题:

方法1

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

以及类型

 psql

方法2:

psql -d postgres

24

步骤 1:

psql -d template1

现在您应该处于 psql 终端上。

步骤 2:

CREATE DATABASE username;

请确保在数据库名称后使用分号 (;);

可选:在 psql 终端上键入 \ls\l 以列出所有数据库;

步骤 3:

psql -h localhost

现在您应该已连接成功;


17

尝试使用-

psql -d postgres

当我运行 psql 时,我也遇到了同样的问题。


psql -d 工作正常,而 psql -h(不起作用) - Vignesh Chinnaiyan

11

遇到了同样的问题,只需要在终端中输入psql -d postgres即可解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接