无法连接到PostgreSQL数据库

时间:2017-06-23 14:56:12

标签: postgresql connection role

我在连接数据库时遇到问题。我回忆起角色" 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

2 个答案:

答案 0 :(得分:0)

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

然后,你正在尝试连接psql。默认情况下,它正在尝试与OS用户使用与数据库用户相同名称的套接字连接。由于您没有创建名为“darko”的角色,因此失败。

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

sudo -u postgres psql

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

这是psql的documentation page

答案 1 :(得分:0)

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

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

它将初始化你的Postgres群集。

在此过程中,将创建默认数据库角色。如果在常规OS用户(“darko”)下运行initdb,它将创建具有相同名称的数据库用户。但通常人们在一个单独的OS用户下运行posgres工具(包括initdb),“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

如果它成功运行,打开另一个终端选项卡/窗口并尝试使用psql和相应的数据库角色(根据您之前的决定“darko”或“postgres”)进行连接:

psql -U darko template1

“template1”是一个始终存在的数据库名称,它可以作为您将要创建的所有未来数据库的模板。

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

ps ax | grep postgres

- 如果你有另一个Postgres正在运行,你可以使用“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