将MySQL 3.23与pyodbc 3.07连接

将MySQL 3.23与pyodbc 3.07连接,mysql,mariadb,pyodbc,unixodbc,Mysql,Mariadb,Pyodbc,Unixodbc,我正在尝试从一个使用UnixODBC和pyodbc 3.07的Ubuntu16客户端连接到一个旧的MySQL 3.23服务器。我已经尝试了三(3)个版本的MySQL连接器/ODBC和两(2)个来自MariaDB的版本: MySQL ODBC 5.3.9仅支持新的MySQL身份验证方法。因此它无法连接 MySQL ODBC 5.1.13有一个用于身份验证方法的开关,但在pyodbc.connect(dsn)上告诉我:[MySQL][ODBC 5.1驱动程序]不支持4.1.1下的服务器版本 MySQ

我正在尝试从一个使用UnixODBC和pyodbc 3.07的Ubuntu16客户端连接到一个旧的MySQL 3.23服务器。我已经尝试了三(3)个版本的MySQL连接器/ODBC和两(2)个来自MariaDB的版本:

MySQL ODBC 5.3.9仅支持新的MySQL身份验证方法。因此它无法连接

MySQL ODBC 5.1.13有一个用于身份验证方法的开关,但在
pyodbc.connect(dsn)
上告诉我:
[MySQL][ODBC 5.1驱动程序]不支持4.1.1下的服务器版本

MySQL ODBC 3.51存在两个问题:

  • 由于pyodbc将自动提交设置为默认值,因此未启用事务(4000)(SqlSetConnectAttr(SQL\u ATTR\u AUTOCOMMIT)),[MySQL][ODBC 3.51驱动程序]失败
  • 当我连接到
    pyodbc.connect(dsn,autocommit=True)
    时,给我一个连接。连接给了我一个游标,但所有游标都是。execute(sql)抛出异常
    ('HY000','驱动程序没有提供错误!')
  • 通过
    isql-v[dsn]
    从shell测试与isql的连接给了我一个会话,但在所有语句上都失败,出现
    [isql]错误:无法SQLExecute
    。所以这似乎是一个unixodbc问题

    我安装了mysql客户端。但是程序mysql无法连接服务器

    mariadb客户端可以连接到数据库,甚至可以执行语句。这看起来更有希望

    我下载了MariaDB ODBC驱动程序3.0.2。将该驱动程序与isql一起使用会返回错误:
    [S1000][unixODBC][ma-3.0.2]无法加载Plugin old_密码:lib/mariadb/Plugin/old_password.so:无法打开共享对象文件:没有此类文件或目录
    。这是一个可以接受的回应。有一个ODBC选项PLUGIN_DIR,但我不知道从哪里可以得到这个插件

    MariaDB ODBC驱动程序2.0.13提供了
    ('HY000',“[HY000][unixODBC][ma-2.0.13]您的SQL语法在第1行(1064)(SQLDriverConnect)的'SQL_AUTO_IS_NULL=0'附近有错误)
    。因为似乎没有改变这一点的选择。这里死了

    我想知道是否有办法通过unixodbc/pyodbc访问这个旧的MySql

    或者有人知道从哪里获取插件的旧密码吗


    通过apt get安装的mariadb客户端可以连接,因此必须有一种方法。

    我花了一天左右的时间研究这个问题,我认为如果不对驱动程序代码进行重大修改,或者为旧版本创建构建环境极其困难,就不可能实现

    我把这个问题写进了一个答案中,这样其他人就不会像我一样掉进兔子洞里(或者,更好的是,这样其他人就可以从我停下来的地方开始,并真正解决问题!)…但这不适合发表评论

    这将是一本有点大的书,对不起

    概述 我能够使用一对Ubuntu 16.04容器、Oracle提供的容器、您提到的所有客户端库以及其他一些容器来重现您在文章中提到的每个错误条件(感谢您提出了一个全面而出色的问题!)

    下面是我在你提到的每个地方寻找额外解决方案时发现的,然后是一些“下一步”——键入信息和一些关于故事道德的说教

    所有这些测试都是使用最新版本的Python2、UnixODBC和
    pyodbc
    (通过
    pip
    )进行的,从2017年11月26日起,这三个版本都适用于库存Ubuntu 16.04 Docker容器

    所有使用的URL都是链接的,但是,如果历史有任何迹象的话,它们可能会随着时间的推移而消亡,考虑到这种软件的很多都快二十年了。如果您愿意,我也很乐意发布我的任何/所有shellscripts/DockerFile/modified driver源代码;只是在评论中给我打电话

    旧_password.so和MariaDB连接器/ODBC 3.0.2 您是对的,这是最有潜力的故障排除选项。以下是我所做的:

    首先,我安装了二进制文件并试图通过Python连接到它。在为名为“maria”的数据源配置ODBC
    .ini
    文件后,我遇到了与您相同的错误,即:

    当MySQL服务器宣布一个足够旧的身份验证协议时,ODBC代码试图加载为该服务器构建的编译插件
    strace
    ing ODBC连接尝试的输出确定了这一点

    旧密码。因此
    原来是Connector/C MariaDB驱动程序的一个组件,但不是该驱动程序二进制版本中包含的库。有趣

    原来Connector/C驱动程序的源代码中包含了一系列类似于旧密码的插件模块。我下载了,并打开了文档、源代码和那些“auth”类型插件的构建系统,这些插件作为
    文件分发,以查看我能找到什么

    我发现Connector/C的各种组件可以编译为“静态”链接到主驱动程序库的插件,也可以编译为动态库本身。我用引号说“静态”,因为C驱动程序的构建过程创建了
    mariadbclient
    的静态(
    .a
    )和动态(
    .so
    )版本,但是如果特定插件在构建系统中声明为静态,那么该插件的代码将静态地包含在这两个
    mariadbclient
    工件中

    old_password.so
    文件的源文件似乎位于
    plugins/auth/old_password.c
    的单个小源文件中

    似乎可以更改构建系统(CMake),为
    old_password
    插件生成一个动态库。在Connector/C源代码中有一个
    cmake/plugins.cmake
    文件,它充当所有插件的“注册表”。它包含一个cmake宏
    REGISTER\u插件> pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin')
    pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: lib/mariadb/plugin/old_password.so: cannot open shared object file: No such file or directory (2059) (SQLDriverConnect)')
    
    REGISTER_PLUGIN("AUTH_OLDPASSWORD" "${CC_SOURCE_DIR}/plugins/auth/old_password.c" "old_password_client_plugin" "STATIC" "" 0)
    
    REGISTER_PLUGIN("AUTH_OLDPASSWORD" "${CC_SOURCE_DIR}/plugins/auth/old_password.c" "old_password_client_plugin" "DYNAMIC" "old_password" 1)
    
    conn = pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin;PLUGIN_DIR=/home/mysql/zclient/mdb-c/plugins/auth')
    pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: /home/mysql/zclient/mdb-c/plugins/auth/old_password.so: undefined symbol: ma_scramble_323 (2059) (SQLDriverConnect)')
    
    pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: name mismatch (2059) (SQLDriverConnect)')
    
    conn = pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin;PLUGIN_DIR=/home/mysql/zclient/mdb-c/plugins/auth')
    pyodbc.Error: ('HY000', u"[HY000] [unixODBC][ma-3.0.2]Access denied for user: 'admin@hostname' (Using password: NO) (1045) (SQLDriverConnect)")
    
    pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Error in server handshake (2012) (SQLDriverConnect)')
    
    ln -s /usr/bin/mariadb_config mysql_config
    pip install MySQL-python