【问题标题】:Cant connect to PostgreSQL database无法连接到 PostgreSQL 数据库
【发布时间】:2017-11-27 05:03:57
【问题描述】:

我在连接数据库时遇到问题。我收到消息说角色“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

【问题讨论】:

    标签: postgresql connection role


    【解决方案1】:

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

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

    它将初始化您的 Postgres 集群。

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

    【讨论】:

    • 我需要能够在我的 rails 应用程序中使用 postgresql 数据库。
    • 好的,谢谢。这是根据您的解释对我的行动的总结。 1. 我杀死了所有的 postgres 进程。 2. 在某个目录中运行 initdb。 3. 为该集群启动服务器。 4. 然后你可以连接运行**psql "database_name"的数据库。我的问题是我没有包含 database_name 参数。谢谢
    【解决方案2】:

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

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

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

    sudo -u postgres psql
    

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

    这是 psql 的 documentation page

    【讨论】:

    • 我试过 sudo -u postgres psql 但我收到了这条消息:psql: FATAL: role "postgres" does not exist。我没有改变 pg_hba.conf
    • 我为 initdb 创建了新目录,然后为该目录运行 initdb,然后为该目录启动服务器。然后我尝试了 /usr/local/pgsql/bin/psql -U darko "postgres" 并成功了。谢谢
    猜你喜欢
    • 2014-03-30
    • 2013-04-19
    • 1970-01-01
    • 2022-12-03
    • 2022-12-05
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多