Postgres用户不存在?

120

我刚刚安装了Postgres并尝试了1-2个小时的配置。

我现在遇到的问题是无法切换到postgres用户

$ su - postgres命令会返回以下错误:su: unknown login: postgres

$ sudo -u postgres psql命令会返回以下错误:sudo: unknown user: postgres

这些尝试都是以普通用户身份进行的。以root身份运行也会得到完全相同的结果。我是在OS X上通过Homebrew安装的Postgres,已经多次阅读了相关说明。


你只是想要运行psql吗? - danielM
是的,我想要以正确的 postgres 用户身份运行。 - krystah
在某些Mac OS X版本中,使用某些安装方法,我认为用户被创建为postgres_。请注意下划线。此外,您确定您(或安装程序)实际上已创建了PostgreSQL实例并启动了数据库吗? - Craig Ringer
2
安装了 postgresql-server 包后,我终于解决了无法切换到 postgres 用户的问题。 - builder-7000
@krystah,我认为你应该将kangkyu的答案标记为正确答案。这是上述问题最合适的解决方案。 - ikartik90
11个回答

106

psql:使用我的默认用户名登录

psql -U postgres:以postgres用户身份登录

对我来说似乎不需要sudo。

我在我的OS X上使用Postgres.app作为我的Postgres数据库。它消除了确保安装工作正常并且数据库服务器正确启动的麻烦。在这里查看:http://postgresapp.com

编辑:感谢@Erwin Brandstetter纠正我的参数使用。


13
我使用Brew进行安装,但据我所见它并未创建名为postgres或_postgres的用户,因此对我来说安装失败了。 @kangkyu的解决方案将解释并引导您完成问题 - 假设您没有postgres用户,则需要执行 psql postgrespsql -d postgres - notapatch

44

通过 psql --help 命令可以得知,如果没有设置数据库名称选项(即不使用 -d 选项),那么默认使用的是你的用户名;如果没有使用 -U 选项,则数据库用户名也是你的用户名。但是,在使用创建第一个数据库的命令 initdb 时,并没有将你的用户名作为任何数据库名称。它会创建一个名为 postgres 的数据库。这个 第一个数据库总是在数据存储区初始化时由 initdb 命令创建的。此数据库称为 postgres。

因此,如果你没有另一个以你的用户名命名的数据库,你需要执行 psql -d postgres 命令才能正常使用 psql 命令。而且似乎它默认会使用 -d 选项,所以也可以使用 psql postgres 命令。

如果你已经创建了另一个与你的用户名相同的数据库(应该使用 createdb 命令创建),那么你只需要执行 psql 命令即可。并且似乎在 brew 中,第一个数据库用户名会设置为你的机器用户名。

psql -d <first database name> -U <first database user name>
或者,
psql -d postgres -U <your machine username>
psql -d postgres
默认情况下将起作用。

1
还能用。我使用 homebrew 安装了 Postgres 13,这个版本对我来说可用。 - ufukty

19

OS X通常在系统帐户名称前加“_”; 你没有说你使用的OS X版本是什么,但至少在10.8和10.9中,在默认安装中存在 _postgres 用户。请注意,你将无法以该帐户进行su(除非是root),因为它没有密码。另一方面,sudo -u _postgres应该可以正常工作。


谢谢!这就是我在寻找的答案。 有什么办法可以将用户重命名为“postgres”吗?以该_postgres用户登录会导致psql抱怨“_postgres”用户不存在。我正在尝试使用来自另一个数据库的备份文件恢复干净的postgres实例。 - Chris Reyes - he-him
1
@ChrisReyes 更改系统账户的名称可能会破坏使用它们的系统组件,因此我强烈建议不要这样做。您可以创建另一个用户名为“postgres”的用户账户并使用它,但如果我理解正确(这可能不是),你遇到的问题是在postgres数据库内部用户账户的名称不是_postgres。据我所知,数据库内的账户名与系统账户名是分开的,因此在_postgres系统账户下运行DB实例并使用postgres数据库账户打开该DB不应该有问题。 - Gordon Davisson

7

对于我来说,这是macOS上的解决方案。 重新安装psql。

brew install postgres

启动 PostgreSQL 服务器

pg_ctl -D /usr/local/var/postgres start

初始化数据库

initdb /usr/local/var/postgres

如果此命令引发错误,请删除旧的数据库文件并重新运行上述命令。
rm -r /usr/local/var/postgres

创建新的数据库。
createdb postgres_test
psql -W postegres_test

您将登录到此数据库,并可以在此处创建用户以进行登录。


非常好的答案!对我很有帮助。在创建新数据库时有一个小错别字:createdb postgres_test,然后是 psql -W postgres_test。你在 postegres_test 中多了一个 "e"。 - Fredster
@Fredster,很高兴能帮到你! - Adnan Fayaz

5
psql -U postgres

对于数据库名称为postgres和用户名为postgres的情况,该方法对我有效。因此您不需要使用sudo命令。

如果是其他数据库,请尝试以下方法:

psql -U yourdb postgres

如Postgres帮助中所示:

psql [OPTION]... [DBNAME [USERNAME]]

1
我的情况是:$ psql -U postgres 生成了错误输出 psql: FATAL: role "postgres" does not exist,但是 psql postgres 可以正常工作。 - Frozen Flame
我收到了错误信息 psql: 错误: 无法连接到服务器:没有这样的文件或目录 服务器是否正在本地运行并接受 在 Unix域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接? - Muaath

4

我和kryshah一样,当我使用su - postgressudo -u postgres psql时,会出现完全相同的错误。DanielM的答案也给出了错误信息。

错误设置时的输出

然而,从przbabu的评论中可以得到答案。

masi$ psql
psql: FATAL:  database "masi" does not exist
masi$ psql -U postgres
psql: FATAL:  role "postgres" does not exist
masi$ psql postgres
psql (9.4.1)
Type "help" for help.

我认为这个问题的某些部分可能与OSX中的所有者设置有关。
masi$ ls -al /Users/
total 0
drwxr-xr-x   7 root      admin  238 Jul  3 09:50 .
drwxr-xr-x  37 root      wheel 1326 Jul  2 19:02 ..
-rw-r--r--   1 root      wheel    0 Sep 10  2014 .localized
drwxrwxrwt   7 root      wheel  238 Apr  9 19:49 Shared
drwxr-xr-x   2 root      admin   68 Jul  3 09:50 postgres
drwxr-xr-x+ 71 masi      staff 2414 Jul  3 09:50 masi

但是执行sudo chown -R postgres:staff /Users/postgres会出现chown: invalid user: ‘postgres:staff’的错误。

简而言之,这并不是解决问题的方法。 使用postgres安装提供的工具来创建用户和数据库。

获取正确的设置和输出

在postgres安装后,有特定的命令可以向数据库系统添加新用户。 在initdb之后,按照这里的描述运行以下命令。

createuser --pwprompt postgres
createdb -Opostgres -Eutf8 masi_development
psql -U postgres -W masi_development

为了避免频繁要求密码,您有三个选择,如此处所述。请参考此处

3

2
请看这个链接 https://dev59.com/fGMm5IYBdhLWcg3wZ-bQ#46951367 - unom

0

你可以尝试使用以下方法创建新角色,你可以自定义名称:

sudo adduser <new_user_role>

0
这个视频帮助了我。使用“initdb”时,你需要使用--username="username",这里你可以使用任何用户名。当你用这个实用程序初始化另一个db实例时,就没有默认用户,你需要告诉postgres。
你可以使用这个: initdb -D "数据目录的位置" --username=youruser -W
为了更清楚地理解这一点,你可以观看: https://www.youtube.com/watch?v=tdijTz8n5ok

0
安装postgres-server:
yum install postgresql-server -y

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