在 Debian Buster 上使用 Perl DBD:mysql 4.0502.
my $dbh = DBI->connect_cached(
'DBI:mysql:<db>:<host>;mysql_ssl=1;mysql_ssl_ca_file=/etc/ssl/mysql/server-ca.pem;mysql_ssl_client_cert=/etc/ssl/mysql/client-cert.pem;mysql_ssl_client_key=/etc/ssl/mysql/client-key.pem',
<username>, <pass>);
尝试通过SSL连接到Google Cloud SQL(Mysql(实例,我反复收到错误:SSL connection error: Error while reading file.
和SSL connection error: Error in the certificate.
我已经对目录进行了chown
,将所有权转移到mysql:mysql,尝试了各种所有权配置,甚至移动了目录。
我已经使用与脚本中相同的参数通过 CLI 进行连接,通过脚本通过主机的不安全 SSL 进行连接,但是一旦我仅通过 SSL 限制连接并使用这些命令,就会出现相同的错误。
更新: 在对此进行了更多挖掘之后,我认为问题在于Google如何为其客户端密钥和证书(Cloud SQL上的证书验证(签署主机名。这里的建议不适用于Perl的DBD::mysql,因为他们决定在使用SSL(https://github.com/perl5-dbi/DBD-mysql/issues/110(时强制执行主机名验证。
我仍在寻找解决此问题的方法,但我现在正在研究未来的私有 IP 和 VPC。
在撰写本文时,Perl 不是与 Google Cloud Platform 交互的受支持语言。即使您成功实现了 perl 脚本以连接到 Cloud SQL 实例,鉴于其临时性质,该解决方案也有可能在某一天停止工作。确实实现并积极维护了多个其他语言的客户端库。如果您想以编程方式与 GCP 服务进行交互,我强烈建议切换到这些库之一。此外,对于任何不便,您将得到支持团队或通过 Github 问题的直接帮助。
话虽如此,一种可能的解决方法可能是从perl脚本调用mysql客户端,就像在linux shell中一样。这个想法是将sql语句编写在一个文件中,并运行mysql命令行工具来提供语句文件。这种方法有明显的警告,如果您需要交互式会话,它根本不起作用,但可能会完成从perl脚本触发简单任务的工作。我正在分享我制作的一个小片段。
-- sql statements file
show databases;
#!/usr/bin/perl
$data = `mysql --user=root --password=XXX --host=XXX.XXX.XXX.XXX < file.sql`;
print("$data");
请记住,从安全的角度来看,以这种方式公开密码是一个糟糕的主意。此外,此方法需要在 SQL 实例的"连接"选项卡中将 GCE 外部 IP 列入白名单,如下所示。
编辑:可以在此处找到连接到Cloud SQL的支持库列表,几乎所有库都需要使用cloud_sql_proxy
,其配置在同一文档中进行了解释(向上滚动(。
另外,还有一些库可以像使用 gcloud 命令行工具一样管理您的实例,可以在此处找到