freeTDS не използва своята конфигурация

Реших да използвам FreeTDS драйвер и unixODBC, за да управлявам PDO връзката между моето LAMP-базирано приложение с отдалечена MsSQL база данни. за съжаление изглежда, че драйверът не чете файла freetds.conf, нито променливите на околната среда, зададени директно чрез CLI на сървъра или посочени в php файла чрез функцията putenv().

сега малко данни:

  1. докато пингвам сървъра - не се губят пакети.
  2. тъй като telnet сървъра на 1433 порт - връзката е установена
  3. като използвам командата

    TDSVER=7.0 tsql -H >IP< -p 1433 -U username
    

    Получавам подкана да въведа парола и връзката е установена.

  4. без TDSVER да предхожда командата - връзката е неуспешна с такова съобщение:

    Error 20017 (severity 9):
        Unexpected EOF from the server
        OS error 115, "Operation now in progress"
    Error 20002 (severity 9):
        Adaptive Server connection failed
    There was a problem connecting to the server
    
  5. командите tsql -C отразяват такъв изход:

    Compile-time settings (established with the "configure" script)
                           Version: freetds v0.91
            freetds.conf directory: /usr/local/etc
    MS db-lib source compatibility: yes
       Sybase binary compatibility: no
                     Thread safety: yes
                     iconv library: yes
                       TDS version: 5.0
                             iODBC: no
                          unixodbc: yes
             SSPI "trusted" logins: no
                          Kerberos: no
    
  6. freetds.conf в даденото по-горе местоположение има този запис:

    [MSSQL]
    host = >IP<
    port = 1433
    tds version = 7.0
    
  7. ISQL също се проваля:

    isql -v MSSQL
    [S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
    [01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
    [ISQL]ERROR: Could not SQLConnect
    
  8. моят odbc.ini:

    [MSSQL]
    Description = MS SQL Server
    Driver = FreeTDS
    TDS_Version = 7.0
    Server = >IP<
    UID = username
    PWD = password
    ReadOnly = No
    Port = 1433
    

Предполагам, че решението е много просто, но съм твърде глупав, за да го намеря...


person khartvin    schedule 25.10.2012    source източник
comment
Открих този въпрос чрез ddg: freetds linux не работи и проблемът ми беше, че нямах конкретно дефиниран порт.   -  person bgStack15    schedule 25.08.2016


Отговори (5)


Днес прекарах дълго време в отстраняване на грешки при подобен проблем. Бях задал "TDS версия" във freetds.conf, но тя не се използваше в моята ODBC връзка. След като прочетох изходния код на freetds (connectparams.c:odbc_parse_connect_string), открих, че:

  • Ако вашият низ за връзка използва "SERVER=", тогава и freetds.conf, и odbc.ini се игнорират
  • Ако вашият низ за връзка използва "SERVERNAME=", тогава се използват настройките в съответния freetds.conf сървър
  • Ако вашият низ за връзка използва "DSN=", тогава се използват настройките в съответния DSN odbc.ini

odbcinst.ini е червена херинга. FreeTDS никога не проверява това за настройки.

Настройките, които задавате в низа за свързване, винаги се зачитат. Той също така винаги зачита променливите на средата като TDSVER.

person Max Bolingbroke    schedule 25.04.2013
comment
Благодаря за проучването: то потвърждава това, срещу което си блъсках главата току-що: DBI:ODBC не чете /etc/freetds/freetds.conf, когато използвам параметъра Server= в моя низ за връзка без DSN (и strings /usr/lib/odbc/libtdsodbc.so|grep conf показва, че библиотеката знае къде да намери конфигурационния файл. Изпълнението на strace ... -e open ... също потвърди, че не се прави опит за четене на freetds.conf. - person kostix; 13.09.2013
comment
А пример 4.3 тук потвърждава вашето изследване. Благодаря отново. - person kostix; 13.09.2013
comment
Ако се опитам да се свържа чрез PHP със SERVERNAME=... тогава получавам грешката: SQLSTATE[08001] SQLDriverConnect: 0 [unixODBC][FreeTDS][SQL Server]Не мога да се свържа с източник на данни Работи само със SERVER=.. Някаква идея защо? - person kinske; 02.12.2013
comment
@kinske Получавам същата грешка с SERVERNAME, докато SERVER работи. - person katalin_2003; 24.03.2016
comment
Свързвам се с HOST=xx.xx.xx.xx и имах нужда от putenv("TDSVER=8.0"); в моя PHP код, преди да се свържа. - person Chuck; 20.07.2017

Интуицията ми подсказва, че трябва да промените своята tds версия = 7.0 на tds версия = 8.0 във вашите файлове freetds.conf и odbc.ini И имате нужда от нещо във вашия odbcinst. ini файл. Ето какво имам да работя на Ubuntu 12.04 сървър, който говори с отдалечен MSSQL сървър:

freetds.conf

# Define a connection to the MSSQL server.
[mssql]
    host = myserver
    port = 1433
    tds version = 8.0

odbc.ini

# Define a connection to the MSSQL server.
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = MyDB
ServerName              = myserver
TDS_Version             = 8.0

odbcinst.ini

# Define where to find the driver for the Free TDS connections.
[freetds]
Description     = MS SQL database access with Free TDS
Driver          = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount      = 1
person Benny Hill    schedule 25.10.2012
comment
благодаря много, човече, ще се опитам да приложа предложенията ти, тъй като утре ще съм на работа - person khartvin; 25.10.2012
comment
току-що копирах това на centos 6 64bit. не работи - person shorif2000; 10.03.2014
comment
Някой има ли идеи къде да взема MSSQL драйвери за Mac OS X за FreeTDS? - person Carl; 12.09.2014

Изпитах точно същия проблем, но моята конфигурация вече беше правилно настроена. Проблемът беше, че TDS версиите, които freetds.conf разпознава, се промениха в по-новите версии, но очевидно старите версии все още работят в променливата на средата TDSVER. След като зададох версията в конфигурационните файлове на 7.1 вместо 8.0, всичко започна да работи.

person jmsq    schedule 07.03.2013
comment
РАБОТИ ЗА МЕН! Благодаря. След часове на тестване и търсене в Google не можех да повярвам, че това е всичко, което беше необходимо, за да стартира системата. - person Jim; 08.06.2014
comment
Отстраних грешки в настройката си чрез export TDSDUMP=/temp/freetds.log в ~/.bashrc, което показа ясно, че tds версията не е зададена от конфигурационния файл. След като зададох променливата на средата export TDSVER=8.0 всичко работи. - person DragonSpit; 25.06.2019

Първоначалният TDSVER=7.0 проблем беше разрешен чрез добавяне на следното в края на моя odbc.ini файл:

[Default]
Driver=/usr/local/lib/libtdsodbc.so
person SCDomingos    schedule 26.09.2013

Вместо да се свържете с IP, опитайте да се свържете с името на раздела за конфигурация? Например:

isql -v MSSQL
person Andomar    schedule 25.10.2012
comment
Вие също имате ли odbc.ini? Вижте stackoverflow.com/questions/8010361/ - person Andomar; 25.10.2012
comment
Опитайте да промените Server = 10.2.201.2 в odbc.ini на Server = MSSQL? - person Andomar; 25.10.2012
comment
Почти съм сигурен, че причината за това поведение е във факта, че FreeTDS не използва TDSVER=7.0, което се изисква за SQL сървърите на Microsoft - person khartvin; 25.10.2012
comment
Опитайте да промените TDS_Version на TDS Version? Въпреки че трябваше да вземе това от tds конфигурационния файл - person Andomar; 25.10.2012
comment
да, трябваше, промених, но резултатът е същият както преди. - person khartvin; 25.10.2012