创建用户:无法连接到数据库postgres:致命错误:角色“tom”不存在。

118

我正在尝试首次设置Postgres,我需要创建一个有读写数据库权限的用户。然而当我使用以下命令时:

createuser username

在我的终端中,我收到了以下消息:

createuser: 无法连接到数据库postgres:致命错误:角色“tom”不存在

Tom 是我当前登录的 Ubuntu 用户帐户。我正在尝试创建一个名为“postgres”的用户名,然后执行 psql -U psql template1,以便为我的 Rails 应用程序创建一个数据库并分配所有者。


你真的想要创建一个名为 'postgres' 的用户吗?还是只是为你的Rails应用程序创建一个用户?通常情况下,'postgres'用户已经存在,问题只是连接到它以执行所需操作。 - ostergaard
10个回答

160
你提到了Ubuntu,所以我猜测你是通过apt从Ubuntu安装的PostgreSQL包。
如果是这样,postgres PostgreSQL用户账户已经存在,并且已配置为可以通过pg_hba.conf中Unix套接字的peer认证进行访问。您可以通过以postgres Unix用户的身份运行命令来访问它,例如:
sudo -u postgres createuser owning_user
sudo -u postgres createdb -O owning_user dbname
这些都在 Ubuntu PostgreSQL 文档中,这是 "Ubuntu PostgreSQL" 的 Google 首个搜索结果,并且已经在许多 Stack Overflow 的问题中涉及过。 (您忽略了一些细节,如您使用的操作系统和版本,以及如何安装 PostgreSQL,这使得回答这个问题变得更加困难。)

创建 owning_user 后,如何连接到该用户?我的意思是像连接默认用户一样, sudo -u postgres psql postgres。 那么如何连接 owning_user? - Jony
2
三个选项:(a)为该用户设置密码并编辑 pg_hba.conf 以使用 MD5 认证;(详见手册);(b)创建一个同名的操作系统用户并继续使用 peer 认证;或者(c)更高级一些,创建一个 pg_ident.conf 映射,使您的操作系统用户能够作为新用户登录。 - Craig Ringer

107

查看包含说明的git gist,请点击此处

运行以下命令:

 sudo -u postgres psql

或者

psql -U postgres

在终端输入命令以进入PostgreSQL

注意:如果你使用的是Mac,而且以上两个命令都无法使用,请跳转至下面关于Mac的部分

postgres=#

运行

CREATE USER new_username;

注意: 将new_username替换为您想创建的用户,这种情况下将是tom。

postgres=# CREATE USER new_username;
CREATE ROLE

由于您希望该用户能够创建数据库,因此您需要将其角色更改为超级用户。

postgres=# ALTER USER new_username SUPERUSER CREATEDB;
ALTER ROLE

确认一切都成功了,

postgres=# \du
                         List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
new_username     | Superuser, Create DB                           | {}
postgres         | Superuser, Create role, Create DB, Replication | {}
root             | Superuser, Create role, Create DB              | {}

postgres=# 

更新/修改(针对 Mac):

我最近在我的 Mac 上遇到了一个类似的错误:

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

这是因为我的安装设置了一个数据库超级用户,它的角色名称与您的登录(短)名称相同。

但一些 Linux 脚本假定超级用户具有传统的角色名称postgres

我怎么解决这个问题?

如果你使用homebrew安装,请运行:

/usr/local/opt/postgres/bin/createuser -s postgres

如果你正在使用特定版本的 Postgres,比如10.5,那么运行:

/usr/local/Cellar/postgresql/10.5/bin/createuser -s postgres

或者:

/usr/local/Cellar/postgresql/10.5/bin/createuser -s new_username

或者:

/usr/local/opt/postgresql@11/bin/createuser -s postgres

如果你是通过 postgres.app 来安装的,请运行:

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

P.S:将 10.5 替换为你的 PostgreSQL 版本


这个命令可以进入Postgres:psql -U postgres - leontalbot
如果有人遇到相同的问题,需要注意在psql中,像CREATE USER或ALTER USER这样的大写字母必须(!)是大写的,而不像任何数据库IDE那样。 - Igor Nikiforov

32
sudo -u postgres createuser -s tom 

如果管理员没有为您创建 PostgreSQL 用户账户,或者您被分配的 PostgreSQL 用户名与操作系统用户名不同,则需要使用 -U 选项。


7

1- 以默认的PostgreSQL用户 (postgres) 登录

sudo -u postgres -i

2- 以postgres用户身份。使用createuser命令添加一个新的数据库用户。

[postgres]$ createuser --interactive

3-exit

[postgres]$ exit

7
您的错误已经在官方文档中发布。您可以阅读此文章
我已从该文章中为您复制了原因(并超链接了URL):
这将发生在管理员未为您创建PostgreSQL用户帐户时。(PostgreSQL用户帐户与操作系统用户帐户不同。)如果您是管理员,请参见第20章以获取创建帐户的帮助。您需要成为安装PostgreSQL的操作系统用户(通常是postgres)来创建第一个用户帐户。也可能是您被分配了一个不同于您的操作系统用户名的PostgreSQL用户名;在这种情况下,您需要使用-U开关或设置PGUSER环境变量来指定您的PostgreSQL用户名。
对于您的目的,您可以执行以下操作:
1)创建一个PostgreSQL用户帐户:
sudo -u postgres createuser tom -d -P

(使用-P选项来设置密码;使用-d选项允许为您的用户名“tom”创建数据库。请注意,“tom”是您的操作系统用户名。这样,您就可以执行PostgreSQL命令而无需使用sudo。)

2)现在您应该能够执行createdb和其他PostgreSQL命令了。


2

如果您不想更改认证方法(ident)并且不想破坏pg_hba.conf,请使用以下方法:

首先登录默认用户

 sudo su - postgres

然后访问psql并创建一个与您登录的用户名相同的用户。
postgres=# CREATE USER userOS WITH PASSWORD 'garbage' CREATEDB;

您可以通过以下方式验证具有相应角色的用户:
postgres=#  \du

创建数据库后,可以使用以下命令进行验证:
psql -d dbName
\l
\q

1

1
我遇到了同样的问题,我只是这样做:
sudo su - postgres
createuser odoo -U postgres -dRSP #P 代表密码 (odoo 或者你想要给 postgres 访问权限的用户名)

1

对于Linux系统,你可以激活超级用户来创建数据库,步骤如下:

  1. 打开终端/Shell

  2. 使用以下命令进入postgres用户: sudo -u postgres -i

现在你的终端会显示为"postgres@anish-Latitude-E7450:~$"

  1. 使用以下命令进入postgres终端: psql

现在你的终端会显示为"postgres=#"

  1. 输入alter user [postgres_user_name] createdb;

现在该用户将具有创建数据库的权限。

  1. 使用'\q'退出psql

  2. 使用exit退出postgres用户

希望这对你有所帮助。


-3

5
这是完全错误的。如果用户没有运行initdb命令,他们将没有一个正在运行且可以接受连接以产生报告的错误信息的数据库服务器。请删除这个误导性的答案。(顺便说一下,在未来,请链接到/docs/current/static/以避免链接失效的问题累积) - Craig Ringer

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