X DevAPI mysqlx::Session() 通过 linux 套接字失败并显示“CDK 错误:意外消息”

问题描述

我已经 (3) 新安装了 MysqL,(4) 新安装了 Connector/C++ 8.0 X DevAPI,(5) 在 my.cnf 中做了最少的配置,(1) 编写了一个最小的 C++ 程序,(2) 构建它,并在执行后给出了以下输出

$ sudo bin/sql
[sudo] password for xxxxxx: 
CDK Error: unexpected message

但是当我使用 MysqL 时它连接正常:

$ sudo MysqL --socket /var/run/MysqLd/MysqLd.sock -u root
<…>
Server version: 8.0.22 MysqL Community Server – GPL
<…>
MysqL>

在我的想象中,我的最小 C++ 程序与 MysqL 客户端应用程序所做的相同,但显然不是。我在这里做错了什么? 以下是我在开场白中提到的一些细节。

(1) 最小的 C++ 程序:

#include <iostream>
#include <stdexcept>
#include <MysqLx/xdevapi.h>

int main()
{
  try
  {
      MysqLx::Session sess("MysqLx://root@%2Fvar%2Frun%2FMysqLd%2FMysqLd.sock");
  }
  catch(std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }
}

(2) 构建:

g++ -std=gnu++17 -I/usr/include/MysqL-cppconn-8 sql.cpp -lstdc++fs  -lMysqLcppconn8 -o bin/sql
chmod u+x bin/sql

(3) 我已经安装了 MysqL:

<download from  https://dev.MysqL.com/downloads/repo/apt/>
$ sudo dpkg -i ~/Downloads/MysqL-apt-config_0.8.16-1_all.deb
$ sudo apt-get update
$ sudo apt-get install MysqL-server
<leave pwd blank>
$ systemctl status MysqL
<active (running)>
$ MysqL -V
MysqL  Ver 8.0.22 for Linux on x86_64 (MysqL Community Server - GPL)

(4) 已安装的 Connector/C++ 8.0 X DevAPI(当我没记错的时候)

<download from  https://dev.MysqL.com/downloads/connector/cpp/>
<chose Ubuntu Linux>
<Chose Ubuntu Linux 20.04 (x86,64-bit)
<downloaded libMysqLcppconn8-2_8.0.22-1ubuntu20.04_amd64.deb>
$ sudo dpkg -i ~/Downloads/libMysqLcppconn8-2_8.0.22-1ubuntu20.04_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libMysqLcppconn8-2
<downloaded libMysqLcppconn8-2-dbgsym_8.0.22-1ubuntu20.04_amd64.deb>
$ sudo dpkg -i ~/Downloads/libMysqLcppconn8-2-dbgsym_8.0.22-1ubuntu20.04_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libMysqLcppconn8-2-dbgsym
<downloaded libMysqLcppconn-dev_8.0.22-1ubuntu20.04_amd64.deb>
$ sudo dpkg -i ~/Downloads/libMysqLcppconn-dev_8.0.22-1ubuntu20.04_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libMysqLcppconn-dev
<downloaded libMysqLcppconn7_8.0.22-1ubuntu20.04_amd64.deb>
$ sudo dpkg -i ~/Downloads/libMysqLcppconn7_8.0.22-1ubuntu20.04_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libMysqLcppconn7
<downloaded libMysqLcppconn7-dbgsym_8.0.22-1ubuntu20.04_amd64.deb>
$ sudo dpkg -i ~/Downloads/libMysqLcppconn7-dbgsym_8.0.22-1ubuntu20.04_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libMysqLcppconn7-dbgsym

(5) 配置my.cnf并添加[client]和socket

$ sudo vi /etc/MysqL/my.cnf
# MERCHANTABILITY or fitness FOR A PARTIculaR PURPOSE.  See the
<…>
#
!includedir /etc/MysqL/conf.d/
!includedir /etc/MysqL/MysqL.conf.d/

[client]
socket      = /var/run/MysqLd/MysqLd.sock
<save>
$ systemctl stop MysqL
$ systemctl start MysqL
$ systemctl status MysqL
<active (running)>

解决方法

让我以食谱的形式回答我自己的问题,如何让最小程序从头开始工作。数字是指问题中的数字。

(3)安装mysql:

<download from  https://dev.mysql.com/downloads/repo/apt/>
$ sudo dpkg -i ~/Downloads/mysql-apt-config_0.8.16-1_all.deb
$ sudo apt-get update
$ sudo apt-get install mysql-server
<leave pwd blank>
$ systemctl status mysql
<active (running)>
$ mysql -V
mysql  Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL)

(4) 安装 Connector/C++ 8.0 X DevAPI(在我的例子中是 Ubuntu Linux 20.04)

<download from  https://dev.mysql.com/downloads/connector/cpp/>
<chose Ubuntu Linux>
<Chose Ubuntu Linux 20.04 (x86,64-bit)
<downloaded libmysqlcppconn8-2_8.0.22-1ubuntu20.04_amd64.deb>
<downloaded libmysqlcppconn8-2-dbgsym_8.0.22-1ubuntu20.04_amd64.deb>
<downloaded libmysqlcppconn-dev_8.0.22-1ubuntu20.04_amd64.deb>
<downloaded libmysqlcppconn7_8.0.22-1ubuntu20.04_amd64.deb>
<downloaded libmysqlcppconn7-dbgsym_8.0.22-1ubuntu20.04_amd64.deb>
$ sudo dpkg -i ~/Downloads/libmysqlcppconn8-2_8.0.22-1ubuntu20.04_amd64.deb
$ sudo dpkg -i ~/Downloads/libmysqlcppconn8-2-dbgsym_8.0.22-1ubuntu20.04_amd64.deb
$ sudo dpkg -i ~/Downloads/libmysqlcppconn-dev_8.0.22-1ubuntu20.04_amd64.deb
$ sudo dpkg -i ~/Downloads/libmysqlcppconn7_8.0.22-1ubuntu20.04_amd64.deb
$ sudo dpkg -i ~/Downloads/libmysqlcppconn7-dbgsym_8.0.22-1ubuntu20.04_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libmysqlcppconn8-2
$ sudo apt-get install libmysqlcppconn8-2-dbgsym
$ sudo apt-get install libmysqlcppconn-dev
$ sudo apt-get install libmysqlcppconn7
$ sudo apt-get install libmysqlcppconn7-dbgsym

(5) 配置my.cnf并添加[client]和socket

(5) my.cnf不要改,不需要

(+) 创建一个拥有所有权限的用户并检查socket路径

$ sudo mysql -u root
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'user'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> show variables like 'mysqlx_socket';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| mysqlx_socket | /var/run/mysqld/mysqlx.sock |
+---------------+-----------------------------+
1 row in set (0.00 sec)
mysql> exit
<check:>
$ sudo mysql -u user -p
<first password is sudo password>
<second pass is sql password for user>
mysql> exit

(1) 编写最小的 C++ 程序 (sql.cpp)。将上面 mysqlx_socket 中的所有 '/' 替换为 '%2F':

#include <iostream>
#include <stdexcept>
#include <mysqlx/xdevapi.h>

int main()
{
  try
  {
      // wrong: mysqlx::Session sess("mysqlx://root@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock"); replace d by x
      mysqlx::Session sess("mysqlx://user:password@%2Fvar%2Frun%2Fmysqld%2Fmysqlx.sock");
  }
  catch(std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }
}

(2) 构建:

g++ -std=gnu++17 -I/usr/include/mysql-cppconn-8 sql.cpp -lstdc++fs  -lmysqlcppconn8 -o sql
chmod u+x sql

(+) 执行它应该不会导致任何异常:

$ ./sql
$