无法连接到 PostgreSQL 数据库

Cant connect to PostgreSQL database

我在连接数据库时遇到问题。我收到消息说角色 "Darko" 不存在。这是我的命令顺序:

/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -l logfile 
Server starting /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data The files belonging to this database system will be owned by user "darko". 
This user must also own the server process. 
The database cluster will be initialized with locales COLLATE: en_US.UTF-8 TYPE: en_US.UTF-8 MESSAGES: en_US.UTF-8 MONETARY: hr_HR.UTF-8 NUMERIC: hr_HR.UTF-8 TIME: en_US.UTF-8 
The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". 
Data page checksums are disabled. initdb: directory "/usr/local/pgsql/data" exists but is not empty 
If you want to create a new database system, either remove or empty the directory "/usr/local/pgsql/data" or run initdb with an argument other than "/usr/local/pgsql/data". /usr/local/pgsql/bin/psql psql: 
FATAL: role "darko" does not exist

initdb 是用于创建集群的工具(请参阅 PostgreSQL documentation 了解此上下文中的集群定义)。看来您已经这样做了,因为您的目录不为空。不要再这样了。

然后,您正在尝试连接 psql。默认情况下,它会尝试使用与您的 OS 用户同名的数据库用户进行套接字连接。由于您没有创建名为 'darko' 的角色,它失败了。

您要做的是以 postgres 用户身份尝试连接。试试这个连接:

sudo -u postgres psql

您应该能够连接到该行(假设您没有更改 pg_hba.conf 文件),然后您应该能够创建您的用户和数据库。

这是 psql 的 documentation page

您正在尝试在“/usr/local/pgsql/data”目录中初始化 Postgres 集群(将存储所有 Postgres 数据和日志的主目录)。

在任何地方创建另一个目录,并将它的完整路径传递给 initdb 的 -D 选项。

它将初始化您的 Postgres 集群。

在此过程中,将创建默认数据库角色。如果您在常规 OS 用户 ("darko") 下 运行 initdb -- 它将创建具有相同名称的数据库用户。但通常人们 运行 posgres 工具(包括 initdb)在一个单独的 OS 用户下,"postgres"——如果你这样做(比如 "sudo -u postgres initdb -D ..."),initdb 将创建数据库角色 "postgres" 代替。 (顺便说一句,在 Postgres 术语中,数据库用户和数据库角色是一回事)。

然后,一旦 initbd 成功创建了您的 Postgres 集群,您可以使用 "ls" 检查它 -- 目录必须包含子目录,例如 "base"、"global"、"pg_xlog"、配置文件等

然后你需要 运行 Postgres,它是使用 pg_ctl 命令完成的,你需要将路径传递给你的集群,再次使用 -D 选项:

pg_ctl -D /path/to/cluster

如果 运行 成功,打开另一个终端 tab/window 并尝试使用 psql 和相应的数据库角色("darko" 或 "postgres",根据您的先前的决定):

psql -U darko template1

"template1" 是一个始终存在的数据库名称,它用作您以后创建的所有数据库的模板。

此外,在您尝试使用 pg_ctl 启动 Postgres 之前,有必要检查一下您是否已经安装了一些 Postgres 运行ning:

ps ax | grep postgres

-- 如果你有另一个 Postgres 运行ning,你可以使用 "pg_ctl stop" 关闭它,并使用相应的 -D 选项指向正确的集群目录。

示例(Ubuntu):

$ ps ax | grep postgres | grep D
21996 ?        S     23:37 /usr/lib/postgresql/9.6/bin/postgres -D /var/lib/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf

要优雅地停止它,只需 运行:

/usr/lib/postgresql/9.6/bin/pg_ctl -D /var/lib/postgresql/9.6/main stop