Подключение к Microsoft SQL из linux (с помощью FreeTDS)

Материал из support.qbpro.ru

В различных случаях Вам может понадобиться подключиться из linux системы к СУБД Microsoft SQL (работающей под управлением Microsoft Windows). Например, Вы хотите организовать запись истории звонков Вашей АТС (например, CDR Asterisk) или даже записывать сами звонки в базу данных. В любом случае Вам не обойтись без соответствующих подсистем, отвечающих за связь между программами на linux и базами данных в MS SQL.

Само решение задачи по такому подключению состоит из нескольких этапов: Установка и настройка Microsoft SQL сервера (рассмотрение этой задачи выходит за рамки данной статьи). Настройка Microsoft SQL сервера для подключений извне (будет затронуто очень поверхностно). Установка FreeTDS. Проверка связи с Microsoft SQL сервером. Настройка FreeTDS для подключения к Microsoft SQL. Диагностика соединения через FreeTDS с Microsoft SQL сервером. Возможные ошибки, возникающие в процессе установки и настройки FreeTDS.

Установка и настройка Microsoft SQL сервера / настройка MS SQL сервера для подключений извне

Все примеры из данной статьи тестировались в работе с MS SQL 2005 / 2008. SQL сервер желательно устанавливать в mixed режиме (чтобы авторизовываться можно было как пользователь windows и/или как пользователь SQL сервер). Данное требование желательно, но не обязательно.

Включите использование протокола tcp/ip в настройках сервера (чтобы к нему можно было подключаться по сети). Если предполагается использование instance вместо номеров портов (например, если у Вас несколько instance на одном сервере), то не забудьте включить и запустить службу "SQL Server Browser" (если с этим возникают проблемы, см. "Возможные ошибки, возникающие в процессе настройки FreeTDS", внизу статьи).

Установка FreeTDS

Сайт программы FreeTDS находится здесь: http://www.freetds.org/.
Прямая ссылка для скачивания программы: ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz.
Актуальная версия программы - FreeTDS 0.91
Для скачивания и распаковки программы запустите команды:

cd /usr/src/
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz 
tar -xvzf freetds-stable.tgz

Теперь перейдите в нужную папку и запустите программы конфигурирования, сборки и установки (название папки зависит от версии программы, приведен пример для версии 0.91):

cd /usr/src/freetds-0.91/
./configure
make
make install

В случае успешного выполнения команд (отсутствия ошибок) установка FreeTDS закончена. Проверка связи с Microsoft SQL Server

Для начала попробуем подключиться к SQL серверу с помощью telnet:

telnet sql-server 1433

или (возможен и такой вариант порта):

telnet sql-server 1434

Должно произойти выполнение подключения к SQL серверу. Для отключения достаточно несколько раз нажать Enter. Теперь проверим работу FreeTDS с сервером Microsoft SQL: из командной строки (из-под root) запустите:

TDSVER=номер-версии-TDS tsql -H имя-сервера-SQL -p номер-порта-SQL -U имя-пользователя-БД

При этом возможны 2 способа авторизации на SQL сервере: авторизация windows и авторизация SQL. Кроме того, от версии SQL сервера зависит и версия протокола TDS, по которому будет происходить обмен. Например, по умолчанию серверы MS SQL 2005/2008 работают с TDS Version 7.2. Авторизация windows:

TDSVER=7.2 tsql -H test-sql.mydomain.ru -p 1433 -U test-sql\\Administrator

при запросе пароля ввести пароль пользователя windows (пароль для test-sql\Administrator). Авторизация SQL:

TDSVER=7.2 tsql -H test-sql.mydomain.ru -p 1433 -U sql-username

при запросе пароля ввести пароль пользователя sql (пароль для sql-username) При успешном подключении появится приглашение:

1>_

теперь можно ввести команды: version - чтобы узнать используемую версию протокола TDS (оказалось, что для MS SQL 2005 используется TDS версия 7.1) exit - для выхода Настройка FreeTDS для подключения к Microsoft SQL

Сначала необходимо определить местоположение файла с конфигурацией FreeTDS (файл называется freetds.conf, но их может быть несколько в Вашей операционной системе). Для этого выполните следующую команду

tsql -C

В строке "freetds.conf directory:" Вы увидите путь к файлу с конфигурацией FreeTDS. Теперь откройте файл freetds.conf по найденному пути и внесите необходимые изменения. Вы можете почитать (и самостоятельно перевести, а также найти нужные Вам параметры) руководство с сайта www.freetds.org, либо можете воспользоваться приведенными ниже инструкциями. Обратите внимание: инструкции приведены для версии FreeTDS 0.91, опробованы в работе с Microsoft SQL Server 2005/2008, со стороны FreeTDS использованы операционные системы CentOS 6.4 и Debian 7.1. В файле freetds.conf создайте свою секцию, например:

[mytest]
; комментарии начинаются со знака ;
host = test-sql.mydomain.ru
port = 1433
; instance = MSSQLSERVER	- можно указать не порт, а instance
tds version = 7.1
user = sql-username
password = sql-password
; логин и пароль - такие же, как и при проверке подключения из командной строки.
 

После настройки freetds.conf ничего перезагружать не нужно. Диагностика соединения через FreeTDS с Microsoft SQL сервером

Теперь необходимо проверить конфигурацию, настроенную в файле freetds.conf:

tsql -S mytest

где mytest - это название секции в файле freetds.conf Обратите внимание: при запуске этой команды возникнет ошибка!

tsql -S mytest
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Error 20002 (severity 9):
Adaptive Server connection failed
There was a problem connecting to the server

Чтобы убедиться, что конфигурация настроена правильно, попробуйте запустить такую команду:

tsql -S mytest -U имя-пользователя-SQL

например:

tsql -S mytest -U sql-username

После запуска команды введите пароль пользователя sql-username. В этом случае (если все настроено правильно) появится приглашение:

tsql -S mytest -U sql-username
Password:
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>_

Для выхода наберите exit и нажмите Enter. И обратите внимание на то, что указано в строке "using default charset". Это - кодировка базы данных, используемая для подключения к серверу. В случае, если у Вас кодировка базы данных не английская, то можно будет задать эту кодировку при подключении из программы, которая будет использовать FreeTDS.


Возможные ошибки, возникающие в процессе установки и настройки FreeTDS

OS error 115, "operation now in progress"

При попытке подключения к серверу Microsoft SQL с помощью tsql появляется следующее сообщение:

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

Это значит, что указана неверная версия TDS. Например, Вы указали tds 5.0 версию или 8.0, либо вообще ее не указали (в этом случае используется версия по умолчанию - 5.0). Для SQL сервера 2005/2008 необходимо использовать версию TDS 7.x (например, 7.1 или 7.2). Для правильного выбора версии TDS см здесь:

www.freetds.org
Error 20013 (severity 2): Unknown host machine name.

При попытке подключения к серверу Microsoft SQL с помощью tsql появляется следующее сообщение:

Error 20012 (severity 2):
Server name not found in configuration files.
Error 20013 (severity 2):
Unknown host machine name.
There was a problem connecting to the server

Это означает, что указано неверное имя сервера (или к серверу невозможно подключиться по данному имени). Проверьте, что имя сервера резолвится (в нужный IP адрес). В случае, если Вы уже указали IP адрес и Вы используете файл конфигурации freetds.conf, а эта ошибка по-прежнему появляется, убедитесь, что между словом "host", знаком "=" и именем сервера стоят пробелы. В файле freetds.conf все параметры должны отделяться от знака "=" и от значений пробелами!


OS error 111, "connection refused"

При попытке подключения к серверу Microsoft SQL с помощью tsql появляется следующее сообщение:

Error 20009 (severity 9):
Unable to connect: Adaptive Server is unavailable or does not exist
OS error 111, "connection refused"
There was a problem connecting to the server

Такой компьютер существует (возможно, это даже требуемый SQL сервер), но к нему невозможно подключиться. Обычно это происходит, когда указан неверный порт, либо когда не включено использование tcp/ip в настройках сервера. Попробуйте подключиться к указанному Вами серверу и порту с помощью telnet. В случае успешного подключения отобразится примерно следующее:

Connected to test-sql.mydomain.ru. 
Escape character is '^]'.

Не удается подключиться к instance на MS SQL сервере

Если не удается подключиться к instance на MS SQL сервере, то сначала попробуйте отобразить все instance сервера:

tsql -LH test-sql.mydomain.ru

если НИЧЕГО не отображается, значит на сервере выключен доступ! Надо настраивать сервер!!! В случае успеха отображается сообщение, аналогичное этому:

ServerName TEST-SQL
InstanceName MSSQLSERVER
IsClustered No
Version 9.00.1399.06
tcp 1433
np \\TEST-SQL\pipe\sql\query

После этого можно в настройках, в файле freetds.conf в нужной секции вместо "port = ..." указать "instance = ...". Обратите внимание: указывать можно ЛИБО port ЛИБО instance! Не оба! например:

instance = MSSQLSERVER

Настройка instance на сервере Microsoft SQL

Для работы с instance (а не с номерами портов) на сервере SQL открывается дополнительный UDP порт 1434. Техническое описание: Служба «SQL Server, браузер», UDP-порт 1434. Служба «SQL Server, браузер» прослушивает входящие соединения к именованному экземпляру и возвращает клиенту номер TCP-порта, соответствующего именованному экземпляру. Обычно служба «SQL Server, браузер» запускается при использовании именованного экземпляра компонента Database Engine. Если клиент настроен для соединения с именованным экземпляром по заданному порту, то службу «SQL Server, браузер» запускать не обязательно.

Решение проблемы: Убедитесь, что у Вас запущен сервис "SQL server browser", именно он отвечает за работу этого порта. для проверки (и отображения) instance на сервере запустите:

tsql -LH test-sql.mydomain.ru