我已经设置了一个运行完美的 Google Cloud SQL,但是我在使用文档中给出的任何方法进行连接时遇到了问题:
磷酸二氢钾
$db = new PDO('mysql:unix_socket=/cloudsql/hello-php:my-cloudsql-instance;charset=utf8','<username>','<password>');
Run Code Online (Sandbox Code Playgroud)
mysql_连接
$conn = mysql_connect(':/cloudsql/hello-php:my-cloudsql-instance', '<username>', '<password>');
Run Code Online (Sandbox Code Playgroud)
mysqli
$sql = new mysqli(null, '<username>', '<password>', null, null, '/cloudsql/hello-php:my-cloudsql-instance');
Run Code Online (Sandbox Code Playgroud)
我可以从 MySQL Workbench 进行远程连接,但每当我尝试使用上述功能从网站上进行连接时,我都会收到“在‘读取初始通信数据包’时与 MySQL 服务器失去连接”的消息 - 但我通过授权网络授予了 Cloud SQL 访问权限并检查了 IP给予。我相信这与我不是尝试从 Google App Engine 而是从我自己的开发数据库进行连接这一事实有关。如何从 Google 外部进行连接!?
更新:我已经通过各种方式验证了我的 IP,但此代码仍然无法正常工作。
$host="173.xxx.xx.xxx" <-- given from Google Developers COnsole
$db_username="root";
$db_pasword="xxxx"; <-- password I set after creating the instance
mysql_connect("$host", "$db_username", "$db_password")or die("cannot connect");
Run Code Online (Sandbox Code Playgroud)
该页面给出错误:
警告:mysql_connect() [function.mysql-connect]:在“读取初始通信数据包”时失去与 MySQL 服务器的连接,系统错误:/..../connect.php 第 5 行中的 111 无法连接
当我尝试此 PDO 连接时,我也收到错误: …
现在,我承认我对使用 Google Cloud SQL 还很陌生,但我在本地运行 MySQL 服务器方面拥有多年的经验,我认为自己几乎是这方面的专家。
现在,几天前我已经将手机游戏 RummyFight 使用的数据库上传到 Google Cloud SQL。MySQL 数据库通常在仅具有 2 GB RAM 的 2GHz PC (Win Server 2000) 上运行。在高峰时段,它每秒处理大约 250 个请求,并且由于它构建良好,索引使用良好,我的本地计算机已经能够应对它。
这些天我一直在监控Cloud SQL,我发现性能时不时会出现非常严重的下降。几乎就好像它静止不动一样。我玩游戏的客户也有同样的经历。
请看一下随附的今晚的屏幕截图,并向我解释这是否正常。我确实需要一个可靠的数据库,我不知道我对Google的云SQL要求是否太高。也许它更多的是为了数量而不是速度。
请指教。
PS 云数据库配置为具有异步写入功能的 D4-2 GB RAM。
PS #2:是的,我已经排除了问题出在网络服务器中的可能性,因为它与本地数据库中使用的相同。此外,最大负载仅为 2%。
我发现,如果您通过 SSL 连接到 Cloud SQL 实例,服务器证书中提供的 CommonName 会my-project-123456:myinstance导致证书变得不可验证,因为客户端期望 CN 是主机名或 IP。
这个问题的每个解决方案似乎都相当于“只是禁用验证”,这对我来说是不可接受的,因为:
为什么 GCP 决定正确执行其他所有操作(提供 CA 证书和客户端证书),却在身份验证方面失败了?通过禁用验证,您基本上是在说“我同意在某个时候接受 MITMed”。
由于 PIPA/HIPAA 的原因,我们无法快速、宽松地进行验证的项目怎么办?
不支持关闭验证的 mySQL 客户端怎么办?例如:在即将发布的 5.6.16 版本之前,所有使用 mysqlnd 的 PHP 5.6 mysql 库。
有没有办法让 SSL 在 Cloud SQL 上正常工作?
是否可以计算按 json 键分组的 json 值的总和?
Google云sql上的Mysql版本是5.7.17。
示例_1:我的观点的一个简短示例:
col1 | col2
-----|-----------------------
aaa | {"key1": 1, "key2": 3}
-----|-----------------------
bbb | {"key1": 0, "key2": 2}
-----|-----------------------
aaa | {"key1": 50, "key2": 0}
Run Code Online (Sandbox Code Playgroud)
SQL 查询应该产生:
col1 | col2
-----|-----------------------
aaa | {"key1": 51, "key2": 3}
-----|-----------------------
bbb | {"key1": 0, "key2": 2}
Run Code Online (Sandbox Code Playgroud)
或者
以下任何模式都可以吗?
示例_2:
col1 | col2
-----|-----------------------
aaa | {{"key_name" : "key1", "key_value" : 1}, {"key_name" : "key2", "key_value" : 3}}
-----|-----------------------
bbb | {{"key_name" : "key1", "key_value" : …Run Code Online (Sandbox Code Playgroud) 我需要在运行我们的应用程序之前更新我的数据库架构。为此,基于此线程和此答案,我决定使用 init 容器来完成这项工作。
由于我的 SQL 实例是托管的 Google Cloud SQL 实例,因此我需要gce-proxy能够连接到数据库。我的 initContainers 看起来像这样:
initContainers:
- name: cloudsql-proxy-init
image: gcr.io/cloudsql-docker/gce-proxy:1.09
command: ["/cloud_sql_proxy"]
args:
- --dir=/cloudsql
- -instances=xxxx:europe-west1:yyyyy=tcp:5432
- -credential_file=/secrets/cloudsql/credentials.json
volumeMounts:
- name: dev-db-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: ssl-certs
mountPath: /etc/ssl/certs
- name: cloudsql
mountPath: /cloudsql
- name: liquibase
image: eu.gcr.io/xxxxx/liquibase:v1
imagePullPolicy: Always
command: ["./liquibase.sh"]
env:
- name: DB_TYPE
value: postgresql
- name: DB_URL
value: jdbc:postgresql://localhost/test
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password …Run Code Online (Sandbox Code Playgroud) 我无法将 Spring Boot + Spring Data 应用程序部署到 Google App Engine 并使该应用程序连接到 Google CloudSql (MySQL) 数据库。
GAE 应用程序和 CloudSql 实例位于同一项目中。
我可以运行整个应用程序并从本地主机连接到 CloudSql,没有任何问题。
没有数据库连接的 Spring Boot 在 GAE 上可以正常工作,不会出现错误。添加 Spring Data 会引发“com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链接失败”错误。
在 pom.xml 中我包含了:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>mysql-socket-factory</artifactId>
<version>1.0.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
另外,我尝试仅使用 mysql 依赖项:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在我的研究中,我没有发现任何关于 Spring Boot + Spring Data + GAE + CloudSql 的好的例子或相关问题。
application.properties 文件中连接到 CloudSql DB 的正确设置是什么?我尝试了以下方法,但都抛出了各种错误:
spring.jpa.hibernate.ddl-auto:none
# tried with GoogleDriver and without:
# spring.datasource.driver-class-name=com.mysql.jdbc.GoogleDriver
# urls configs attempted: …Run Code Online (Sandbox Code Playgroud) google-app-engine spring spring-data google-cloud-sql spring-boot
在 Google 的 SQL Cloud Postgres 服务中,当我通过 Web 控制台为 PostgreSQL 实例创建数据库时,它会自动将数据库的默认“公共”架构的所有者设置为 cloudsqladmin。看来我无法更改所有权:
mydb=> \dn
List of schemas
Name | Owner
--------+---------------
public | cloudsqladmin
(1 row)
mydb=> alter schema public owner to postgres;
ERROR: must be owner of schema public
mydb=> \du
List of roles
Role name | Attributes | Member of
-------------------+------------------------------------------------+---------------------
cloudsqladmin | Superuser, Create role, Create DB, Replication | {}
cloudsqlagent | Create role, Create DB | {cloudsqlsuperuser}
cloudsqlreplica | Replication | {}
cloudsqlsuperuser | Create role, …Run Code Online (Sandbox Code Playgroud) 连接到 CloudSQL DB 时,您必须提供 PostgreSQL 配置详细信息(这是有道理的)。当从 Google 的配置页面获取必要的地址信息时,您将获得一个外部 IP 地址(就外部解决方案而言,没有其他地址)以连接到它。然后在使用它时会产生警告:
(node:18101) [DEP0123] DeprecationWarning: Setting the TLS ServerName to an
IP address is not permitted by RFC 6066. This will be ignored in a future
version.
Run Code Online (Sandbox Code Playgroud)
我曾尝试研究此警告,并且正在努力为此提出适当的解决方案,因为 Google 没有为此提供任何类型的服务器名称(或类似名称)。我认为一种解决方案可能是从外部向我的公司服务器添加一个指向该 IP 地址的子域,但老实说这对我们来说并不是很理想(如果这是唯一的解决方案,那很好)。这是一个运行Node 12.7.0在 上的服务器Debian 9.9 (stretch),连接到CloudSQL PostgreSQL 11 (beta).
显然,预期的解决方案是从生产代码库中删除所有 [弃用] 警告,因此希望解决这个问题,以及如何最好地攻击它的任何想法,因为似乎没有人在其他地方发布过这个!
编辑: 我能够通过向上述 IP 添加正确的主机名来解决这个问题。不确定是否有更好的解决方案(如果您找到了,请告诉我!),但这将在此期间起作用,因为无论如何保持外部服务器对我们来说只是一个短期方案。为将其添加到文档而创建的相关问题:https : //github.com/brianc/node-postgres/issues/1950
我正在尝试使用 Debezium Postgres 连接器连接到 Cloud SQL postgres。我在日志中收到以下错误。
connect_1 | org.apache.kafka.connect.errors.ConnectException: org.postgresql.util.PSQLException: FATAL: must be superuser or replication role to start walsender
connect_1 | at io.debezium.connector.postgresql.PostgresConnectorTask.start(PostgresConnectorTask.java:127)
Run Code Online (Sandbox Code Playgroud)
我突然想到我需要将 REPLICATION 添加到我的用户角色中。但是,CloudSQL 文档说明如下。
当您创建新的 Cloud SQL for PostgreSQL 实例时,默认的 postgres 用户已为您创建,但您必须设置其密码。postgres 用户是 cloudsqlsuperuser 角色的一部分,具有以下属性(权限):CREATEROLE、CREATEDB 和 LOGIN。它没有 SUPERUSER 或 REPLICATION 属性。
现在正因为如此,我不能 ALTER ROLE 添加 REPLICATION
ps:云SQL实例配置高可用。
postgresql google-cloud-sql apache-kafka google-cloud-platform debezium
我正在尝试配置构建maven springboot项目然后部署到云运行的云构建触发器。当我没有指定要连接的云 sql 实例时,我遇到了一个问题,但是当我添加"--set-cloudsql-instances", "${_DATABASE_CONNECTION_NAME}"为参数之一时,它会在云构建中引发错误,如下所示:
Step #1: ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: The caller does not have permission
Finished Step #1
ERROR
ERROR: build step 1 "gcr.io/cloud-builders/gcloud" failed: exit status 1
Run Code Online (Sandbox Code Playgroud)
以下是我的 cloudbuild.yml
steps:
- name: 'gcr.io/kaniko-project/executor:latest'
args:
- --destination=gcr.io/$PROJECT_ID/${_IMAGE_NAME}
- --cache=true
- name: 'gcr.io/cloud-builders/gcloud'
args: [
"beta", "run",
"deploy", "${_SERVICE_NAME}-${_PROFILE}",
"--image", "gcr.io/${PROJECT_ID}/${_IMAGE_NAME}",
"--region", "${_REGION}",
"--platform", "managed",
"--set-cloudsql-instances", "${_DATABASE_CONNECTION_NAME}",
"--allow-unauthenticated",
"--set-env-vars", "SPRING_PROFILES_ACTIVE=${_SPRING_PROFILE},DATABASE_CONNECTION_NAME=${_DATABASE_CONNECTION_NAME},DATABASE_NAME=${_DATABASE_NAME},DATABASE_USERNAME=${_DATABASE_USERNAME},DATABASE_PASSWORD=${_DATABASE_PASSWORD},MINIO_ACCESS_KEY=${_MINIO_ACCESS_KEY},MINIO_SECRET_KEY=${_MINIO_SECRET_KEY},MINIO_HOSTNAME=${_MINIO_HOSTNAME},MINIO_PORT=${_MINIO_PORT}"
]
images:
- gcr.io/${PROJECT_ID}/${_IMAGE_NAME}
Run Code Online (Sandbox Code Playgroud)
我已经为服务帐户设置了角色/权限,如下所示:
{PROJECT_ID}-compute@developer.gserviceaccount.com : 编辑器,Cloud Sql 客户端 <-- 默认 SA<Cloud run service …google-cloud-sql google-cloud-platform google-cloud-build google-cloud-run
google-cloud-sql ×10
mysql ×3
postgresql ×2
apache-kafka ×1
cloud ×1
debezium ×1
json ×1
kubernetes ×1
node.js ×1
spring ×1
spring-boot ×1
spring-data ×1
ssl ×1