连接拒绝来自C ++驱动程序的mysql数据库

时间:2017-09-08 17:48:19

标签: c++ mysql database-connection

问题

我正在关注dev.mysql提供的Connect / C ++教程。在复制示例并成功编译并链接它之后,我遇到了以下问题:

  

在抛出'sql :: SQLException'

的实例后终止调用      

what():无法连接到'127.0.0.1'(111)

上的MySQL服务器

据我所知111代表权限被拒绝。

设置

以下是取自here并略有修改的示例代码:

#include <mysql_driver.h>

int main()
{
    auto driver = sql::mysql::get_mysql_driver_instance();
    auto con = driver->connect("tcp://127.0.0.1:0", "root", "123");

    delete con;
}

尝试使用tcp://127.0.0.1:3306会得到相同的结果。

这是CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
project(mysql_try)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp)
add_executable(mysql_try ${SOURCE_FILES})

target_include_directories(mysql_try PUBLIC /usr/local/include/mysql++)
target_link_libraries(mysql_try mysqlclient /usr/local/lib/libmysqlcppconn-static.a pthread dl)

我可以使用代码中的凭据轻松运行mysql。我禁用了网络,因此它只能在localhost上收听。正在运行

mysql> SHOW GLOBAL VARIABLES LIKE 'PORT';

给了我0,所以我猜它是0号端口。

C连接器和命令行界面工作正常。

我的操作系统是ubuntu 16.04。

1 个答案:

答案 0 :(得分:2)

  

我禁用了网络,因此它只能侦听localhost。

在一起禁用网络(tcp)和指定tcp仅在您的环回适配器(127.0.0.1)上侦听之间存在区别。你的mysql客户端几乎肯定是通过Unix Socket连接,而不是TCP连接,这就是为什么工作正常。通过运行mysql --protocol tcp来验证。如果失败,那么您知道您一起禁用了TCP连接,并且它通过Unix Socket连接。

  

连接(&#34; TCP://127.0.0.1:0&#34;

如果您确实禁用了skip-networking网络,则需要更改connect()以引用您的套接字文件。见the docs

  

UNIX://路径名

     

此URL格式允许使用Unix域套接字文件连接到Unix和类Unix系统上的本地主机。 path_name值是套接字文件路径名,就像MySQL客户端的--socket选项一样,例如在Unix上运行的mysql和mysqladmin(请参阅连接到MySQL服务器)。

使用以下命令查找您的套接字:

  

的MySQL&GT;显示全球变量类似于&#39; socket&#39;

如果您想保持连接字符串不变,请删除skip-networking,然后添加
bind-address = 127.0.0.1

那应该解决它!