无法通过 SQLApi++ 连接到 MemSQL

Cannot connect to MemSQL through SQLApi++

我正在尝试从 c++ 代码连接到 MemSQL 数据库,并且我正在使用 SQLApi++ 库。 MySQL 客户端与 MemSQL 兼容并且 SQLApi++ 支持 MySQL。但是我无法连接并出现不同的错误。

例如,我使用以下参数调用连接

Connect("tcp://localhost:3307", "root", "", SA_MySQL_Client)

并收到一条错误消息 Access denied for user 'root'@'localhost' (using password: NO)

我在互联网上搜索并尝试了指定数据库主机名的多个版本,但是没有一个有效。我究竟做错了什么?什么是正确的版本?有什么想法吗?

注意:我可以通过命令行成功连接到 MemSQL,只需执行 memsql -P 3307.

您是否在与 MemSQL 相同的机器上安装了 MySQL?在某些客户端中,localhost 可以重定向到 MySQL,但 127.0.0.1 不会(参见 https://docs.memsql.com/v5.7/docs/how-to-connect-to-memsql

Connect("tcp://127.0.0.1:3307", "root", "", "SA_MySQL_Client") 有效吗?

当我提供本地 IP 地址和端口时,出于某种原因 SQLApi++ 忽略了它并始终尝试连接到默认路径中的 MySQL 套接字(即 /var/lib/mysql/mysql.sock)。

然而,在再次阅读documentation之后,发现可以将套接字的路径作为主机名传递。所以我传递了 MemSQL 的套接字路径,它起作用了!

我遇到了同样的问题,nabroyan 已经提到了一种解决方案。只是提供一些细节,并添加另一个可能的解决方案。

似乎当 SQLAPI 发现服务器在本地主机上 运行 时,它会直接转到套接字文件,不幸的是它总是转到 MySQL 的套接字文件,即/var/lib/mysql/mysql.袜子

现在这里有两种可能的解决方案:

1- 更新您的 MemSQL 实例以使用与 MySQL 相同的套接字文件(如果您不是 运行 MySQL 以及同一个盒子)

(我自己没有测试过,所以这里可能遗漏了一些步骤)你可以通过更新 memsql.cnf 文件中 "socket" 的值来做到这一点,所以它应该看起来像:

socket = /var/lib/mysql/mysql.sock

您可以使用用于确定套接字文件位置的命令找到 memsql.cnf 文件的位置,memsql.cnf 文件将位于同一目录中:

memsql -u root --password=YOUR_PASSWORD_HERE -P 3306 -e "show variables like 'socket'"

完成后,您应该重新启动 memsql:

memsql-ops memsql-restart

2- 或修改您的连接字符串以提供 MemSQL 套接字路径。

您可以使用第一个选项中提到的命令找出 memsql 套接字文件。

在我的例子中,文件是:/app/memsql/master-3306-NJG846fb0e/data/memsql.sock 所以我修改了连接调用以使用此文件:

Connect("/app/memsql/master-3306-NJG846fb0e/data/memsql.sock@", "myuser", "mypassword", SA_MySQL_Client);