почему mysql отказывается от локальных подключений - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь использовать (немного более старую версию) коннектор MySQL C ++ (см. Здесь) , чтобы открыть соединение с базой данных и записать в нее материал. Мой код работает на моем локальном ноутбуке Ubuntu 18.04. Тем не менее, он не работает на моем удаленном сервере (той же ОС).

Я попытался подключиться к 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)

Сервер и ноутбук используют одну и ту же ОС и один и тот же компилятор g++, почти все файлы одинаковы (за исключением одной или двух вещей, которые я изменил для отображения разных путей)и иметь базы данных, настроенные таким же образом. Я думал, что это могла быть какая-то проблема с файлом конфигурации .

Возможно ли, что я мог испортить установку mysqlcppconn? Я установил его довольно схематично - я вручную переместил заголовки в /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;
}

Вот файл makefile:

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

1 Ответ

0 голосов
/ 25 октября 2019

Я был прав, что код был "в порядке". Я исправил это, переустановив mysqlcppconnector. Вместо того, чтобы использовать 1.1.12, я переустанавливал последнюю версию. Кроме того, я не устанавливал вручную, копируя файлы, я установил с

sudo apt-get install libmysqlcppconn-dev

. Не знаю, совпадение ли это, но я также заметил, что нажал «Поиск предыдущих версий GA»? "на страница загрузки больше не перенаправляет вас на версию 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';

Надеюсь, это поможет кому-то еще - это было странноодин.

...