0

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

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

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

并得到一个错误说Access denied for user 'root'@'localhost' (using password: NO)

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

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

4

3 回答 3

0

您是否将 MySQL 安装在与 MemSQL 相同的机器上?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") 有效吗?

于 2017-05-23T15:45:47.733 回答
0

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

但是,在再次阅读文档后,发现可以将套接字的路径作为主机名传递。所以我通过了MemSQL's 套接字路径并且它起作用了!

于 2017-05-31T06:25:26.943 回答
0

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

好像当 SQLAPI 发现服务器在本地主机上运行时,它直接进入套接字文件,不幸的是它总是进入 MySQL 的套接字文件,即 /var/lib/mysql/mysql.sock

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

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);
于 2018-05-31T16:30:17.290 回答