51

我正在尝试执行一项相对琐碎的任务:我想连接到 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 连接问题?

4

9 回答 9

69

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

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

例子

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,因为它是我用来检查我的解决方案的工具。

于 2014-09-13T21:55:48.950 回答
61

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 。

于 2013-06-29T06:32:40.530 回答
22

IntelliJ -> 数据源和驱动程序

在选项卡下配置主机、数据库和用户详细信息后,General切换到Advanced选项卡并确保添加了以下内容:

  • ssl = 真
  • sslfactory = org.postgresql.ssl.NonValidatingFactory
  • sslmode = 要求

在此处输入图像描述

于 2016-01-10T12:43:33.580 回答
14

您可以考虑通过 Heroku 的 Web 界面或 CLI 将 ENVIRONMENT CONFIG VARIABLE 'PGSSLMODE' 设置为 'require'。

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

不幸的是, Heroku 的说明没有提及如何激活 SSL,即使默认情况下从 Standard-0 开始的任何 dB 层都需要它。

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

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

于 2017-11-28T16:44:50.650 回答
11

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

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

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

于 2015-03-17T18:42:48.453 回答
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;
}
于 2015-12-02T04:30:35.173 回答
3

我正在使用 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

于 2018-10-31T16:35:04.383 回答
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.) 
于 2016-09-16T20:18:12.197 回答
0
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
});
于 2021-08-18T06:27:48.807 回答