2017-11-17 29 views
12

UnixODBC 및 pyodbc 3.07을 사용하는 Ubuntu 16 클라이언트에서 구형 MySQL 3.23 서버에 연결하려고합니다. 나는 MySQL Connector/ODBC와 MariaDB에서 2 (3) 버전을 시도했다.pyodbc 3.07과 MySQL 3.23을 연결하십시오.

MySQL-ODBC 5.3.9 새로운 MySQL 인증 방법 만 지원한다. 따라서 연결할 수 없습니다.

MySQL을 ODBC 5.1.13 인증 방법에 대한 스위치를 가지고 있지만 pyodbc.connect(dsn)에 저에게 말한다 :

  1. [MySQL][ODBC 3.51 Driver]Transactions are not enabled (4000) (SQLSetConnnectAttr(SQL_ATTR_AUTOCOMMIT))로 실패 : [MySQL][ODBC 5.1 Driver]Driver does not support server versions under 4.1.1

    MySQL을 ODBC 3.51을 두 가지 문제를 가지고 pyodbc는 autocommit을 기본값으로 false로 설정합니다.

  2. pyodbc.connect(dsn, autocommit=True)에 연결할 때 연결이됩니다. 연결은 나에게 커서를 제공하지만 모든 cursor.execute (sql)은 예외 ('HY000', 'The driver did not supply an error!')을 던집니다. isql -v [dsn]를 통해 쉘에서 ISQL와의 연결을 테스트

나에게 세션을 제공하지만, [ISQL]ERROR: Could not SQLExecute 모든 문에 실패합니다. 그래서 이것은 unixodbc 문제인 것 같습니다.

mysql-client을 설치했습니다. 그러나 프로그램 mysql이 서버에 연결되지 않습니다.

mariadb-client은 데이터베이스에 연결하고 명령문을 실행할 수도 있습니다. 그것은 더 유망 해 보인다.

MariaDB ODBC-Driver 3.0.2을 다운로드했습니다. 해당 드라이버를 isql과 함께 사용하면 [S1000][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 오류가 반환됩니다. 그것은 하나가 해결할 수있는 응답입니다. ODBC 옵션 PLUGIN_DIR이 있지만 플러그인을 가져올 위치를 알지 못합니다.

MariaDB ODBC-Driver 2.0.13 연결시 내게 ('HY000', "[HY000] [unixODBC][ma-2.0.13]You have an error in your SQL syntax near 'SQL_AUTO_IS_NULL=0' at line 1 (1064) (SQLDriverConnect)")이 표시됩니다. 이것을 바꿀 수있는 옵션이없는 것 같습니다. 여기에서 포기하십시오.

unixodbc/pyodbc를 통해이 오래된 MySql에 액세스 할 수있는 방법이 있는지 알고 싶습니다.

아니면 누군가 MariaDB에 대한 플러그인 old_password.so를 어디에서 얻을 수 있는지 알고 있습니까?

apt-get를 통해 설치된 mariadb 클라이언트가 연결할 수 있으므로 방법이 있어야합니다.

+4

Xubuntu 16.04에서 pyodbc 4.0.21 및 MySQL Connector/ODBC 3.51.30을 MySQL 4.0.26 서버 (MySQL 4.1의 인증 변경 이전)에서 사용할 수 있었으므로 시도한 내용 * 불가능할 수는 없지만 * MySQL 3.23은 거의 17 세이므로 "팜에 내기"를하지 마십시오. –

+3

3.23 설치에서 mysqldump를 수행하여 최신 버전의 MySQL로 복원 한 다음 연결하는 것이 더 적은 작업 일 수 있습니다. 10 년이 넘는 보안 구멍을 제거하는 보너스를받을 수 있습니다! – FlipperPA

+0

@FlipperPA 둘 다 감사합니다. 불행하게도 고객이 사용하는 제품의 일부이므로 MySQL 3.23을 업그레이드 할 수있는 옵션이 없습니다. mariaDB 드라이버로 테스트를 계속했습니다. 그것은 조금 더 유망 해 보이지만 아직 성공하지 못했습니다. – jhinghaus

답변

4

나는 이것에 대해 하루 종일 파고 들었고 드라이버 코드를 크게 변경하지 않거나 이전 버전의 빌드 환경을 매우 어렵게 만들지는 않았다고 생각하지 않습니다.

나는 다른 사람들이 내가했던 것과 똑같은 토끼 구멍에 쓰러지지 않도록 이것을 대답하고있다. (더 좋은 점은 다른 사람들이 내가 그만두고 실제로 문제를 해결할 수 있도록!). .. 그리고 그것은 의견에 맞지 않았다.

이것은 약간의 이야기 일 것입니다. 미안합니다.

개요

내가 오라클에서 당신이 게시물에 (철저하고 우수 질문에 대한 감사합니다!) 16.04 용기, 우분투의 한 쌍을 사용하여 설명한 오류 조건의 각 MySQL 3.23 download 가능한을 재현 할 수 있었고, 모든

당신이 언급 한 클라이언트 라이브러리들과 몇 가지 다른 것들.

다음은 내가 언급 한 각 장소에서 추가 솔루션을 찾고 다음 단계의 몇 가지 유형 정보와 몇 가지 이야기의 도덕에 대한 개종자를 찾은 것입니다.

이 테스트는 모두 Python 2, UnixODBC 및 pyodbc (pip을 통한)의 최신 버전을 사용하여 2011 년 11 월 26 일 기준의 우분투 16.04 Docker 컨테이너에서 사용할 수있었습니다.

사용 된 모든 URL은 링크되어 있지만 이력이 표시되는 경우이 소프트웨어의 많은 부분이 20 년 전에 고착 된 것으로 간주되어 시간이 지남에 따라 사라질 수 있습니다. 원한다면 내 쉘 스크립트/Dockerfiles/수정 된 드라이버 소스를 게시 할 수도 있습니다. 그냥 코멘트에 나를 핑.

old_password.so 및 MariaDB 커넥터/ODBC 3.0.2

이 가장 가능성이있는 문제 해결 옵션이라고 옳았다. 다음은 내가 한 일입니다.

먼저 Connector/ODBC 3.0.2 바이너리를 설치하고 Python을 통해 연결하려고했습니다. 에, 나이가 인증 프로토콜을 발표

> 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)') 

는 ODBC 코드 시도, MySQL 서버되게 : 나는 당신이, 즉 "마리아"라는 이름의 데이터 소스, 내 ODBC를 .ini 파일을 구성한 후했던 것과 같은 오류를 명중 Connector/C MariaDB driver 용으로 컴파일 된 플러그인을로드하십시오. strace ODBC 연결 시도의 출력이이를 판별합니다.

old_password.so은 Connector/C MariaDB 드라이버의 구성 요소로 밝혀졌지만 해당 드라이버의 바이너리 릴리스에 포함 된 라이브러리는 아닙니다. 흥미 롭 군.

커넥터/C 드라이버의 소스에 포함 된 old_password과 유사한 많은 플러그인 모듈이 있음이 드러났습니다. Connector/C 3.0.2 sources을 다운로드하고 문서, 소스를 열어 .so 파일로 배포 된 "인증"유형 플러그인 용 시스템을 구축하여 내가 무엇을 찾을 수 있는지 확인했습니다.

Connector/C의 다양한 구성 요소가 기본 드라이버 라이브러리에 정적으로 링크 된 플러그인 또는 동적 라이브러리 자체로 컴파일 될 수 있음을 발견했습니다. C 드라이버의 빌드 프로세스가 정적 (.a)과 동적 (.so) 버전 인 mariadbclient을 생성하기 때문에 따옴표로 "고정"이라고 말하지만 특정 플러그인이 빌드 시스템에서 정적으로 선언 된 경우 해당 플러그인의 코드는 다음과 같습니다. 정적으로 모두 mariadbclient 인공물에 포함됩니다.

old_password.so 파일의 출처는 단일 작은 원본 파일 plugins/auth/old_password.c에있는 것으로 보입니다.

플러그인 (old_password)에 대한 동적 라이브러리를 생성하도록 빌드 시스템 (CMake)을 변경하는 것이 가능할 것으로 보입니다. Connector/C 소스에는 모든 플러그인의 "레지스트리"역할을하는 cmake/plugins.cmake 파일이 있습니다.여기에는 STATIC 또는 DYNAMIC 인수를 취하는 cmake 매크로 REGISTER_PLUGIN이 포함되어 있습니다. 나는 old_password에 대한 해당 파일의 검색 및 다음 줄을 발견

REGISTER_PLUGIN("AUTH_OLDPASSWORD" "${CC_SOURCE_DIR}/plugins/auth/old_password.c" "old_password_client_plugin" "STATIC" "" 0) 

유망 보았다. 자신의 플러그인에 대한 .so 파일을 생성 한 비슷한 라인의 오프 모델링, 나는 다음에 그 라인을 변경하고 빌드 실행 :

REGISTER_PLUGIN("AUTH_OLDPASSWORD" "${CC_SOURCE_DIR}/plugins/auth/old_password.c" "old_password_client_plugin" "DYNAMIC" "old_password" 1) 

빌드가 누락 의존성으로 인해 몇 번을 실패합니다. 몇 가지 -dev 패키지와 다른 도구를 설치해야했지만, 결국에는 깔끔하게 빌드 할 수있었습니다 (플러그인 만 있으면 CURL이나 OpenSSL이 필요하지 않습니다). 물론 mysql_old_password.so이라는 파일이 빌드 아티팩트로 plugins/auth 디렉토리에 만들어졌습니다. - 이제 파이썬 코드가 필요해. 여전히 lib/mariadb/plugin/old_password.so을 찾지 못하는 것에 대한 오류를 나에게주었습니다. 내 질문에 언급 한 PLUGIN_DIR 인수를 ODBC 연결 문자열에 제공하고 mysql_old_password.soold_password.so으로 컴파일하고 다음 코드를 실행했습니다. . . 새로운 오류가 발생했습니다. 진행! 컴파일 된 유물은 ma_scramble_323 함수 정의 누락, 깨진 것처럼

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)') 

보인다. 플러그인은 런타임에 동적으로로드되기 때문에 프로그램은 여전히 ​​시작되지만 플러그인을 dload에 보내면 문제가 발생합니다. 더욱이이 함수는 "이전"MySQL 프로토콜 인증 메커니즘의 주요 암호 해시 진입 점인 것처럼 보이기 때문에 그냥 뺄 수는 없습니다. 커넥터/C 소스에서 해당 함수 및 헤더 (mariadb_com.h)에 대한 선언을 찾았지만 old_password.c 소스 파일의 여러 위치에서 include ing을 사용하는 것이 트릭을 수행하지 않는 것으로 보입니다. 내 직감은 이것이 두 가지 불행한 행동의 상호 작용이라는 것입니다. 먼저, Connector/C 빌드 시스템에 의해 컴파일 된 플러그인은 이 Connector/C 플러그인 또는 이와 유사한 것으로 만 연결된다고 가정하고 설정됩니다. 즉, 플러그인 자체는 플러그인을로드 할 때 이미 사용 가능해야하기 때문에 컴파일 할 때 "일반적인"Connector/C 기능에 연결하지 않습니다. 우리가 Connector/ODBC를 사용하고 Connector/C를 사용하지 않기 때문에, 그러한 공통 기능이 없거나 액세스 할 수 없습니다. 이제 소스에서 Connector/ODBC를 빌드하려면 Connector/C가 필요하므로 올바른 기능을 포함하는 방식으로 새 Connector/ODBC 라이브러리를 컴파일 할 수는 있지만 그 토끼 구멍을 시작하지 않으려 고합니다. 둘째, 독립 실행 형 (다른 컴파일하지 말 것) 모드로 old_password 플러그인을 빌드하라는 명령을 받았을 때도 CMake의 종속성 분석은 ma_scramble_323을 설명하는 파일을 발견하거나 연결하지 않았습니다. CMake 문제일지도 모르지만, 위에서 언급 한 것처럼 빌드 시스템이이 유스 케이스를 염두에두고 구성되지 않았기 때문일 수 있습니다.

여기 아주 운이 좋았습니다. ma_scramble_323 함수는 libmariadb/ma_password.c에 정의되어 있습니다. 이는 매우 작고 간단한 소스 파일로, old_password 플러그인에 의해 아직 종속되지 않은 Connector/C 프로젝트의 다른 라이브러리에는 크게 의존하지 않습니다. 나는 "가난한 사람의 연결"(yuck)을했고 ma_scramble_323 함수의 소스를 old_password.c 파일에 복사했습니다. 그 함수는 ma_password.c 파일에서 다른 함수를 호출 했으므로이를 복사했습니다. 다시 말하지만, ma_password.c 파일이 매우 간단했기 때문에 이것은 쉬운 일이었습니다 (또는 전혀 옵션이 없었습니다). 의존성이 있거나 더 복잡했다면 문제를 "올바른"방법으로 해결하기 위해 CMake-fu를 중지하고 중단하고 배워야했습니다. 나는 이것을 할 수있는 더 좋은 방법이 있다는 것을 절대적으로 확신합니다.

(제쳐두고)이 시점에서 나는이 테스트를 자주 시도해야했던 실패한 시도가 많았 기 때문에 나의 DB 서버에서 mysqladmin flush-hosts의 정기적 인 실행을 cron해야했습니다. 이것에 대해서는 아마도 더 좋은 방법 일 것입니다. 그러나 나는 그것을 모르고 cron을 압니다.

새롭게 "인라인 된"소스를 사용하여 mysql_old_password.so 라이브러리를 컴파일하고 이름을 변경하고 테스트 스크립트를 다시 실행했습니다. 이번에는 내가 가지고 :

pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: name mismatch (2059) (SQLDriverConnect)') 

내가 ODBC 그것을 찾을 수 있도록이 (그렇지 mysql_old_password.so old_password.so을 찾고) 내가 파일의 이름을 변경 한 사실을 함께 할 수있는 뭔가가 있었다 생각. 샷건 방식을 시도했습니다. plugins/auth/CMakeLists.txt 빌드 시스템 구성에서 나는 mysql_old_password의 모든 인스턴스를 old_password으로 바꾸고 컴파일했습니다. 편집은 성공했지만 여전히 작동하지 않았습니다.

플러그인 소스 (이 경우에는 old_password.c)의 맨 위에는 이름이 발표 된 구조체 선언이 있고이 이름은 mysql_old_password으로 발표되었습니다. 이것은 기존의 문제 일 수 있습니다. (예를 들어, 이것은 전혀 효과가 없었습니다), 나는 약간의 냉기를 느끼기 시작했습니다. 아무도 만들지 않았거나 이전에 주어진 구성으로 테스트 한 코드를 만들 때, 당신의 성공 확률은 좋지 않습니다. 비용을 불문하고 소스 파일에서도 동일한 s/mysql_old_password/old_password/을 수행하고 컴파일했습니다. 이번에는 오른쪽 old_password.so이라는 이슈가 생성되었습니다. 다시 테스트 스크립트를 실행하여 다음을 얻었습니다.

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: '[email protected]' (Using password: NO) (1045) (SQLDriverConnect)") 

이것은 이상합니다. 내 클라이언트 테스트 상자에서 (시스템 라이브러리 경로가 아닌 tarball을 통해) 3.23 서버와 함께 제공된 mysql 명령 줄 클라이언트도 있었으며 해당 자격 증명과 잘 연결될 수있었습니다 (isql으로 테스트 할 수 없었기 때문에 나는 올바르게 PLUGIN_DIR을 사용할 수 없었고, 플러그인을 넣으려는 곳을 알아낼 수 없었습니다 : 시스템 /usr 디렉토리 나 상대적인 것이 아닙니다.) 나는 이것을 통해 길을 이해할 수 없었다. 나는 admin 사용자와 시조 비밀 번호에 대해 모든 데이터베이스에 대해 localhost%에 대한 일반적인 "매우 난잡한 테스트 만하는"GRANT을 모두 사용하여 MySQL 서버를 설정했습니다.

pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Error in server handshake (2012) (SQLDriverConnect)') 

이가 입증 :

나는 확실히 나는 아직도 명령 행에 mysql 통해 로그인 할 수있게 한 시도, 마지막을 포기하고 암호 인증을 사용하지 않도록,/널을 비워 암호를 설정 죽음의 조타. 이 오류를 조사한 결과, this GitHub issue을 발견했습니다. 사람들은 이것이 클라이언트/서버 프로토콜 비 호환성의 근본적인 요소라고 생각했습니다. 이 시점에서 나는 old_password.so 접근법을 포기했습니다. MariaDB 드라이버 코드 (C 또는 ODBC)의 3.0.2 버전은 이전 버전의 MySQL 프로토콜을 충분히 사용하지 못하는 것으로 보입니다. 그러나 그 과정에서 놓친 가능한 수정이 많이있을 것입니다.

당신은 아마 발견
  • 의에서 SQL_AUTO_IS_NULL 동작을 해제하려고 :

    다른 경로

    가 나는 잠시 동안 여기 있습니다 당신은 귀하의 질문에 언급 된 몇 가지 다른 일을하려고 시도 MariaDB 2.0 ODBC 드라이버 제품군이 제대로 작동하지 않습니다.This bug threadODBC Connector parameters list에는 해당 필드의 설정을 비활성화하는 방법에 대한 몇 가지 제안 사항이 있지만 (Option=8388608은 분명하고 명확합니다.) 강제로 해당 플래그를 사용하지 않도록 설정하거나 사용하도록 설정 한 경우 동작을 변경하지 않았습니다. 연결 문자열 또는 ODBC .ini 파일.

  • MySQL archive site에는 사용할 수있는 이전 버전의 ODBC 커넥터가 있습니다. 불행히도 컴파일 된 모든 버전은 32 비트 Linux 용입니다. 나는 소스에서 건물을 만들려고했는데, 심지어 툴체인을 구성하기까지 엄청난 일이었습니다. 내가 hand-install system identification files from 1999으로해야만했던 지점에서 나는 그것이 아마도 잃어버린 원인이라는 것을 알았다. 그러나 나는 모든 deps와 고대 버전을 설치하고 그것을 컴파일하려고했다. 엄청난 수의 다양한 컴파일 오류로 인해이 접근법 (C 표준 불일치와 UnixODBC의 거의 모든 부분에 해당하는 것으로 보이는 호환성)이 사라졌습니다. 제가 놓친 이러한 문제에 대한 간단한 수정이있을 수 있습니다. 나는 C 코더 또는 오래된 리눅스 빌드 시스템 전문가가 아니다.

  • third party MySQL ODBC connectors을 시도했지만 작동하지 않았습니다. 5. * 패밀리와 같은 오류.

  • 2.50.39 버전의 Connector/ODBC 라이브러리를 컴파일했습니다 (아카이브에서만 사용할 수있는 소스). 이를 위해 먼저 서버의 3.23 버전에 대한 파일을 libmysqlclient.so.10으로 컴파일했습니다. 이것은 (/usr/share/libtool/build-aux/config.{guess,sub}., mit-pthreads에 복사하고있어 소스 디렉토리에서 다양한 위치에 libtool이의 OS 정의 파일을 복사, 일부 errno 관련 문제 (my_sys.h에서 extern int errno에 대한 #define 절을 제거)를 해결하기 위해 3.23 서버의 소스를 변경 요구 mit-pthreads/config/, 문제가있는 경우). 그 후에 --with-mit-threads --without-server --without-docs --without-bench 구성 스위치를 사용하여 libmysqlclient 라이브러리를 컴파일하고 빌드 할 수있었습니다. 그 다음에 mysql 클라이언트 프로그램의 매크로를 평가하는 동안 컴파일 할 수없는 몇 가지 오류가 있지만 컴파일이 완료되었지만 libmysqlclient에 대한 .so 파일이 이미 생성되었으므로 그 파일을 움켜 잡고 옮겼습니다. libmysqlclient.so.10 라이브러리를 컴파일 한 후 2.50.39 version of Connector/ODBC from the archive을 만들었습니다. 메인 MySQL include 파일에서 일부 소스를 변경하려면 (asm/atomic.h에 대한 참조를 제거하는) 파일과 다른 라이브러리와 동일한 시스템 식별 libtool 핵을 변경해야합니다. 그들은 /usr/local/include 대신에 /usr/include에 있기 때문에 iodbc 라이브러리 (libiodbc2-dev 패키지를 통해 우분투에 설치됨)를 찾지 못했습니다. 나는 --with-mysql-includes=$path_to_3.23_mysql_binary_dir/include --with-mysql-libs=$path_to_compiled_libmysqlclient.so.10_files_from_mysql_server_3.23_sources --with-iodbc-includes=/usr/include/iodbc 스위치로 마침내 구성했으며 앞서 언급 한 atomic.h 문제 이외에 문제없이 구축했습니다. 그러나 결국, 새로 컴파일 된 libmyodbc.so을 통해 연결하면 Python/UnixODBC에서 segfault가 발생합니다. Valgrind, gdb 및 기타 도구는 이유를 결정하는 데 유용하지 않았습니다. 아마도 컴파일 된 라이브러리 상호 운용성 문제를 디버깅하는 데 더 정통한 사람이이 문제를 해결할 수 있습니다.

  • MySQL 아카이브에는 Connector/ODBC의 오래된 바이너리 RPM 버전이 있습니다. 그것들은 모두 32 비트이고, 거의 모든 최신 리눅스는 64 비트입니다. 나는 i386 아키텍처와 필수 라이브러리를 설치하여 이러한 파일을 shimming 시도했다. 64 비트 Python/UnixODBC는 myodbc 플러그인을 성공적으로로드 할 수 없어 일반적인 "파일을 찾을 수 없음"오류를 반환했습니다.이 오류는 결국 dlopen에 대한 실패한 호출로 추적되었습니다. Libtool의 dlopen 래퍼 (UnixODBC에서 사용됨)는 대부분의 사람들이 디버깅 할 수있는 것으로 간주되지 않으며, 중요한 번거 로움에 따라 Valgrind의 기본 트릭은 예상했던대로 동적으로 아키텍처에 호환되지 않는 i386x86-64) ODBC 백엔드.

솔루션/남은 옵션 일반적으로

아마 당신의 끝에있는 코드를 다시 작성하는 것이 더 쉬울 수거야. 예를 들어, 기존 Python 비 -DBLI MySQL 드라이버 (질문에 주석으로 제안 된대로 @FlipperPA)를 래핑하는 Python 모듈을 만들고 pyodbc 인터페이스의 '충분히'해킹해야 할 모듈을 만들 수 있습니다. 리팩토링하는 코드를 너무 많이 리팩터링하고 배포하기 전에 철저히 테스트하십시오. 나는 그것이 짜증나고 위험하다는 것을 안다. 그러나 아마 당신의 최선의 방법 일 것이다. 이러한 모듈을 작성하면 일반 ODBC 구문 등을 처리하는 pyodbc의 내부 코드를 사용할 수 있습니다.

심지어 단지 비 ODBC 파이썬 MySQL의 드라이버라는 pyodbc에 대해 "가짜"ODBC 백엔드를 개발할 수 있지만, pyodbc의 백엔드 플러그 가능성이 주로보다는 컴파일 된 라이브러리에 맞 보인다 이후, 즉 어려울 것이다 의심

"더미"심 코드.

저는이 물건에 대한 전문가가 아니므로, 내가 놓친 해결책이있을 수 있습니다!

당신은 MariaDB의 사람들과 버그를 제출할 수 있으며,이 고정 될 수 있습니다

내가 생각하고 포기 몇 가지 다른 가능성이 있습니다. 프로토콜 오류로 인해 "모든 수준에서 근본적으로 호환되지 않습니다."또는 "인증 시스템에서 모든 것이 올바르게 작동 할 것입니다"라는 좋은 의미가 없습니다. 그것은 가치가있을 것입니다.

버전 2.50 커넥터/ODBC 코드에서 사용할 수있는 32 비트 RPM (64 비트 Python/UnixODBC 환경으로로드되지 않음)이 있기 때문에 전체 스택 (또는 운영 체제 배포)를 32 비트 코드로 변환합니다. 그러나 컴파일되지 않은 항목을 사용하는 경우 이는 상당한 번거 로움이 될 수 있습니다. Ubuntu/Debian은 특히 구형 아키텍처에서 패키지를 사용할 수있게하는 것에 매우 뛰어나지 만, 여전히 까다로울 수 있습니다. 모든 것을 변환 했더라도 일부 동작은 변경 될 수 있으며 오래된 32 비트 특성은 앱을 사용하는 모든 사람들에게 계속해서 낯설게 느껴질 수 있습니다. 32 비트 런타임에서 액세스 할 때 2.50 드라이버가 작동하는 경우에만 가능합니다. 그 후에 다른 문제가 발생할 수 있습니다. 모든 클라이언트 코드에 대한 유지 관리 부담이 미래에 매우 낮을 가능성이있는 경우에만 (프로젝트가 작거나 변경되지 않을 경우)이 방법을 사용하는 것이 좋습니다. 이야기

소프트웨어의

도덕 멀리 빠른 피 묻은 썩게. 하위 호환성을 유지하기 위해 지속적으로 프로젝트를 수행하지 않는 한, 특히 웹 소프트웨어에서 작업이 빠르게 중단됩니다.

그것은 제품 자체가 고장났다는 것이 아닙니다. 우주가 100 만 가지의 작은 방법으로 바뀌 었습니다. 어떤 사람이 제너럴리스트로 충분하지 않고 그 모든 작은 변화와 그것을 뒤엎는 방법을 알기에 충분하지 않은 한, 모든 것을 시간/교정에서 거꾸로 움직여서 일이 "잘된"곳으로 옮기는 것은 매우 어렵습니다.

뭔가를 위해 바이너리를 얻은 경우, MySQL 드라이버와 같이 "공통적 인"것이 있다고하더라도 주위에 보관하십시오. 이상적으로는 인터넷과 공유하십시오.

소스가있는 경우 필요한 모든 종속성/툴체인 목록을 엄격하게 문서화하고 사람의 경우으로 문서화하십시오.예를 들어, 프로그램 종속성 목록을 읽는 데 필요한 도구가 있다고 가정합니다. autotools 자체가 쓸모 없게됩니다. 문서화하기에는 "명백한"것이 없습니다. 아키텍처, 커널 ABI, libc 동작 - 아무것도 아닙니다. 이제 Docker와 같은 "모든 커널에있는 상자"가 생겼으므로 프로그래밍 방식으로 더 많은 종속 항목을 저장할 수는 있지만 종속되지는 않습니다.

+1

와우. "토끼 구멍"실제로! 시간을내어 모험을 기록해 주셔서 감사합니다. +1 –

+1

영웅적인 노력. 고맙습니다. 이제 ODBC를 통해 연결할 수있는 방법이 없다는 것을 알고 있습니다. 최소한 제한된 시간, 업데이트 가능성 및 유지 관리 가능성. – jhinghaus

2

Zac B는 UnixODBC 및 pyodbc 3.07을 사용하여 Ubuntu 16 클라이언트의 MySQL 3.23 서버를 연결하는 실제 방법이 없음을 보여주었습니다.

FlipperPA는 다음 해결책으로 pypi.python.org/pypi/MySQL-python/1.2.4를 사용하도록 제안했습니다. 옛날의 MySQL에 연결할 수 없습니다 쉽다를 통해 설치

MySQL을 - 파이썬 : 그래서 나는 그것을 시도했다. 그것은 MySQL 3.23에서 작동하지 않는 시스템 mysql-client libs를 사용합니다.

MySQL을 - 파이썬 를 통해 설치 다른 일이 : 그것은 libmysqlclient-DEV 패키지에 포함 되는 mysql_config에서 libs가 가져옵니다. MySQL 3.23에서는 작동하지 않습니다. 하지만 여기서 뭔가를 수정할 수있는 기회가 있습니다. 내가 libmariadb - 클라이언트 LGPL-DEV를 설치하면

, 나는 mariadb_config 느릅 나무가 꽤되는 mysql_config처럼 보이는 얻을. 우분투 16의 mariadb-client는 위의 그림과 같이 MySQL 3.23에서 작업했습니다.

ln -s /usr/bin/mariadb_config mysql_config 
pip install MySQL-python 

이 작업을 수행합니다. 저 오래된 MySQL 서버를 파이썬에서 연결할 수 있습니다.

데이터 유형에 문제가 있지만이 경우 까다 롭지 않습니다.