Я пытаюсь подключиться к MemSQL
база данных из c++
код и я использую SQLApi++
библиотека. MySQL
клиент совместим с MemSQL
а также SQLApi++
имеет поддержку MySQL
, Однако я не могу подключиться и получить другие ошибки.
Например, я звоню подключиться со следующими параметрами
Connect("tcp://localhost:3307", "root", "", SA_MySQL_Client)
и получить сообщение об ошибке Access denied for user 'root'@'localhost' (using password: NO)
,
Я искал в Интернете и пробовал несколько версий указания имени хоста БД, однако ни одна из них не сработала. Что я делаю неправильно? Какая версия правильная? Есть идеи?
ПРИМЕЧАНИЕ: я могу успешно подключиться к MemSQL
с командной строкой, просто выполнив
memsql -P 3307
,
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»)?
Когда я предоставил локальный IP-адрес и порт, по какой-то причине SQLApi++
игнорировал его и всегда пытался подключиться к MySQL
сокет в пути по умолчанию (т.е. /var/lib/mysql/mysql.sock
).
Однако после прочтения документация еще раз выяснилось, что в качестве имени хоста можно передать путь сокета. Итак, я прошел MemSQL
Путь к сокету и все заработало!
Я столкнулся с той же проблемой, и Наброян уже упомянул одно решение. Просто предоставив некоторые детали и добавив еще одно возможное решение.
Похоже, когда SQLAPI выясняет, что сервер работает на локальном хосте, он переходит непосредственно к файлу сокета и, к сожалению, всегда идет к файлу сокета MySQL, т.е. /var/lib/mysql/mysql.sock
Теперь здесь может быть два возможных решения:
1- Обновите ваш экземпляр MemSQL, чтобы использовать тот же файл сокета, что и в MySQL (это может быть только выбор, если вы не используете MySQL на том же компьютере)
(сам не тестировал, поэтому, может быть, пропустил некоторые шаги здесь) Вы можете сделать это, обновив значение «socket» в файле memsql.cnf, так что оно должно выглядеть так:
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);