我\xe2\x80\x99m 尝试自动执行将 postgres 数据库加载到 BigQuery 的任务作为日常工作。postgres 数据库采用单个 sql 文件的形式,其中包含所有表及其数据。该文件托管在 Google Cloud Storage (GCS) 上。我想获取该 sql 文件并将其中的每个表加载到 BigQuery 中其自己单独的对应表中。
\n\nStackOverflow 中关于此问题的大多数问答都假设 sql 文件仅包含一个表,而不是多个表。不幸的是,目前 BigQuery 似乎不支持内部包含多个表的单个文件。此外,我还在寻找自动化解决方案,而不是一次性的解决方案。所以,我正在寻找其他解决方案。
\n\n我\xe2\x80\x99m 希望解决两个问题:
\n\n我对每个问题都有一些选择。我希望听到有关哪种选项最可行的反馈,以及您之前可能听说过或使用过的任何其他策略。
\n\n对于每个表将文件拆分为单独的 csv 文件:
\n\n对于自动化数据管道中每个步骤的工具:(我\xe2\x80\x99m对它们不太熟悉,如果下面的工具都不是正确的选择,希望我能得到纠正。) …
google-cloud-storage google-cloud-sql google-bigquery google-cloud-platform google-cloud-functions
我正在尝试使用 python 管道连接到 CloudSQL。
实际情况
连接功能
def cloudSQL(input):
import pymysql
connection = pymysql.connect(host='<server ip>',
user='...',
password='...',
db='...')
cursor = connection.cursor()
cursor.execute("select ...")
connection.close()
result = cursor.fetchone()
if not (result is None):
yield input
Run Code Online (Sandbox Code Playgroud)
错误
这是使用 DataflowRunner 的错误消息
OperationalError: (2003, "Can't connect to MySQL server on '<server ip>' (timed out)")
Run Code Online (Sandbox Code Playgroud)
云SQL
我有 publicIP(使用 directrunner 从本地进行测试),并且我还尝试激活私有 IP 以查看这是否是与 DataflowRunner 连接的问题
选项2
我也尝试过
connection = pymysql.connect((unix_socket='/cloudsql/' + <INSTANCE_CONNECTION_NAME>,
user='...',
password='...',
db='...')
Run Code Online (Sandbox Code Playgroud)
出现错误:
OperationalError: (2003, "Can't connect to …Run Code Online (Sandbox Code Playgroud) python google-cloud-sql google-cloud-platform google-cloud-dataflow
目前,我的 Google 帐户中有一个 Cloud SQL 实例 (PostgreSQL),但我想创建一个临时数据库,以便可以在对产品 Cloud SQL 数据库进行架构更改之前执行一些测试。
prod 数据库通过一些简单的 ETL 过程自动接收来自不同数据源的数据,我不想在临时数据库上复制这些数据加载。这些自动化流程不应在暂存中运行,因为大多数时候它们对于测试目的来说是不必要的。我也不想创建与产品一样大的临时数据库。
考虑到我上面所说的以及我不使用不同的项目来设置暂存/生产环境,我有几个问题要问:
我意识到 GCP 中有一个克隆数据库的功能。我从未使用过它,但我想知道时不时克隆我的产品数据库来创建我的临时数据库是否是一个好习惯,因为进行备份和恢复可能很痛苦。
我可以以逻辑方式使用克隆功能(仅选择一些表进行克隆等)吗?还是完全依赖物理备份?
我想克隆一个巨大的数据库可能需要几个小时,所以我想知道是否有一种方法可以仅应用两个数据库之间的差异,这样我就不必每次都克隆整个数据库,类似于复制方法?
如果我对开发/测试/生产使用单独的项目。同步不同数据库环境的可用方法有哪些?
我正在尝试以非交互式方式将密码传递给 gcloud sql connect 命令。我想要实现的不是要求输入密码,而是以某种方式将其传递到命令中。
不确定基于文档是否可能,但另一方面,它对于自动化任务非常有用,我坚信有一种方法可以做到这一点......
命令:
gcloud sql connect <database_name> --user=<user_name>
Run Code Online (Sandbox Code Playgroud) 试图弄清楚什么会更好:
多个实例,每个数据库一个
或者
单个大型实例,内部将容纳多个数据库
该场景类似于 Jira Cloud,其中每个客户都有自己的 Jira Cloud 服务器和自己的数据库。现在的问题是,在 1 个大型实例中管理所有用户的数据库更好,还是为每个客户拥有一个数据库实例更好?所选替代方案的缺点和优点是什么?首先想到或想到的是备份管理 - 如果特定客户的数据库与所有其他数据库驻留在同一大型实例上,我们是否能够恢复该数据库?
类似的问题,但在不同的场景和其他要求 - 1-big-google-cloud-sql-instance-2-small-google-cloud-sql-instances-or-1-medium
在 Google Cloud SQL 实例的日志中,当向数据库发出某些请求时,我们收到错误。我们使用 Laravel 5.8 和第二代 MySQL 实例。
增加max_allowed_packet并没有帮助。
Aborted connection 436828 to db: 'xxx' user: 'xxx' host: cloudsqlproxy~xx.xx.xx.xx' (Got an error reading communication packets)
我收到一个如下所示的错误(在我的函数日志中)
用户访问被拒绝\'varun_admin\'@\'cloudsqlproxy~84.117.112.32\' (using password: YES)',
sqlMessage:
`\'varun_admin\'@\'cloudsqlproxy~84.117.112.32\' (using password: YES)',`
sqlState: '28000',
Run Code Online (Sandbox Code Playgroud)
fatal: true } ( 84.117.112.32) 有意修改。
我仔细检查了我username的password,事实上,我从工作台提出了请求,一切顺利。
这就是我创建/初始化 sql 的方式
const mysql = require('mysql')
const config = require('./../../config.js')
const connectionName = config.DB_CONNECTION_NAME
console.log(`Connection name: ${config.DB_CONNECTION_NAME}`)
const configSQL = {
host: config.DB_HOST,
user: config.DB_USER,
password: config.DB_PASSWORD,
database: config.DB_DATABASE
}
// Connection to cloud sql in production
if (!process.env.dev) {
configSQL.socketPath = `/cloudsql/${connectionName}`;
}
//SQL Config
const pool = mysql.createPool(configSQL)
// Checking if it …Run Code Online (Sandbox Code Playgroud) javascript mysql google-cloud-sql firebase google-cloud-functions
语境
我正在 Cloud Run 上运行 SpringBoot 应用程序,该应用程序使用 Hikari 连接池连接到 postgres11 CloudSQL 数据库。我使用的是最小的 PSQL 实例(1vcpu/614mb/25 连接限制)。对于设置,我遵循了以下资源:
问题
部署第三个修订版后,出现以下错误:
FATAL: remaining connection slots are reserved for non-replication superuser connections
我发现了什么
默认连接池大小为 10,这就是为什么它在第三次部署时失败 (30 > 25)。
删除旧版本时,Cloud SQL 管理面板中显示的活动连接数会减少 10,并且下一次部署会成功。
问题
看来,旧的 Cloud Run 修订版一直处于“冷”状态,以维护其连接池。有没有办法关闭这些连接而不删除修订?
在最佳实践部分,它说:
...我们建议您使用支持连接池的客户端库,该连接池可以自动重新连接断开的客户端连接。”
鉴于旧版本似乎以某种方式设法维护其连接,在 Cloud Run 中管理连接池的推荐方法是什么?
谢谢!
postgresql google-cloud-sql google-cloud-platform hikaricp google-cloud-run
文档描述 hasura 需要带有 HASURA_GRAPHQL_DATABASE_URL环境变量的 postgres 连接字符串。
例子:
docker run -d -p 8080:8080 \
-e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@hostname:port/dbname \
hasura/graphql-engine:latest
Run Code Online (Sandbox Code Playgroud)
看起来我的问题是 google cloud sql 的服务器实例连接名称看起来PROJECT_ID:REGION:INSTANCE_ID不是 TCP
从云运行文档(https://cloud.google.com/sql/docs/postgres/connect-run)我得到了这个例子:
postgres://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432但它似乎不起作用。有想法吗?
我目前正在将其cloud_sql_proxy作为解决方法添加到容器中,以便我可以连接到 TCP 127.0.0.1:5432,但我正在寻找与 google-cloud-sql 的直接连接。
// 编辑感谢您的评论,beta8 做了大部分的技巧,但我也错过了参数set-cloudsql-instances: https: //cloud.google.com/sdk/gcloud/reference/beta/run/deploy#--set-cloudsql-instances
我的完整云运行命令:
gcloud beta run deploy \
--image gcr.io/<PROJECT_ID>/graphql-server:latest \
--region <CLOUD_RUN_REGION> \
--platform managed \
--set-env-vars HASURA_GRAPHQL_DATABASE_URL="postgres://<DB_USER>:<DB_PASS>@/<DB_NAME>?host=/cloudsql/<PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>" \
--timeout 900 \
--set-cloudsql-instances <PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>
Run Code Online (Sandbox Code Playgroud) 我有一个用于生产 Web 应用程序的 PostgreSQL 11 实例。现在,我想修改连接部分以使用内部 IP 并禁用公共连接。此活动是否会导致我们的数据库出现一些停机时间?
我自己有客人:
GCP 仅更改此实例的网络部分,因此我们可以获得零停机时间。
GCP 将重新配置托管此 PostgreSQL 的实例,这会给我们的数据库带来一些停机时间,这是我们在生产中不希望出现的情况。
提前谢谢!
google-cloud-sql ×10
postgresql ×3
devops ×1
firebase ×1
gcloud ×1
hasura ×1
hikaricp ×1
javascript ×1
laravel ×1
mysql ×1
python ×1