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

Я решил использовать драйвер FreeTDS и unixODBC для управления соединением PDO между моим приложением на основе LAMP и удаленной базой данных MsSQL. к сожалению, похоже, что драйвер не читает файл freetds.conf, а также переменные среды, установленные либо непосредственно через интерфейс командной строки сервера, либо указанные в файле php с помощью функции putenv().

теперь немного данных:

  1. как пингую сервер - пакеты не теряются.
  2. как телнет сервер на 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 version = 7.0 на tds version = 8.0 в ваших файлах freetds.conf и odbc.ini И вам нужно что-то в вашем odbcinst. ини файл. Вот что у меня работает на сервере 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
РАБОТАЕТ ДЛЯ МЕНЯ! Спасибо. После нескольких часов тестирования и гугления я не мог поверить, что это все, что нужно для того, чтобы система заработала. - 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