Вопрос или проблема
Я пытаюсь подключиться к серверу MS-SQL через ODBC, вероятно, это один из самых задаваемых вопросов, но этот вопрос очень странный, потому что та же конфигурация работает на моем локальном компьютере, я имею в виду, что я всё сделал на своем локальном компьютере, и всё в порядке, а вот на другом компьютере не работает.
Я установил необходимые пакеты через
sudo apt-get install unixodbc unixodbc-dev freetds-dev freetds-bin tdsodbc
Мои конфигурации
/etc/freetds/freetds.conf
# Типичный сервер Microsoft
[SQLDemo]
host = xxx.xxx.xxx.xxx
port = 1433
tds version = 8.0 # Я также пробовал 7.0, 7.2
-----------------------------------------------
/etc/odbc.ini
[SQLDemo]
Driver = FreeTDS
Description = ODBC соединение через FreeTDS
Trace = No
Server=xxx.xxx.xxx.xxx\SQL2014 # Я также пробовал servername=SQLDemo
Database = MY_DB_NAME
-----------------------------------------------
/etc/odbcinst.ini
[ODBC]
Trace=Yes
TraceFile=/home/odbc_trace.log
[FreeTDS]
Description = TDS Driver (Sysbase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
Я запускаю следующий код и получаю ошибку
cnnstr="DSN=%s;UID=%s;PWD=%s" % ('SQLDemo', 'xyz', 'xyz');
db = pyodbc.connect(cnnstr);
pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Не удалось подключиться к источнику данных (0) (SQLDriverConnect)')
Мне нужно выяснить, что не так.
Я хочу снова упомянуть, что та же конфигурация/код работает на моем локальном компьютере.
Оба компьютера работают на Ubuntu 16.04
Заранее спасибо
Проблема была связана с портом по умолчанию экземпляра SQL Server на целевом компьютере, он был изменён на 1434. Так что вся конфигурация правильная, нужно просто скорректировать номер порта, также перед подключением убедитесь в порте SQL Server.
Ответ или решение
Проблема подключения к SQL Server через FreeTDS/UnixODBC
При установке соединения с MS SQL Server через ODBC, как правило, возникает ряд распространённых проблем, которые могут быть связаны с конфигурацией, настройками сети или версиями драйверов. В данном случае мы разберёмся с проблемами, возникшими на другой машине, несмотря на то что та же конфигурация успешно работает на локальном компьютере.
Описание текущей конфигурации
Вы установили необходимые пакеты с помощью команды:
sudo apt-get install unixodbc unixodbc-dev freetds-dev freetds-bin tdsodbc
Конфигурационные файлы, которые вы указали, следующие:
1. /etc/freetds/freetds.conf
[SQLDemo]
host = xxx.xxx.xxx.xxx
port = 1433
tds version = 8.0 # Также пробовали 7.0, 7.2
2. /etc/odbc.ini
[SQLDemo]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Server=xxx.xxx.xxx.xxx\SQL2014 # Также пробовали servername=SQLDemo
Database = MY_DB_NAME
3. /etc/odbcinst.ini
[ODBC]
Trace=Yes
TraceFile=/home/odbc_trace.log
[FreeTDS]
Description = TDS Driver (Sysbase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
FileUsage = 1
Запуск кода приводит к возникновению следующей ошибки:
cnnstr="DSN=%s;UID=%s;PWD=%s" % ('SQLDemo', 'xyz', 'xyz')
db = pyodbc.connect(cnnstr)
pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')
Устранение неполадок при подключении
1. Проверка порта SQL Server.
Одна из самых распространённых причин, по которой может не работать подключение, — неправильный порт SQL Server. В данном случае, как вы указали, целевой сервер настроен на использование порта 1434, в то время как в конфигурации указан порт 1433. Убедитесь, что используете правильный порт. Обновите конфигурацию в freetds.conf
и odbc.ini
, установив:
port = 1434 # пример, настройте на нужный порт вашего SQL Server
2. Проверка сетевого доступа.
Убедитесь, что сервер SQL доступен из вашей сети. Проверьте доступность, используя команду telnet
или nc
:
telnet xxx.xxx.xxx.xxx 1434
Если соединение не установлено, проблема может заключаться в брандмауэре или сетевых настройках.
3. Правильный формат сервера.
В odbc.ini
проверьте правильность формата записи сервера. Вместо использования Server=xxx.xxx.xxx.xxx\SQL2014
, попробуйте использовать:
Server=xxx.xxx.xxx.xxx
Port=1434 # или ваш действительный порт
4. Логи и трассировка.
Поскольку трассировка включена, просмотрите файл лога /home/odbc_trace.log
для получения более подробной информации об ошибке. Это может дать подсказки о том, где именно происходит сбой.
5. Версии драйвера FreeTDS.
Убедитесь, что версия FreeTDS, установленная на вашем сервере, совместима с версией SQL Server. Иногда потребуются изменения в конфигурации, чтобы использовать правильный TDS протокол. Вы можете проверить установленную версию командой:
tsql -C
Заключение
Проблема подключения к SQL Server через FreeTDS и UnixODBC может быть вызвана несколькими факторами, включая неверный порт, сетевые настройки, формат подключения и совместимость версий. Следуя описанным выше шагам, вы сможете выявить и устранить причину сбоя соединения. Убедитесь в правильности конфигурационных файлов и сделайте необходимые изменения, основанные на вашей среде.
Если после выполнения всех шагов проблема сохраняется, рекомендуется обратиться к более детальным логам, проверить настройки сетевой безопасности или рассмотреть возможность использования дополнительных инструментов управления базами данных для диагностики.