【问题标题】:Cannot connect to MemSQL through SQLApi++无法通过 SQLApi++ 连接到 MemSQL
【发布时间】:2017-05-23 11:04:45
【问题描述】:

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

例如,我使用以下参数调用 connect

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

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

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

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

【问题讨论】:

    标签: c++ mysql database singlestore sqlapi++


    【解决方案1】:

    您是否将 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") 工作吗?

    【讨论】:

    • 是的,我已经安装了MySQL。我尝试过使用 IP,但它给出了同样的错误。
    • 我也更新了我的问题。我可以从命令行连接,但不能从 c++ 代码连接。
    • 查看 SqlAPI++ 的文档我认为最后一个参数是一个枚举,您将它作为字符串传递。 Connect("tcp://127.0.0.1:3307", "root", "", SA_MySQL_Client)
    • 实际上我使用SA_MySQL_Client 不带引号,这只是我的端口中的一个错字。但是,我发现无论我写什么,它都试图连接到MySQL...
    • 而且,原来SQLApi++使用libmysqlclient,通过那个lib连接MemSQL有什么额外的步骤吗?还是只提供相应的主机和端口就足够了?
    【解决方案2】:

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

    但是,在再次阅读documentation 之后,发现可以将套接字的路径作为主机名传递。所以我通过了MemSQL的套接字路径,它成功了!

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,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-02-05
        • 1970-01-01
        • 2014-08-17
        • 2022-08-03
        • 1970-01-01
        • 2017-04-25
        • 2020-05-12
        • 2018-08-13
        • 2011-06-17
        相关资源
        最近更新 更多