【问题标题】:psql: FATAL: database "<user>" does not existpsql:致命:数据库“<用户>”不存在
【发布时间】:2013-07-12 02:07:40
【问题描述】:

我正在使用适用于 mac 的 PostgreSql 应用程序 (http://postgresapp.com/)。我过去曾在其他机器上使用过它,但在我的 macbook 上安装时给我带来了一些麻烦。我已经安装了应用程序并运行了:

psql -h localhost

返回:

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

似乎我什至无法运行控制台来创建它试图查找的数据库。当我刚刚运行时也会发生同样的事情:

psql 

或者如果我从应用程序下拉菜单中启动 psql:

机器统计:

  • OSX 10.8.4

  • psql (PostgreSQL) 9.2.4

感谢任何帮助。

我还尝试通过自制软件安装 PostgreSql,但遇到了同样的问题。我还阅读了应用程序文档页面,其中指出:

当 Postgres.app 首次启动时,它会创建 $USER 数据库, 当没有指定时,这是 psql 的默认数据库。这 默认用户是 $USER,没有密码。

所以看起来应用程序没有创建 $USER 但是我已经安装->卸载-重新安装了几次,所以它一定是我的机器上的东西。

我找到了答案,但我不确定它是如何工作的,因为在此线程上回答的用户 -> Getting Postgresql Running In Mac: Database "postgres" does not exist 没有跟进。我使用以下命令打开 psql:

psql -d template1

在有人能解释为什么会这样之前,我不会回答这个问题。

【问题讨论】:

  • psql -d postgres -U postgres -h localhost 显示什么?如果没有标志,它默认为 CLI 用户,我会说它默认为“postgres”管理数据库,但我没有要测试的 mac。
  • @bma 这给了我 psql:致命:角色“postgres”不存在,最初把我带到这里 -> stackoverflow.com/questions/15301826/…。我尝试使用该答案,但得到相同的结果-> psql: FATAL: database "user" does not exist
  • 你查看过数据库日志吗?我想知道是否会在那里发布更多细节。
  • 我遇到了同样的问题。只是做createdb &lt;user&gt; 为我工作。
  • psql -U user -d postgres 运行命令,这样可以确保用户连接到已经存在的postgres 数据库。所以我们需要在登录时也传递数据库。

标签: postgresql psql


【解决方案1】:

您的包管理器似乎未能为您创建名为 $user 的数据库。原因

psql -d template1

对你有用的是 template1 是一个由 postgres 自己创建的数据库,并且存在于所有安装中。 您显然能够登录到 template1,因此您必须拥有数据库分配给您的一些权限。在 shell 提示符下试试这个:

createdb

然后看看能不能用

重新登录
psql -h localhost

这将为您的登录用户创建一个数据库,我认为这就是您要寻找的。如果 createdb 失败,那么你没有足够的权限来制作你自己的数据库,你必须弄清楚如何修复 homebrew 包。

【讨论】:

  • 就我而言,我写了$ createdb -h localhost 来解决错误could not connect to database postgres: could not connect to server。之后我可以通过psql -h localhost 连接到 postgresql 控制台。
  • 我仍然收到密码提示,不知道是哪个,哪个是默认的 postgres 应用密码?
  • 谢谢@Kirk。在您的第一个命令中我们真的需要-d template1 吗?我在互联网上的教程中看到过“template1”,但这只会让我感到困惑。在我看来,更合乎逻辑的方法是 1)创建 PostgreSQL 用户,例如“usera” 2)创建一个与用户“usera”同名的数据库(我认为这很疯狂,但似乎 PostgreSQL 需要它) 3)以超级用户“postgres”身份登录 PostgreSQL 并分配数据库的权限“ usera”到用户“usera”(天哪,这真的是现实生活吗?)
  • @eric :-d template1 仅用于检查 OP 是否可以登录。由于它是在 initdb 时创建的,因此它始终存在,并且很容易检查。从那时起,您的程序通常是“真实的”。
  • 创建一个全新的数据库只是为了让用户进入似乎不是一个好主意。psql -d postgres 根据其他一些答案似乎更值得一些支持。跨度>
【解决方案2】:

从终端,只需在命令提示符窗口中运行命令。 (不在 psql 内)

createdb <user>

然后尝试再次运行 postgres。

【讨论】:

  • 我正在尝试使用 psql 模板。该死的
  • 你也可以运行createdb
  • 给像我这样的用户的提示 ;)(不在 psql 中)。意味着当你打开终端窗口时,只需输入这个 createdb 作为第一个命令,然后尝试登录 psql。
  • 太棒了!在 OSX 上为我工作。
  • createdb: error: database creation failed: ERROR: permission denied to create database
【解决方案3】:

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

psql -U Username DatabaseName 

【讨论】:

  • 谢谢,你知道这样设计的原因吗?我为什么要默认使用 my-name 数据库?
  • @eric 数据库通常由作为专用用户运行的服务使用。所以我想使用用户名作为默认数据库名的策略可能比使用一些固定的默认数据库名(例如“postgres”)更有用。
  • 如何运行实际创建数据库的 SQL 脚本?在我的情况下,当我的目标是创建另一个数据库时,它总是尝试连接到数据库 psql -U Username -f create_db.sql 这将返回错误:database Username doesn't exists
  • 很棒的答案谢谢,但提出了一个问题,为什么它不在命令行帮助中? psql --help
  • psql -U Username postgres 当你还没有数据库时
【解决方案4】:
  1. 以默认用户身份登录:sudo -i -u postgres
  2. 创建新用户:createuser --interactive
  3. 当提示输入角色名称时,输入 linux 用户名,然后对超级用户问题选择“是”。
  4. 仍然以 postgres 用户登录,创建数据库:createdb &lt;username_from_step_3&gt;
  5. 在命令提示符处输入:psql,确认错误已消失。
  6. 输出应显示psql (x.x.x) Type "help" for help.

【讨论】:

  • 我需要在 Windows 中执行此操作。将新的 pg 用户名设置为 Linux un。固定。
  • 如果您不希望用户成为超级用户,请在 (4) 使用具有sudo 权限的 Linux 帐户运行此命令:sudo -u &lt;username&gt; createdb &lt;dbname&gt;
【解决方案5】:

使用默认模板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)

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

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)

【讨论】:

    【解决方案6】:

    当我尝试在 mac 上打开 postgresql 时遇到同样的错误

    psql: FATAL:  database "user" does not exist
    

    我找到了这个简单的命令来解决它:

    方法1

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

    然后输入

     psql
    

    方法二:

    psql -d postgres
    

    【讨论】:

    • 方法2救了我的命
    【解决方案7】:

    postgres 安装后,在我的情况下版本是 12.2,我确实运行了以下命令 createdb

    $ createdb `whoami`
    
    $ psql
    
    psql (12.2)
    Type "help" for help.
    
    macuser=# 
    

    【讨论】:

      【解决方案8】:

      遇到了同样的问题,一个简单的psql -d postgres做到了(在终端输入命令)

      【讨论】:

        【解决方案9】:

        尝试使用-

        psql -d postgres

        我在运行psql 时也遇到了同样的问题

        【讨论】:

        • psql -d 工作而不是 psql -h (不起作用)
        【解决方案10】:

        第 1 步:

        psql -d template1

        现在你应该在 psql 终端上

        第 2 步:

        CREATE DATABASE username;

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

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

        第 3 步:

        psql -h localhost

        现在您应该已连接;

        【讨论】:

          【解决方案11】:

          如果环境变量 PGDATABASE 设置为不存在的数据库的名称,也会发生此错误。

          在 OSX 上,我在尝试从 Postgress.app 菜单启动 psql 时看到以下错误:

          psql: FATAL: database "otherdb" does not exist

          错误的解决方法是从~/.bash_profile中删除export PGDATABASE=otherdb

          此外,如果 PGUSER 设置为您的用户名以外的其他内容,则会出现以下错误:

          psql: FATAL: role "note" does not exist

          解决方案是从~/.bash_profile 中删除export PGUSER=notme

          【讨论】:

            【解决方案12】:

            不确定它是否已经添加到答案中,Anatolii Stepaniuk 的回答非常有帮助,如下所示。

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

            【讨论】:

              【解决方案13】:

              由于这个问题是搜索结果中的第一个问题,所以无论如何我都会在这里针对不同的问题提出不同的解决方案,以免出现重复的标题。

              psql 中运行查询文件而不指定数据库时,可能会出现相同的错误消息。由于postgresql中没有use语句,我们只好在命令行中指定数据库,例如:

              psql -d db_name -f query_file.sql
              

              【讨论】:

              • 和 db template1 始终存在
              【解决方案14】:

              正如createdb documentation 所说:

              第一个数据库总是在初始化数据存储区时由initdb命令创建的……这个数据库叫做postgres。

              因此,如果某些 OS/postgresql 发行版的做法不同,那肯定不是默认/标准(刚刚验证了 openSUSE 13.1 上的 initdb 创建了数据库“postgres”,而不是“”)。长话短说,psql -d postgres 预计将在使用“postgres”以外的用户时使用。

              显然,已接受的答案是运行createdb 来创建一个与用户命名的数据库,也可以正常工作,但会创建一个多余的数据库。

              【讨论】:

                【解决方案15】:

                首先,创建一个与您当前使用的名称相同的数据库会很有帮助,以防止当您只想使用默认数据库并创建新表而不显式声明数据库名称时出现错误。

                用您的用户名替换“skynotify”:

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

                -d 显式声明在此交互式会话期间将哪个数据库用作 SQL 语句的默认值,这些语句未显式包含数据库名称。

                清楚了解您的 PostgresQL 服务器中包含的内容的基础知识。

                您必须连接到现有数据库才能以交互方式使用 psql。幸运的是,您可以向 psql 询问数据库列表:

                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)
                

                这不会启动交互式控制台,它只是将基于文本的表格输出到终端。

                正如另一个答案所说,始终会创建 postgres,因此当您只想让控制台开始在其他数据库上工作时,应该将其用作故障安全数据库。如果不存在,则列出数据库,然后使用其中任何一个。

                以类似的方式,从数据库中选择表:

                psql -d postgres -c "\dt;"
                

                我的“postgres”数据库没有表格,但任何有表格的数据库都会将基于文本的表格输出到终端(标准输出)。

                为了完整起见,我们也可以从表中选择所有行:

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

                .

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

                即使返回零行,您也会得到字段名称。

                如果您的表有十几行,或者您不确定,那么从行数开始了解数据库中有多少数据会更有用:

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

                .

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

                不要说“1 行”让您感到困惑,它只是表示查询返回了多少行,但 1 行包含您想要的计数,在本例中为 0。

                注意:在没有定义所有者的情况下创建的数据库将归当前用户所有。

                【讨论】:

                  【解决方案16】:

                  在使用 JDBC 驱动程序时遇到了问题,因此只需在 URL 中的主机名之后添加数据库(可能是多余的,具体取决于您可能使用的工具),例如 jdbc:postgres://&lt;host(:port)&gt;/&lt;db-name&gt;

                  此处记录了更多详细信息:http://www.postgresql.org/docs/7.4/static/jdbc-use.html#JDBC-CONNECT

                  【讨论】:

                  • 我知道这有点离题,因为它只被要求提供 psql,但谷歌把我的问题带到了这里,所以我认为这里值得一提
                  【解决方案17】:

                  通过现有的超级用户连接到 postgres。

                  通过您连接到 postgres 的用户名创建一个数据库。

                  create database username;
                  

                  现在尝试通过用户名连接

                  【讨论】:

                    【解决方案18】:

                    我尝试了其中一些解决方案,但效果不佳(尽管它们非常正确!)

                    最后我的错误是:

                    致命:用户密码验证失败

                    当我运行以下命令时:psql

                    然后我运行了这两个命令:

                    dropdb()
                    createdb()
                    

                    注意:这删除数据库,但我不需要它,并且由于某种原因我无法再访问 pqsl,所以我删除并重新创建了它。 然后psql又工作了。

                    【讨论】:

                      【解决方案19】:

                      您可以在环境变量 PGDATABASE=database_name 中设置要连接的数据库名称。如果您不设置此 psql 默认数据库名称为用户名。设置后你不必创建b

                      【讨论】:

                      • 我发现我仍然需要通过 createdb 创建数据库。我认为 Nav 的意思是“如果您将 env var 设置为已经存在的数据库......”
                      • 哦,是的,你必须创建数据库
                      【解决方案20】:

                      如果您使用 pgAdmin 工具并且在尝试连接到服务器时遇到此错误,请在该服务器的“属性”中的“连接”选项卡下,检查列为“维护数据库”的数据库是否存在。

                      如果命名数据库被删除,该值不会自动更新,并且会阻止您的登录工作。如果这不起作用,请验证其余的 Connection 值是否正确。

                      【讨论】:

                        【解决方案21】:

                        在 docker 中运行 postgres。在 cli 中,我收到错误“root”角色不存在。

                        su - postgres

                        psql

                        解决了问题。

                        PostgreSQL 在安装 PostgreSQL 时创建的系统上有自己的用户。 postgres 用户无需使用密码即可登录 PostgreSQL。没有其他用户能够登录 PostgreSQL。

                        这意味着在使用 PostgreSQL 之前,您需要使用以下命令切换到该用户帐户:

                        su - postgres 然后,您将能够使用以下命令登录 PosgreSQL 客户端:

                        psql 您将无法像任何其他用户一样从命令行访问数据库。

                        【讨论】:

                          【解决方案22】:

                          通过自制软件安装 postgresql 时遇到此问题。

                          必须创建默认的“postgres”超级用户:

                          createuser --interactive postgres 为超级用户回答 y

                          createuser --interactive user answer y to for super user

                          【讨论】:

                            【解决方案23】:

                            使用自制软件安装 postgresql 后,我仍然遇到上述问题 - 我通过将 /usr/local/bin 放在 /usr/bin 之前的路径中解决了这个问题

                            【讨论】:

                              【解决方案24】:

                              这是一个基本的误解。只需输入:

                              pgre

                              将导致此响应:

                              pgres <db_name> 
                              

                              如果用户有访问数据库的权限,它将成功而不会出错。

                              可以深入了解导出的环境变量的详细信息,但这是不必要的。这太基础了,不会因为任何其他原因而失败。

                              【讨论】:

                              • 也没有推荐如何解决问题,所以没有回答问题。
                              • 从未听说过pgres
                              猜你喜欢
                              • 2022-01-24
                              • 1970-01-01
                              • 1970-01-01
                              • 2015-03-28
                              • 1970-01-01
                              • 1970-01-01
                              • 2013-02-24
                              相关资源
                              最近更新 更多