psql:致命错误:角色“ postgres”不存在


404

我是Postgres新手。

我为Mac安装了postgres.app。我在玩psql命令,无意中删除了postgres数据库。我不知道里面有什么。

我目前正在研究一个教程:http : //www.rosslaird.com/blog/building-a-project-with-mezzanine/

我被困在 sudo -u postgres psql postgres

错误信息: psql: FATAL: role "postgres" does not exist

$哪个psql

/Applications/Postgres.app/Contents/MacOS/bin/psql

这是打印出来的 psql -l

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

那我应该采取什么步骤呢?删除与psql相关的所有内容并重新安装所有内容?

感谢您的帮助!


1
重新启动计算机。确保brew services start postresql执行从启动。
Michael Dimmitt

Answers:


409

注意:如果您使用自制软件安装了postgres,请参阅下面@ user3402754的注释。

请注意该错误消息不是在谈论缺少数据库,而是在谈论缺少角色。在登录过程的后期,它也可能会偶然发现丢失的数据库。

但是第一步是检查缺少的角色:psql该命令的输出是什么\du?在我的Ubuntu系统上,相关行如下所示:

                              List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 postgres  | Superuser, Create role, Create DB | {}        

如果没有至少一个角色superuser,则您有问题:-)

如果有一个,则可以使用该帐户登录。然后查看\l命令的输出:和数据库的权限与我对超级用户的Ubuntu系统user上的权限相同。因此,我认为您的设置很容易用作超级用户。因此,您可以尝试使用以下命令登录:template0template1postgresuser

sudo -u user psql user

如果user确实是数据库超级用户,则可以为其创建另一个数据库超级用户和一个私有的空数据库:

CREATE USER postgres SUPERUSER;
CREATE DATABASE postgres WITH OWNER postgres;

但是由于您的postgres.app安装程序似乎没有执行此操作,因此您也不应这样做。简单修改本教程。


10
对我而言,并未创建用户-而是CREATE USER postgres WITH SUPERUSER PASSWORD 'password'; 使用postgres v10来实现。
arcseldon '17

228
如果您homebrew从那时开始安装Postgres,则需要/usr/local/opt/postgres/bin/createuser -s postgres在终端中运行
user3402754 '18

7
我不得不运行/usr/local/opt/postgresql/bin/createuser -s postgres
user1807782

1
@ user1807782您保存了我的一天;我认为您应该以此为答案。
tolga

1
如果您使用的是Postgres的一个特定的版本,那么你需要在路径中包含的版本-/usr/local/opt/postgresql@11/bin/createuser -s postgres
Digitrance

264

关键是“我为Mac安装了postgres.app。” 该应用程序使用角色名称与您的登录名(简称)相同的数据库超级用户来设置本地PostgreSQL安装。

首次启动Postgres.app时,它将创建$ USER数据库,该数据库为psql的默认数据库(未指定时)。默认用户为$ USER,没有密码。

某些脚本(例如,pgdump在Linux systsem上使用创建的数据库备份)和教程将假定超级用户具有传统角色名postgres

您可以一次执行一次,使本地安装看起来更加传统,并避免这些问题:

/Applications/Postgres.app/Contents/Versions/9.*/bin/createuser -s postgres

这将使那些致命的角色“ postgres”不存在而消失。


119
如果您使用的是Homebrew的postgres,则需要使用/usr/local/Cellar/postgresql/9.2.4/bin/createuser -s postgres(显然是9.2.4版的)。
罗杰·利普斯科姆2014年

1
对于postgres.app 9.3,他们似乎已经重新排列了目录。我试过:/Applications/Postgres.app/Contents/Versions/9.3/bin/createuser -s postgres,但这生成了相同的错误消息:“ createuser:无法连接到数据库postgres:FATAL:角色“ postgres”不存在“
Michael Coxon 2014年

7
/Applications/Postgres.app/Contents/Versions/9.3/bin/createuser -s postgres为我正确运行。
cjspurgeon

9
如果您运行@RogerLipscombe brew link postgresql在安装后,就没有必要对整个路径追加到createuser,简单的createuser -s postgres将工作的伟大
AlessioX

2
createuser -s postgres为我工作。我在Homebrew上安装了postgres
biniam,

227

对于MAC:

  1. 安装自制软件
  2. brew install postgres
  3. initdb /usr/local/var/postgres
  4. /usr/local/Cellar/postgresql/<version>/bin/createuser -s postgres/usr/local/opt/postgres/bin/createuser -s postgres仅使用最新版本。
  5. 手动启动postgres服务器: pg_ctl -D /usr/local/var/postgres start

在启动时启动服务器

  • mkdir -p ~/Library/LaunchAgents
  • ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
  • launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

现在,可以设置它,使用psql -U postgres -h localhostGUI 登录或使用PgAdmin。

默认情况下,用户postgres将没有任何登录密码。

检查此站点以获取更多类似这样的文章:https : //medium.com/@Nithanaroy/installing-postgres-on-mac-18f017c5d3f7


3
使用最新的brew安装,您可以brew services start postgresql启动postgres
Automatico

<3 <3 <3 <3 <3 <3-
艾德·艾哈迈德

这是最好的答案
Alejandro Pablo Tkachuk

39
createuser postgres --interactive

或仅使用以下命令创建超级用户postgresl

createuser postgres -s


当我的pgadmin继续询问postgres用户时,我发现这个答案很有用,并且我确实具有postgres角色,此命令创建了它,我将自动生成的pw添加到了pgadmin中,问题得以解决!
通常

这对我有用..但是这样:“创建用户postgres”
Roberto Rodriguez

31

当您initdb使用ID为not的用户运行postgres而未postgres使用--username=postgres或指定用户名时,会发生这种情况-U postgres

然后,使用您用于运行initdb的系统用户帐户创建数据库集群,并为其赋予超级用户权限。

要解决此问题,只需使用Postgres随附的实用工具创建一个postgres带有该选项的新用户即可。该实用程序可以在Postgres的目录中找到。例如--superusercreateuserbin

createuser --superuser postgres

如果您具有自定义的主机名或端口,请确保设置适当的选项

不要忘记删除initdb为您创建的其他用户帐户。


2
这是最有用的答案。
MyWrathAcademia


16

我需要取消设置$PGUSER

$ unset PGUSER
$ createuser -s postgres

1
哦,老兄,终于明白了问题所在。
轮到

14

首先,您需要创建一个用户:

sudo -u postgres createuser --superuser $USER

您创建一个数据库:

sudo -u postgres createdb $USER

更改 $USER为系统用户名。

您可以在此处看到完整的解决方案。


8

在命令行上运行它应该修复它

/Applications/Postgres.app/Contents/Versions/9.4/bin/createdb <Mac OSX Username Here>


1
这是唯一对我有用的东西。谢谢!
Herb Meehan

4

删除postgres数据库并不重要。该数据库最初是空的,其目的只是让postgres用户在需要时拥有某种“家”来连接。

仍然可以使用SQL命令重新创建它 CREATE DATABASE postgres;

请注意,问题中提到的教程并未postgres.app牢记在心。通常,与Unix上的PostgreSQL相反,postgres.app它看起来像普通的应用程序,而不是由postgres特权与普通用户不同的专用用户运行的服务。postgres.app由您自己的帐户运行和管理。

因此,代替此命令:sudo -u postgres psql -U postgres,更符合postgres.app的精神,只需发出:psql,该命令将自动连接到与您的用户名匹配的数据库,并使用一个碰巧是超级用户的同名数据库帐户,因此它可以在权限方面做任何事情。


好的。但是,为什么ERROR: cannot drop the currently open database在尝试删除用户数据库时出现错误?因此,使用此postgres.app不是一个好习惯吗?
user805981 2013年

连接到数据库后不能删除它。无论如何,为什么要删除它?在这里是为了您的方便。
DanielVérité13年

我只是想看看是否可以。因此,当我启动psql和postgres.app时,就像默认数据库正确吗?现在访问权限呢?我无法设置它们了吗?我看到template0和template1具有访问权限
user805981 2013年

@ user805981 Postgres.app用于测试和开发目的;这是Heroku的PostgreSQL软件包,旨在使使用Ruby on Rails开发的Mac用户更容易使用PostgreSQL而不是默认的SQLite进行测试。Rails倾向于使用SQLite进行测试并部署到PostgreSQL,这引起了各种各样的问题,因此Heroku试图使在PostgreSQL上的测试也变得更加容易。Postgres.app可以很好地进行测试,但是我不会考虑将其用于生产或真实数据,这并不是它的用途。
Craig Ringer 2013年

4

对于它的价值,我安装了ubuntu并安装了许多软件包,并且与此冲突。

对我来说正确的答案是:

sudo -i -u postgres-xc
psql

2

这是唯一为我解决的问题:

createuser -s -U $USER

2
这使当前用户成为系统超级用户,而不仅仅是postgres超级用户。我会说这通常是一个坏主意,因为它绕过了常规的安全策略。您应该使用户sudo获得临时的超级用户特权。
肖恩道森


0

我认为这里不需要sudo,因为psql -l返回数据库列表。这告诉我initdb是在用户的当前用户下运行的,而不是在postgres用户下运行的。

您可以:

psql

并继续本教程。

我建议AH创建postgres用户和db的一般要点,因为许多应用程序可能希望它存在。

简要说明:

PostgreSQL不能以对操作系统的管理访问权限运行。相反,它与普通用户一起运行,并且为了支持对等身份验证(询问尝试连接的OS),它与运行初始化过程的用户一起创建了一个用户和一个db。在这种情况下,它是您的普通用户。


在postgres中几乎没有什么重要的区别。谢谢。
imsrgadich

0

brew services stop postgresql在前一天执行后就陷入了这个问题。
第二天:brew services start postgresql将无法正常工作。这是因为如使用自制软件安装时所示。postgresql使用launchd ...在计算机开机时加载。

解决方法:
brew services start postgresql
重新启动计算机。


0

\du命令返回:

角色名称= postgres@implicit_files

该命令postgres=# \password postgres返回错误:

错误:角色“ postgres”不存在。

但这postgres=# \password postgres@implicit_files很好。

sudo -u postgres createuser -s postgres第一个变体之后也可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.