我一直在尝试使用私有 IP 连接设置 Google Cloud SQL,其中绑定的 IP 范围是手动分配的,但没有成功。我不知道这是否是实现中的一个错误,因为它仍处于测试阶段,文档中是否缺少某些内容,或者我只是做错了什么。(命令行会话位于底部,用于快速总结我所看到的内容。)
最初,我将其设置为自动分配 IP 范围。一切都工作得很好,除了它选择了 172.17.0.0/24,这是我的 GCE 实例上由 docker 管理的网络之一,所以我无法从那里连接(但可以在另一台没有 docker 的机器上连接)。于是我尝试走手动分配路线。
首先,我拆除了代表我创建的所有关联网络对象。有两个 VPC 对cloudsql-postgres-googleapis-com等
互连,servicenetworking-googleapis-com我将其删除,然后我确认与它们关联的路由条目也消失了。
然后,我按照https://cloud.google.com/vpc/docs/configure-private-services-access#allocing-range的指示创建 10.10.0.0/16,因为我希望它出现在我的default网络中,即自动模式,所以我仅限于下半部分(目前是清晰的)。
此时,我返回到 Cloud SQL 实例创建页面,因为它应该为我完成剩下的工作。我选中“私有IP”框,然后选择
default网络。
我当时没有做笔记,所以我的记忆可能有缺陷,特别是因为我在后来的尝试中的经历始终不同,但我记得看到的是在网络选择下拉列表下方,它说“此实例将使用现有的托管服务连接”。我认为这意味着它将使用我创建的地址范围,并继续创建实例,但实例再次登陆 172.17.0.0/24 网络。
大约在第三次时,即之前该消息所在的位置,它有一个选择框,列出了我的地址范围。同样,我的记忆力很差,所以我不知道我是否看到或点击了“连接”按钮,但最终结果是一样的。
在第四次尝试时,我确实注意到了“连接”按钮,并确保单击它,并等待它说它成功了。它确实做到了,有点:它用我之前看到的有关使用现有连接的相同消息替换了下拉列表和按钮。同样,该实例是在错误的网络上创建的。
我尝试了第五次,这次创建了一个具有新名称的新地址范围 -google-managed-services-default这是我第一次开始时自动分配给它的名称(也是私人服务访问文档建议的名称)。但即使使用该名称并明确选择它,我仍然会在错误的网络上得到实例。
事实上,我现在看到点击“连接”后,我可以去检查路由,看到创建的路由是到172.17.0.0/24。
如果我从命令行执行所有操作,似乎也会发生同样的事情:
$ gcloud beta compute addresses list
NAME ADDRESS/RANGE TYPE PURPOSE NETWORK REGION SUBNET STATUS
google-managed-services-default 10.11.0.0/16 INTERNAL VPC_PEERING default RESERVED
$ gcloud beta services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services-default \
--network=default …Run Code Online (Sandbox Code Playgroud) 在一对夫妇SO答案(的1,2),它的建议,INSERT如果有冲突和触发器应该不会触发ON CONFLICT DO NOTHING在触发语句.也许我误解了,但在我的实验中似乎并不是这样.
这是我的SQL,在Postgres 9.6上运行.
CREATE TABLE t (
n text PRIMARY KEY
);
CREATE FUNCTION def() RETURNS trigger AS $$
BEGIN
RAISE NOTICE 'Called def()';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER deftrig BEFORE INSERT ON t FOR EACH ROW EXECUTE PROCEDURE def();
Run Code Online (Sandbox Code Playgroud)
如果我然后运行几个插入:
testdb=> insert into t (n) values ('dummy') on conflict do nothing;
NOTICE: Called def()
INSERT 0 1
testdb=> insert into t (n) values ('dummy') on …Run Code Online (Sandbox Code Playgroud)