首页 文章

容器化的服务器应用程序无法连接到MySQL数据库

提问于
浏览
0

我遇到的是 Access denied for user 'USER'@'IP' (using password: YES) 数据库服务器拒绝了每个连接 . 数据库凭据(用户名,密码,数据库名称和SSL证书)都是正确的,并且在通过其他MySQL客户端或作为本地实例上的容器运行的同一应用程序进行连接时起作用 .

我've verified that all credentials are the same on the local and the server-hosted versions of the app and that the user I' m连接有指定的通配符 % 主机 . 说实话,不确定接下来要检查什么...

连接代码的编辑版本如下:

let connectionCreds = {
    host: Config.SQL.HOST,
    user: Config.SQL.USER,
    password: Config.SQL.PASSWORD,
    database: Config.SQL.DATABASE,
    charset: 'utf8mb4',
};

if (Config.SQL.SSL_ENABLE) {
    connectionCreds['ssl'] = {
        key: fs.readFileSync(Config.SQL.SSL_CLIENT_KEY_PATH),
        cert: fs.readFileSync(Config.SQL.SSL_CLIENT_CERT_PATH),
        ca: fs.readFileSync(Config.SQL.SSL_SERVER_CA_PATH)
    }
}

this.connection = MySQL.createConnection(connectionCreds);

附加信息:服务器应用程序使用mysql2库在Node中构建,以连接到数据库 . 没有特殊的防火墙规则导致网络问题,并且这已经证实了库IS连接但无法进行身份验证 .

2 回答

  • 1

    在设置了Cloud SQL Proxy后,我设法弄清楚实际的错误是什么:在秘密和pod配置之间的某处,额外的换行符被添加到数据库名称,导致任何连接尝试失败 . 通过代理设置,这一点已经明确,因为显示了该效果的实际错误消息 .

    (特别是我用来验证凭据是否准确的凭据的所有日志记录都没有明确显示换行符,并且由于控制台显示添加了换行符来包装显示,并且它恰好出现在线上准确地说明数据库名称的结束位置)

  • 0

    您是否阅读了https://cloud.google.com/sql/docs/mysql/connect-container-engine上的文档?

    在Container Engine中,您需要在应用程序窗格旁边设置Cloud SQL Proxy容器并与之通信 . 然后,Cloud SQL Proxy将实际调用Cloud SQL服务 .

    如果容器在本地工作,我假设您在开发计算机上设置了应用程序默认凭据 . 它可能会失败,因为这些凭据不作为服务帐户文件在您的容器上 . 尝试配置服务帐户文件,或使用 --scopes 参数创建GKE集群,以使您的实例能够访问Cloud SQL .

相关问题