mysql-connector-c++-8.0.33中readDefaultFile属性失效求助
解决mysql-connector-c++ 8.0.33通过readDefaultFile读取my.cnf连接失败的问题
针对你遇到的MySQL error code: 2003连接错误,结合mysql-connector-c++ 8.x的特性,给出以下具体排查和解决步骤:
1. 确认my.cnf的配置段位置
mysql-connector-c++ 8.x默认仅读取[client]段的配置,而mysql++可能兼容读取[mysql]或其他自定义段。请确保你的socket、用户名等配置放在[client]节点下,而非其他段:
[client] socket=/var/lib/mysql/mysql.sock user=your_db_user password=your_db_pwd host=localhost
如果之前配置在[mysql]或其他段,直接移到[client]下再测试。
2. 检查配置文件的权限与路径
- 确认程序运行用户(比如你的账号、web服务账号)对
/etc/my.cnf有读取权限,执行命令验证:
权限至少要保证其他用户(或对应运行用户组)有读权限(比如ls -l /etc/my.cnf-rw-r--r--)。 - 确认代码中
readDefaultFile指定的路径完全正确,避免拼写错误(比如误写为/etc/mysql/my.cnf)。
3. 清理连接代码中的冲突属性
不要在代码中同时设置readDefaultFile和其他连接属性(比如host、user、socket),否则代码中的属性会覆盖配置文件内容,导致驱动忽略socket配置走TCP连接(触发2003错误)。正确的代码示例:
#include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/exception.h> #include <iostream> using namespace std; using namespace sql::mysql; using namespace sql; int main() { MySQL_Driver *driver; Connection *con; ConnectOptionsMap conn_props; driver = get_mysql_driver_instance(); conn_props["readDefaultFile"] = "/etc/my.cnf"; // 不要在这里额外设置host、user、socket等属性 try { con = driver->connect(conn_props); cout << "连接成功" << endl; delete con; } catch (SQLException &e) { cout << "# ERR: " << e.what() << " (MySQL error code: " << e.getErrorCode(); cout << ", SQLState: " << e.getSQLState() << " )" << endl; } return 0; }
4. 启用调试日志排查读取过程
通过设置环境变量开启驱动调试日志,查看配置文件是否被正确读取:
export MYSQL_DEBUG=d:t:O,/tmp/mysql_debug.log
运行你的程序后,打开/tmp/mysql_debug.log,搜索my.cnf或socket关键字,确认驱动是否加载到了正确的socket路径。
内容的提问来源于stack exchange,提问作者Vijaykumar Ainapur
相关产品推荐
相关产品推荐

