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协议的特性,先做三个配置:- 登录阿里云RDS控制台,在参数设置里开启X Plugin,将
mysqlx_port设置为33060,重启实例生效 - 在RDS白名单里添加你当前机器的出口公网IP,同时确认实例所在安全组放通33060端口的入方向流量
- 把代码里的HOST改成公网域名
rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com,PORT保留33060即可
- 登录阿里云RDS控制台,在参数设置里开启X Plugin,将
连通性前置校验(必做,避免反复调代码浪费时间)
跑代码之前先在Linux命令行用端口检测工具确认目标端口可达,不要上来就调试代码:- 校验经典协议3306端口:
nc -zv rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com 3306,返回succeeded标识端口连通 - 校验X协议33060端口:
nc -zv rm-bp1qp1x588kzb49rf.mysql.rds.aliyuncs.com 33060
端口不通的话优先查白名单、安全组、实例监听配置,和代码无关。
- 校验经典协议3306端口:
额外注意事项
- 你问题里写的命令行连接命令
mysql - h xxx - root -p参数格式有误,正确写法是mysql -h <主机地址> -u root -p,-u参数后才是用户名,你之前能连上应该是实际输入时参数是正确的,注意后续不要写错参数。 - 不要在公网环境使用RDS内网地址连接,内网地址仅在同VPC环境下可用。
- 确认root账号已被授权从你当前的公网IP访问,且拥有demo库的对应操作权限。
内容的提问来源于stack exchange,提问作者Driver
相关产品推荐
相关产品推荐

