Heroku数据库连接属性

时间:2013-06-29 05:46:46

标签: heroku heroku-postgres

我正在尝试执行一项相对简单的任务:我想连接到Heroku数据库。我已经创建了数据库并且已经从Heroku站点获得了凭据。但是,当我尝试使用除终端'heroku'命令行客户端之外的任何连接到此数据库时,我会收到致命错误或无法连接错误。

我尝试在Heroku终端应用程序之外连接的两个工具是:Navicat和IntelliJ。

尝试连接数据库时我在Navicat中收到的错误是:

could not connect to server: Host is down
    Is the server running on host "ec2-107-21-112-215.compute-1.amazonaws.com" and accepting
    TCP/IP connections on port 5432?

我的连接设置如下:

连接名称 Heroku开发测试

主机名/ IP地址 ec2-107-21-112-215.compute-1.amazonaws.com

端口 5432

Navicat似乎甚至没有尝试连接到该主机名。

当我尝试使用完整凭据连接IntelliJ时,出现以下错误:

java.sql.SQLException: FATAL: no pg_hba.conf entry for host "75.168.4.146", user "rphbqggxeokuxl", database "dc008iqk0rq4j5", SSL off

同样,我正在使用Heroku应用程序在访问其网站上的数据库时提供的凭据。

之前是否有人遇到此Heroku连接问题?

8 个答案:

答案 0 :(得分:57)

我也遇到了FATAL: no pg_hba.conf entry for host错误消息的问题。

我通过将以下内容添加到我的JDBC字符串&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory来解决了与Heroku Postgres数据库的连接问题。

示例

jdbc:postgresql://host:port/database?user=username&password=secret&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

只有在为Postgres数据库启用SSL时(默认情况下),才需要SSL选项。

<强>提示

如果要检查数据库连接属性,则只需使用Heroku Toolbelt运行以下命令:heroku pg:info --app your-heroko-appname(确保已安装Postgres以在终端中运行此命令)

pg:info命令还会告诉您sslmode设置为require

要测试数据库连接,我建议使用SQL Power Architect,因为它是我用来检查解决方案的工具。

答案 1 :(得分:54)

Heroku提供此信息以便从外部来源进行连接:

https://devcenter.heroku.com/articles/heroku-postgresql#external-connections-ingress

第二条错误消息表明PostgreSQL未配置为接受您尝试进行的连接。鉴于Heroku提供的信息,一个很好的猜测是你没有连接SSL。尝试在您的连接上启用它。

以下是在Navicat中使用SSL的说明:http://mirror.navicat.com/manual/online_manual/en/navicat/rv_manual/ClientCert.html

这可能有助于配置Intellij以使用SSL:https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#connecting-to-a-database-remotely

答案 2 :(得分:19)

IntelliJ - &gt;数据源和驱动程序

General标签下配置主机,数据库和用户详细信息后,切换到Advanced标签,确保您已添加以下内容:

  • ssl = true
  • sslfactory = org.postgresql.ssl.NonValidatingFactory

enter image description here

答案 3 :(得分:11)

想要帮助可能遇到此问题的其他人。 如果您在单独的字段而不是命令行中提供用户名和密码,则需要使用?在数据库名称和ssl = true之间并丢弃第一个&amp;

jdbc:postgresql://host:port/database?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

最终允许我使用SQL Power Architect连接到PostgreSQL数据库的命令行

答案 4 :(得分:9)

对于那些可能正在使用Spring Boot并通过DATABASE_URL环境属性(非系统属性)提供配置的用户,可以将后缀添加到属性中:

?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

并通过略微修改配置bean传递:

@Bean
public BasicDataSource dataSource() throws URISyntaxException {

    URI dbUri = new URI(System.getenv("DATABASE_URL"));
    String username = dbUri.getUserInfo().split(":")[0];
    String password = dbUri.getUserInfo().split(":")[1];

    StringBuilder dbUrl = new StringBuilder(128);
    dbUrl.append("jdbc:postgresql://")
            .append(dbUri.getHost()).append(":")
            .append(dbUri.getPort())
            .append(dbUri.getPath());

    String query = dbUri.getQuery();
    if (null != query && !query.isEmpty()) {
        dbUrl.append("?").append(query);
    }

    BasicDataSource basicDataSource = new BasicDataSource();
    basicDataSource.setUrl(dbUrl.toString());
    basicDataSource.setUsername(username);
    basicDataSource.setPassword(password);

    return basicDataSource;
}

答案 5 :(得分:7)

您可以考虑设置ENVIRONMENT CONFIG VARIABLE&#39; PGSSLMODE&#39;要求&#39;通过Heroku的Web界面或CLI。

案例:Postgres dB设置为Heroku附加组件并附加到Heroku Dyno上的应用程序。

Heroku的instructions遗憾地忽略了如何激活SSL,即使默认情况下以标准-0开头的任何dB层都需要它。

遵循Heroku说明中的所有pg-copy或pg-upgrade步骤(首选方法取决于您的Postgres版本);但是,在退役旧数据库之前(如果相关) - 添加PGSSLMODE环境变量。

这些说明充分涵盖了如何推广新数据库(并因此设置了DATABASE_URL),因此不需要对它们进行任何更改/修改

答案 6 :(得分:1)

在postgresql.conf文件中添加或编辑以下行:

listen_addresses = '*'

将以下行添加为pg_hba.conf的第一行。它允许使用加密密码访问所有用户的所有数据库:

TYPE DATABASE USER CIDR-ADDRESS  METHOD

host  all  all 0.0.0.0/0 md5

重启postgresql服务:

net stop postgresql-9.0 & net start postgresql-9.0 

(版本应基于您的安装) - 在Windows上(以管理员身份运行cmd)。

sudo service start postgresql -- On linux (or according to your linux distribution.) 

答案 7 :(得分:1)

我正在使用node.js,并试图为我的Heroku应用程序运行knex迁移。我尝试将?sslmode=require附加到连接URL,但是没有用。我改为添加?ssl=true,现在它可以正常运行了。

下面是一个有效的Heroku PostgreSQL连接URL示例:

postgres://user:password@ec2-12-34-56-78.compute-99.amazonaws.com:port/databasename?ssl=true