You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mysql-connector-c++ 8.0连接阿里云远程MySQL 8.0超时问题求助

问题根因定位

你的连接超时是两个基础配置错误共同导致的,和C++代码逻辑本身无关:

  • 端口使用错误:你代码里引入的<mysqlx/xdevapi.h>是Connector/C++的X DevAPI接口,走MySQL X协议,默认连接33060端口。但你在命令行用mysql客户端连接时,走的是MySQL经典协议,默认端口是3306——阿里云RDS MySQL默认不开启X Plugin,根本不会监听33060端口,往一个没开服务的端口发连接请求,自然会等满超时时间被断开。
  • 连接地址错误:你代码里写的172.29.207.112是阿里云VPC内网地址,只有和该RDS实例在同一专有网络下的阿里云ECS才能访问,公网环境下往这个地址发请求根本路由不到,必然超时。你注释掉的rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com才是可用的公网连接地址。
分步解决方法
  • 方案1(推荐,无需修改RDS配置):改用经典协议API连接
    X DevAPI需要RDS侧额外开启X插件,配置成本更高,日常使用直接用Connector/C++的经典JDBC风格接口即可,和你命令行客户端用的协议完全一致,直接复用3306端口的连通性。
    代码修改参考:

    #include <iostream>
    #include <mysql/jdbc.h>
    
    using namespace sql;
    using namespace sql::mysql;
    
    int main() {
        try {
            MySQL_Driver* driver = get_mysql_driver_instance();
            // 连接串格式: tcp://[公网域名]:[3306端口]/[库名]
            Connection* conn = driver->connect(
                "tcp://rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com:3306/demo",
                "root",
                "123456"
            );
    
            Statement* stmt = conn->createStatement();
            ResultSet* res = stmt->executeQuery("select * from person");
            while (res->next()) {
                std::cout << res->getInt(1) << " " << res->getString(2) << "\n";
            }
    
            delete res;
            delete stmt;
            delete conn;
        } catch (const SQLException& e) {
            std::cerr << "Connection error: " << e.what() << ", error code: " << e.getErrorCode() << '\n';
        }
        return 0;
    }
    

    编译时记得链接经典协议对应的库,链接参数参考:-lmysqlcppconn(不要链接mysqlcppconn8,那个是X DevAPI的库)。

  • 方案2:坚持使用X DevAPI连接
    如果你确实需要用X协议的特性,先做三个配置:

    1. 登录阿里云RDS控制台,在参数设置里开启X Plugin,将mysqlx_port设置为33060,重启实例生效
    2. 在RDS白名单里添加你当前机器的出口公网IP,同时确认实例所在安全组放通33060端口的入方向流量
    3. 把代码里的HOST改成公网域名rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com,PORT保留33060即可
  • 连通性前置校验(必做,避免反复调代码浪费时间)
    跑代码之前先在Linux命令行用端口检测工具确认目标端口可达,不要上来就调试代码:

    • 校验经典协议3306端口:nc -zv rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com 3306,返回succeeded标识端口连通
    • 校验X协议33060端口:nc -zv rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com 33060
      端口不通的话优先查白名单、安全组、实例监听配置,和代码无关。
额外注意事项
  • 你问题里写的命令行连接命令mysql - h xxx - root -p参数格式有误,正确写法是mysql -h <主机地址> -u root -p,-u参数后才是用户名,你之前能连上应该是实际输入时参数是正确的,注意后续不要写错参数。
  • 不要在公网环境使用RDS内网地址连接,内网地址仅在同VPC环境下可用。
  • 确认root账号已被授权从你当前的公网IP访问,且拥有demo库的对应操作权限。

内容的提问来源于stack exchange,提问作者Driver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:57:21