如何首次配置PostgreSQL?

222

我刚刚安装了postgresql并在安装过程中指定了密码x。 当我尝试执行createdb并指定任何密码时,会收到以下消息:

createdb:无法连接到数据库postgres:对于用户身份验证失败的密码,致命错误

createuser也是同样的情况。

我该如何开始呢? 我可以将自己添加为数据库的用户吗?


可能是如何在全新安装后登录和验证Postgresql?的重复问题。 - Evan Carroll
4
这与晚一年问出的问题非常相似,但我认为这个问题有一个危险的主要答案。您不应该设置postgres用户。它是 PostgreSQL 的 SU,会导致登录攻击。创建另一个超级用户,并将锁定的postgres保留给具有 root 权限的 UNIX 管理员。 - Evan Carroll
11个回答

356

其他的回答对我来说还不够满意。以下是在 Xubuntu 12.04.1 LTS 上为postgresql-9.1解决此问题的方法。

  1. 使用 postgres 用户连接到默认数据库:

    sudo -u postgres psql template1

  2. 为 postgres 用户设置密码,然后退出 psql (Ctrl-D):

    ALTER USER postgres with encrypted password 'xxxxxxx';

  3. 编辑 pg_hba.conf 文件:

    sudo vim /etc/postgresql/9.1/main/pg_hba.conf

    并将关于 postgres 的行上的 "peer" 更改为 "md5":

    local      all     postgres     peer md5

    要知道正在运行哪个版本的 postgresql,请查找 /etc/postgresql 下的版本文件夹。此外,您也可以使用 Nano 或其他编辑器。

  4. 重新启动数据库:

    sudo /etc/init.d/postgresql restart

    (在这里,您可以使用 psql -U postgres 检查它是否有效)。

  5. 创建一个与您同名的用户(要找到它,可以键入 whoami):

    sudo createuser -U postgres -d -e -E -l -P -r -s <my_name>

    这些选项告诉postgresql创建一个用户,该用户可以登录、创建数据库、创建新角色、是超级用户,并且将拥有加密密码。真正重要的选项是-P -E,这样您会被要求输入将要加密的密码,并且-d选项可以让您执行createdb命令。

    注意密码:它首先会两次询问新密码(用于新用户),接着会询问postgres密码(在第2步中指定的密码)。

  6. 再次编辑pg_hba.conf文件(请参考上述第3步),并将与“所有”其他用户相关的行上的“peer”更改为“md5”:

    local      all     all     peer md5

  7. 重新启动postgresql服务(就像第4步一样),并检查是否可以在不使用-U postgres选项的情况下登录:

    psql template1

    请注意,如果您只执行psql命令,则会失败,因为它将尝试连接到与您名称相同的默认数据库(即whoami)。template1是最初的管理数据库。

  8. 现在createdb <dbname>命令应该可以正常工作了。


2
同样在Ubuntu 14.04 LTS上表现出色。 - ilhnctn
2
只是提示一下,在pg_hba.conf文件中的行必须放在第一行,否则可能会被其他规则忽略(在F21上运行pgsql 9.3.5)。我花了一些时间才明白这一点,取消注释和更改已经注释的postgresql用户行并不能简单解决问题。 - dashesy
我认为这在PG 9.4中已经改变了,因为在第3点中我只有local all all peer,现在我已将其更改为md5。好吗? - Léo Léopold Hertz 준영
2
这实际上是错误的建议。你正在操作postgres用户。https://dev59.com/23M_5IYBdhLWcg3wPAVF#41604969 - Evan Carroll
1
请将答案更新至2017年!PostgreSQL 9.6和UBUNTU 16 LTS... 没有简单的方法吗? - Peter Krauss
显示剩余4条评论

65

在Linux下,PostgreSQL通常被配置为允许root用户从shell(控制台或ssh)登录为超级用户postgres

$ psql -U postgres

那么您只需像往常一样创建新数据库:

CREATE ROLE myuser LOGIN password 'secret';
CREATE DATABASE mydatabase ENCODING 'UTF8' OWNER myuser;

这应该可以在不触及 pg_hba.conf 的情况下正常运行。如果你想使用一些 GUI 工具通过网络来完成这个操作,那么你就需要修改 pg_hba.conf


我正在使用Windows操作系统进行工作。 我已经在我的目录中运行了initdb,并且配置文件已经存在。 现在,createdb可以正常工作。 但是当我执行psql test时, 我收到了以下警告信息: 警告:控制台代码页(437)与Windows代码页(1252)不同, 8位字符可能无法正常工作。请参阅psql参考页面“Windows用户注意事项”以获取详细信息。此外,所有命令都无法正常工作。 - Rohit Banga
14
即使使用sudo,"postgres"用户的对等身份验证仍然失败,错误提示为:psql: FATAL: Peer authentication failed for user "postgres" - Peter Krauss
完美的答案,我不想涉及配置文件,这在Ubuntu上的PostgreSQL 10.10上运行得非常完美。之后你应该能够通过 psql -d mydatatabase -U myuser 连接。 - ranu

34

你可以使用两种方法,均需要创建用户数据库。

  1. 使用createuser和createdb命令

    $ sudo -u postgres createuser --superuser $USER
    $ createdb mydatabase
    $ psql -d mydatabase
    
  2. 使用SQL管理命令,并通过TCP连接密码

  3. $ sudo -u postgres psql postgres
    

    然后,在psql命令行中执行以下操作:

    CREATE ROLE myuser LOGIN PASSWORD 'mypass';
    CREATE DATABASE mydatabase WITH OWNER = myuser;
    

    然后你可以登录,

    $ psql -h localhost -d mydatabase -U myuser -p <port>
    

    如果您不知道端口号,您可以在作为postgres用户运行以下命令来获取它:

    SHOW port;
    

    或者,

    $ grep "port =" /etc/postgresql/*/main/postgresql.conf
    

    注: postgres 用户

    我建议不要修改 postgres 用户。

    1. 操作系统通常锁定了该用户。没有人应该以 postgres 的身份“登录”到操作系统上。你需要使用root用户来进行验证。
    2. 它通常没有密码保护,并委托给主机操作系统。这是一件好事情。这通常意味着,为了作为 PostgreSQL 中的 SA(相当于 SQL Server),你必须具有对底层数据文件的写入访问权限。这意味着你本来就能够造成严重破坏。
    3. 通过禁用该用户,您消除了通过命名超级用户进行暴力攻击的风险。隐藏和混淆超级用户的名称是有优势的。

使用第一种方法,用户最终没有特权。我最终使用了这个命令而不是第一个命令:sudo -u postgres createuser -U postgres -d -e -E -l -P -r -s $(whoami) - Fabien Snauwaert
1
@FabienSnauwaert,-s 会将用户设置为超级用户。 - Evan Carroll
这是这里最好的答案。我的应用程序还需要启用本地套接字连接的MD5身份验证。在Debian上,我运行了sudo vim /etc/postgresql/11/main/pg_hba.conf然后 :%s/\(local\s\+all\s\+all\s\+\)peer/\1md5/g然后 :x然后 sudo /etc/init.d/postgresql restart - undefined

23

这是我的解决方案:

su root
su postgres
psql

4
在许多情况下,这将起作用,因为许多站点将使用pg_hba.conf对postgres数据库用户进行身份验证(对等方法),以此与postgres系统账户进行匹配。然而,任何特定站点的成功登录最终取决于pg_hba.conf的内容。 - Reed Sandberg
1
对我有用。我用sudo bash替换了第一行。 - eje211
我不明白这有什么帮助,从我的理解来看,这会登录root和postgres,并运行psql。具体发生了什么?谢谢! - olleh
su root在Ubuntu中无法使用。 - noone392

15

编辑提示:警告:请先阅读Evan Carroll发布的答案。这个解决方案似乎不安全,也不建议使用。

这在标准的Ubuntu 14.04 64位安装中对我有效。

我遵循了我在http://suite.opengeo.org/4.1/dataadmin/pgGettingStarted/firstconnect.html找到的带有小修改的说明。

  1. 安装postgreSQL(如果尚未在计算机上):

sudo apt-get install postgresql

  1. 使用postgres用户运行psql

sudo –u postgres psql postgres

  1. 为postgres用户设置一个新密码:

\password postgres

  1. 退出psql

\q

  1. 编辑/etc/postgresql/9.3/main/pg_hba.conf并更改:

#Database administrative login by Unix domain socket local all postgres peer

至:

#Database administrative login by Unix domain socket local all postgres md5

  1. 重新启动postgreSQL:

sudo service postgresql restart

  1. 创建一个新数据库

sudo –u postgres createdb mytestdb

  1. 再次使用postgres用户运行psql:

psql –U postgres –W

  1. 列出现有的数据库(你的新数据库现在应该在其中):

\l


3
我下投了反对票,因为我认为激活 postgres 用户是个不好的主意。https://dev59.com/23M_5IYBdhLWcg3wPAVF#41604969 - Evan Carroll

8

在 MacOS 中,我按照以下步骤使其工作。

首次安装后,获取系统的用户名。

$ cd ~
$ pwd
/Users/someuser
$ psql -d postgres -U someuser

现在您已经登录系统,可以创建数据库。

postgres=# create database mydb;
CREATE DATABASE
postgres=# create user myuser with encrypted password 'pass123';
CREATE ROLE
postgres=# grant all privileges on database mydb to myuser;
GRANT

4
如果您像我一样使用macOS,可能没有postgres用户。当尝试运行“sudo -u postgres psql”时,会出现错误“sudo: unknown user: postgres”。幸运的是,postgres提供了可执行文件。
createuser -D /var/postgres/var-10-local --superuser --username=nick
createdb --owner=nick

然后我能够顺利地访问psql

psql
psql (10.2)
Type "help" for help.

nick=#

如果您要从头开始创建新的PostgreSQL实例,请按照以下步骤进行操作。我使用了非默认端口,以便可以运行两个实例。

mkdir /var/postgres/var-10-local
pg_ctl init -D /var/postgres/var-10-local

然后我编辑了/var/postgres/var-10-local/postgresql.conf,将端口号更改为我喜欢的5433。

/Applications/Postgres.app/Contents/Versions/10/bin/postgres -D /Users/nick/Library/Application\ Support/Postgres/var-10-local -p 5433

createuser -D /var/postgres/var-10-local --superuser --username=nick --port=5433
createdb --owner=nick --port=5433

完成!


4
Note: textdb is the database which you are going to explore with 'alex' user 

root@kalilinux:~# sudo su - postgres 
postgres=#  psql   
postgres=#  create database testdb;
postgres=#  create user alex with password 'alex';
postgres=# GRANT ALL PRIVILEGES ON DATABASE testdb TO alex;`enter code here`

3
您可能需要更新您的 pg_hba.conf 文件。该文件控制用户可以从哪些 IP 地址登录。我认为默认情况下 postgres 用户是相当安全的。

2
对于RHEL6.4和postgres 8.4,该文件位于/var/lib/pgsql/data/pg_hba.conf。将ident更改为trust以供host使用(如果您正在使用ssh,则还需更改local)。 - DavidGamba

0
在我的情况下,我第一次在最近安装的Ubuntu 22.04上不知道如何进入PostgreSQL,对我来说,命令sudo -u postgres psql起作用。

asciicast


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