首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Metabase连接到数据库(当Metabase在Google上运行时)

如何从Metabase连接到数据库(当Metabase在Google上运行时)
EN

Stack Overflow用户
提问于 2020-01-17 12:34:57
回答 3查看 1.7K关注 0票数 0

我在Google上运行代谢酶,并试图连接到一个MySQL数据库实例(该实例也驻留在同一个项目中的Google中)。

注意:这不是元数据库的应用程序数据库,而是连接数据库以按照https://www.metabase.com/docs/latest/setting-up-metabase.html对数据执行分析

  • 当我在本地运行元数据库时,我可以使用公共IP (一旦我的IP被白化后)很好地连接
  • 在云运行中,我无法通过元数据库连接。
  • 我已经将数据库添加到云中运行的Cloud SQL connections (per:https://cloud.google.com/sql/docs/mysql/connect-run)
  • 我试图连接到的数据库是一个读副本 (如果这有任何区别的话)
  • 当我使用0.0.0.0/0在Cloud实例上“允许所有”时,我能够使用公共IP进行连接。一旦我删除了这个规则,我就无法连接。
  • 我知道云运行还不支持

为了连接到数据库,我不得不使用Metabase的web接口:

在这个接口中,我尝试过:

  • 将主机设置为公共IP
  • Additional JDBC connection string options设置为按https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory设置为cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory (用实名替换<INSTANCE_CONNECTION_NAME> )
    • 当我设置它时,错误是:Could not connect to address=(host=<HOST>)(port=3306)(type=master) : Socket fail to connect to host:<HOST>, port:3306. Socket factory failed to initialized with option "socketFactory" set to "com.google.cloud.sql.mysql.SocketFactory" (我已经编辑了真实的<HOST>值)

思想:

  • 据我现在所理解,当我在socketFactory中设置Additional JDBC connection string options时,主机将被忽略。
  • 我只能假设我没有正确格式化或配置Additional JDBC connection string options字段。

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2020-01-20 13:38:42

如CloudSQL中所述,不能通过任何TCP连接连接到TCP。

云运行(完全托管)不支持使用TCP连接到Cloud实例。您的代码不应该尝试使用IP地址(如127.0.0.1或172.17.0.1 )访问实例。

可以使用类似于以下代码的代码使用实例连接名称连接到CloudSQL实例:

代码语言:javascript
复制
// The configuration object specifies behaviors for the connection pool.
HikariConfig config = new HikariConfig();

// Configure which instance and what database user to connect with.
config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
config.setUsername(DB_USER); // e.g. "root", "postgres"
config.setPassword(DB_PASS); // e.g. "my-password"

// For Java users, the Cloud SQL JDBC Socket Factory can provide authenticated connections.
// See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details.
config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);
config.addDataSourceProperty("useSSL", "false");

// ... Specify additional connection properties here.
// ...

// Initialize the connection pool using the configuration object.
DataSource pool = new HikariDataSource(config);


  [1]: https://cloud.google.com/sql/docs/mysql/connect-run

如果您担心连接的安全性,可以始终选择使用CloudSQL连接到JDBC套接字工厂代理。请注意,在这种情况下,您的JDBC应该如下所示:

代码语言:javascript
复制
jdbc:mysql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false&user=<MYSQL_USER_NAME>&password=<MYSQL_USER_PASSWORD>

尝试使用完整的URL进行连接,并对其进行几次检查。当人们在JDBC中犯了一个小错误,比如额外的分号、冒号等等时,我看到了同样的错误。

票数 1
EN

Stack Overflow用户

发布于 2020-01-18 21:12:49

您不能在云运行时使用,它还没有兼容,您可以这样忘记。阅读副本将不会改变什么,你也可以节省和删除它!

首先,允许0.0.0.0/0网络访问Cloud数据库。像这样,您可以验证您的云运行容器在向internet开放的数据库中是否正确工作。

然后,删除这个配置,然后按照这个页面重试,将您的MySQL实例连接到Cloud。在您的应用程序中,还必须添加一个依赖项(maven或gradle)来获取套接字工厂jar。

应该管用的。分享更多的代码或配置,以便能够帮助您更多!

票数 0
EN

Stack Overflow用户

发布于 2020-05-14 08:12:16

两年后,我认为情况可能发生了变化。我在Google上能够这样做,使用了beta_settings定义文件中的app.yaml配置选项。

例如

代码语言:javascript
复制
beta_settings:
  cloud_sql_instances: 
    - <Project><Zone><Metabase_backend_postgresql_instance>=tcp:5432
    - <Same Project><Same Zone><Some MySql cloud instance>=tcp:3306

在元数据库UI中添加数据库连接时,每个关于flex环境的Google文档需要将IP地址设置为127.17.0.1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59787457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档