为什么 mysql 拒绝本地连接
why is mysql refusing local connections
我正在尝试使用 MySQL C++ 连接器 (see here)(稍旧的版本)打开与数据库的连接并向其中写入内容。我的代码适用于我本地的 Ubuntu 18.04 笔记本电脑。但是,它在我的远程服务器上不起作用(相同 OS)。
我尝试连接到 tcp://localhost:3306
、tcp://127.0.0.1:3306
以及其他几个端口。我收到的错误是
terminate called after throwing an instance of 'sql::SQLException'
what(): Unknown MySQL server host 'tcp' (2)
服务器和笔记本电脑共享相同的 OS 和相同的 g++
编译器,几乎所有相同的文件(除了一两个我改变以反映不同路径的东西),并且有数据库以相同的方式设置。 I was thinking that it could've been some sort of config file issue.
有没有可能我搞砸了 mysqlcppconn 安装?我以一种非常粗略的方式安装它——我手动将 headers 移动到 /usr/include/
并将共享库手动移动到 /usr/lib/x86_64-linux-gnu/
。当您看到 lib/
文件夹中的文件时
libcrypto.so libmysqlcppconn-static.a libmysqlcppconn.so.7 libssl.so
libcrypto.so.1.0.0 libmysqlcppconn.so libmysqlcppconn.so.7.1.1.12 libssl.so.1.0.0
你会注意到那里有一些 libcrypto
和 libssl
的东西——我没有把它们移进去。
此外,当我尝试将 ip 地址字符串更改为硬编码字符串文字时,我记得看到了一个 std::bad_alloc
错误,并且 google 向我展示了一些提示它与不同的编译器版本...
有人知道这是怎么回事吗?这是相关的 c++ 代码,但就像我说的,它可以在我的笔记本电脑上运行,所以我很确定这不是问题所在:
MarketHistoryWriter::MarketHistoryWriter(
const MySqlConfig& msql_config,
unsigned num_symbols,
const std::string& table_name,
bool printing)
: m_msql_config(msql_config), m_table_name(table_name), m_num_sym(num_symbols), m_printing(printing)
{
// configure driver and connection
m_driver = get_driver_instance();
std::string conn_str = "tcp://"
+ m_msql_config.host + ":"
+ std::to_string(m_msql_config.port);
m_conn = m_driver->connect(conn_str,
m_msql_config.credentials.username,
m_msql_config.credentials.password);
m_conn->setSchema(m_msql_config.schema);
}
此外,如果有帮助,这里是 gdb
:
产生的回溯
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff6834801 in __GI_abort () at abort.c:79
#2 0x00007ffff70a8957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff70aeab6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007ffff70aeaf1 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007ffff70aed24 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007ffff7638a4a in sql::mysql::MySQL_Connection::init (this=this@entry=0x555555818a00,
properties=std::map with 3 elements = {...})
at /export/home/pb2/build/sb_0-32258110-1547655664.03/mysql-connector-c++-1.1.12/driver/mysql_connection.cpp:900
#7 0x00007ffff763b5ea in sql::mysql::MySQL_Connection::MySQL_Connection (this=0x555555818a00,
_driver=<optimized out>, _proxy=..., hostName=..., userName=..., password=...)
at /export/home/pb2/build/sb_0-32258110-1547655664.03/mysql-connector-c++-1.1.12/driver/mysql_connection.cpp:146
#8 0x00007ffff763fc4f in sql::mysql::MySQL_Driver::connect (this=0x5555557fa5c0, hostName=...,
userName=..., password=...)
at /export/home/pb2/build/sb_0-32258110-1547655664.03/mysql-connector-c++-1.1.12/driver/mysql_driver.cpp:132
#9 0x00005555555b8c6e in MarketHistoryWriter::MarketHistoryWriter(MySqlConfig const&, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) ()
#10 0x000055555559fccd in TestCppClient::TestCppClient() ()
#11 0x000055555559c451 in main ()
编辑:一个更小、更可重现的示例。
我 运行 下面这个短程序,我得到这个错误
root@ubuntu-s-1vcpu-1gb-nyc1-01:~/test_mysql_conn# ./main
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
这是程序
#include <stdlib.h>
#include <iostream>
#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
using namespace std;
int main(void)
{
try {
sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "secretpassword");
//con->setSchema("ib");
delete con;
} catch (sql::SQLException &e) {
cout << "# ERR: SQLException in " << __FILE__;
cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
cout << "# ERR: " << e.what();
cout << " (MySQL error code: " << e.getErrorCode();
cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
这是生成文件:
CXXFLAGS=-pthread -Wall -Wno-switch -std=c++11
LDFLAGS=-lmysqlcppconn
INCLUDES=-I/usr/include/cppconn
TARGET=main
$(TARGET):
$(CXX) $(CXXFLAGS) $(INCLUDES) ./*.cpp -o$(TARGET) $(LDFLAGS)
clean:
rm -f $(TARGET) *.o
代码是正确的 "fine." 我通过重新安装 mysqlcppconnector 解决了这个问题。我没有使用 1.1.12,而是重新安装了最新版本。另外,我没有通过手动复制文件来安装,我安装了
sudo apt-get install libmysqlcppconn-dev
我不知道这是不是巧合,但我也注意到在 the download page 处单击 "Looking for previous GA versions?" 不会再将您重定向到版本 1.1.12——它会引导您到 1.1.13。
在此之后的程序 运行。这个问题无关紧要,但它给了我
Access Denied for User 'root'@'localhost'
错误。我通过输入 SELECT user,authentication_string,plugin,host FROM mysql.user;
检查了权限,发现 localhost 没有 mysql_native_password 权限(只有 auth_socket),所以我通过
更改了它
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret_password_here';
希望这对其他人有帮助——这是一个很好的运行ge。
我正在尝试使用 MySQL C++ 连接器 (see here)(稍旧的版本)打开与数据库的连接并向其中写入内容。我的代码适用于我本地的 Ubuntu 18.04 笔记本电脑。但是,它在我的远程服务器上不起作用(相同 OS)。
我尝试连接到 tcp://localhost:3306
、tcp://127.0.0.1:3306
以及其他几个端口。我收到的错误是
terminate called after throwing an instance of 'sql::SQLException'
what(): Unknown MySQL server host 'tcp' (2)
服务器和笔记本电脑共享相同的 OS 和相同的 g++
编译器,几乎所有相同的文件(除了一两个我改变以反映不同路径的东西),并且有数据库以相同的方式设置。 I was thinking that it could've been some sort of config file issue.
有没有可能我搞砸了 mysqlcppconn 安装?我以一种非常粗略的方式安装它——我手动将 headers 移动到 /usr/include/
并将共享库手动移动到 /usr/lib/x86_64-linux-gnu/
。当您看到 lib/
文件夹中的文件时
libcrypto.so libmysqlcppconn-static.a libmysqlcppconn.so.7 libssl.so
libcrypto.so.1.0.0 libmysqlcppconn.so libmysqlcppconn.so.7.1.1.12 libssl.so.1.0.0
你会注意到那里有一些 libcrypto
和 libssl
的东西——我没有把它们移进去。
此外,当我尝试将 ip 地址字符串更改为硬编码字符串文字时,我记得看到了一个 std::bad_alloc
错误,并且 google 向我展示了一些提示它与不同的编译器版本...
有人知道这是怎么回事吗?这是相关的 c++ 代码,但就像我说的,它可以在我的笔记本电脑上运行,所以我很确定这不是问题所在:
MarketHistoryWriter::MarketHistoryWriter(
const MySqlConfig& msql_config,
unsigned num_symbols,
const std::string& table_name,
bool printing)
: m_msql_config(msql_config), m_table_name(table_name), m_num_sym(num_symbols), m_printing(printing)
{
// configure driver and connection
m_driver = get_driver_instance();
std::string conn_str = "tcp://"
+ m_msql_config.host + ":"
+ std::to_string(m_msql_config.port);
m_conn = m_driver->connect(conn_str,
m_msql_config.credentials.username,
m_msql_config.credentials.password);
m_conn->setSchema(m_msql_config.schema);
}
此外,如果有帮助,这里是 gdb
:
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff6834801 in __GI_abort () at abort.c:79
#2 0x00007ffff70a8957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff70aeab6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007ffff70aeaf1 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007ffff70aed24 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007ffff7638a4a in sql::mysql::MySQL_Connection::init (this=this@entry=0x555555818a00,
properties=std::map with 3 elements = {...})
at /export/home/pb2/build/sb_0-32258110-1547655664.03/mysql-connector-c++-1.1.12/driver/mysql_connection.cpp:900
#7 0x00007ffff763b5ea in sql::mysql::MySQL_Connection::MySQL_Connection (this=0x555555818a00,
_driver=<optimized out>, _proxy=..., hostName=..., userName=..., password=...)
at /export/home/pb2/build/sb_0-32258110-1547655664.03/mysql-connector-c++-1.1.12/driver/mysql_connection.cpp:146
#8 0x00007ffff763fc4f in sql::mysql::MySQL_Driver::connect (this=0x5555557fa5c0, hostName=...,
userName=..., password=...)
at /export/home/pb2/build/sb_0-32258110-1547655664.03/mysql-connector-c++-1.1.12/driver/mysql_driver.cpp:132
#9 0x00005555555b8c6e in MarketHistoryWriter::MarketHistoryWriter(MySqlConfig const&, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) ()
#10 0x000055555559fccd in TestCppClient::TestCppClient() ()
#11 0x000055555559c451 in main ()
编辑:一个更小、更可重现的示例。
我 运行 下面这个短程序,我得到这个错误
root@ubuntu-s-1vcpu-1gb-nyc1-01:~/test_mysql_conn# ./main
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
这是程序
#include <stdlib.h>
#include <iostream>
#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
using namespace std;
int main(void)
{
try {
sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "secretpassword");
//con->setSchema("ib");
delete con;
} catch (sql::SQLException &e) {
cout << "# ERR: SQLException in " << __FILE__;
cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
cout << "# ERR: " << e.what();
cout << " (MySQL error code: " << e.getErrorCode();
cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
这是生成文件:
CXXFLAGS=-pthread -Wall -Wno-switch -std=c++11
LDFLAGS=-lmysqlcppconn
INCLUDES=-I/usr/include/cppconn
TARGET=main
$(TARGET):
$(CXX) $(CXXFLAGS) $(INCLUDES) ./*.cpp -o$(TARGET) $(LDFLAGS)
clean:
rm -f $(TARGET) *.o
代码是正确的 "fine." 我通过重新安装 mysqlcppconnector 解决了这个问题。我没有使用 1.1.12,而是重新安装了最新版本。另外,我没有通过手动复制文件来安装,我安装了
sudo apt-get install libmysqlcppconn-dev
我不知道这是不是巧合,但我也注意到在 the download page 处单击 "Looking for previous GA versions?" 不会再将您重定向到版本 1.1.12——它会引导您到 1.1.13。
在此之后的程序 运行。这个问题无关紧要,但它给了我
Access Denied for User 'root'@'localhost'
错误。我通过输入 SELECT user,authentication_string,plugin,host FROM mysql.user;
检查了权限,发现 localhost 没有 mysql_native_password 权限(只有 auth_socket),所以我通过
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret_password_here';
希望这对其他人有帮助——这是一个很好的运行ge。