我正在尝试执行一项相对简单的任务:我想连接到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连接问题?
答案 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
标签,确保您已添加以下内容:
答案 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