Conexión ODBC entre Ubuntu 14.04 (Trusty Tahr) con SQL Server utilizando FreeTDS

Conexion ODBC vía isql

Conexion ODBC vía isql

En el post anterior se mostró como realizar la conexión ODBC entre Ubuntu 14.04 (Trusty Tahr) con SQL Server utilizando el Microsoft® ODBC Driver 11 for Linux, lo cual debo decir que luego de realizar diversas pruebas es la mejor opción para conectarse a servidores MS SQL 2003 o mayores, en el presente post vamos a utilizar FreeTDS para realizar la conexión, esto sirve para quienes no desean utilizar el driver oficial de MS o si deben conectarse a un servidor MS SQL 2000 por ejemplo.

Preeliminares

Debo mencionar que los pasos detallados a continuación se los realiza en un Ubuntu 14.04 server al cual se le ha instalado/configurado lo detallado en el post anterior, revísese sobre todo los pasos que se utilizaron para instalar unixODBC pues es necesario tener instalado unixODBC antes de instalar FreeTDS

Instalación/Configuración de FreeTDS

  • Instalar FreeTDS (con sudo o con usuario root)

# apt-get install freetds-bin freetds-common freetds-dev

  • Probar la correcta instalación

# tsql -C

debe mostrar algo parecido a:

Compile-time settings (established with the "configure" script)
Version: freetds v0.91
freetds.conf directory: /etc/freetds
MS db-lib source compatibility: no
Sybase binary compatibility: yes
Thread safety: yes
iconv library: yes
TDS version: 4.2
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: yes

  • Se necesita el archivo libtdsodbc.so para configurar FreeTDS, así que se procede a realizar la búsqueda en el terminal

# find / -name libtdsodbc.so

debería indicar lo siguiente (… pero…):

/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

  • En mi máquina no lo encontró, así que instalo odbcinst1debian2 y tdsodbc:

# apt-get install odbcinst1debian2 tdsodbc

  • Repito la búsqueda en el terminal

# find / -name libtdsodbc.so

Y ahora sí me muestra:

/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

  • En este punto según los manuales que había encontrado se debería configurar /etc/odbcinst.ini, /etc/odbc.ini y /etc/freetds/freetds.conf pero esto no me funciona, así que he procedido a configurar /usr/local/etc/odbcinst.ini, /usr/local/etc/odbc.ini y /etc/freetds/freetds.conf
  • /usr/local/etc/odbcinst.ini

# nano /usr/local/etc/odbcinst.ini

Agregar lo siguiente (en este archivo ya deben haber las líneas correspondientes a [SQL Server Native Client 11.0] que se incluyeron en el post anterior)

[FreeTDS]
Description=FreeTDS Driver v0.91
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
fileusage=1
dontdlclose=1
UsageCount=1

  • /usr/local/etc/odbc.ini

# nano /usr/local/etc/odbc.ini

Agregar lo siguiente:

[FreeTDS-MyDB]
Driver = FreeTDS
Description = MS SQL connection to 'NDWH' database
Trace = No
ServerName = srv
MyServer
Port = 1433
Database = MyDB
TDS_Version = 8

  • /etc/freetds/freetds.conf

# nano /etc/freetds/freetds.conf

Agregar lo siguiente (más detalle puede verse aquí):

# Servidor MyServer, tipo Microsoft SQL Server
[srv
MyServer]
host = 192.168.99.999
port = 1433
tds version = 8
initial block size = 512 #(<- este punto lo detallo abajo)

  • Verificar que la máquina vea el driver

# odbcinst -q -d

debe dar como resultado una lista que contiene entre cuyos elementos contiene [FreeTDS] (o el nombre que se haya puesto en usr/local/etc/odbcinst.ini)

  • Verificar que se pueda conectar con la BBDD utilizando isql y el nombre utilizado en /usr/local/etc/odbc.ini

# isql -v FreeTDS-MyDB MyUsuario MyPassword

debe dar como resultado lo siguiente:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

  • Verificar que se pueda conectar con la BBDD utilizando tsql y el nombre utilizado en /etc/freetds/freetds.conf

# tsql -S srvMyServer -U MyUsuario -P MyPassword -D MyDB

debe dar como resultado algo como lo siguiente:

locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Default database being set to ndwh
1>

 

Posibles errores y el initial block size

  • Si se conecta con tsql y no con isql entonces hay algun error en las configuraciones en odbc.ini o odbcinst.ini
  • Si no se conecta con isql ni con tsql es probablemente un error con «tds version», «port» o alguna configuracion en el MSSQL server, mirar http://freetds.schemamania.org/userguide/confirminstall.htm,
  • Cuelgues/Errores o pérdida de conexión al realizar querys «grandes», mira esto y en particular juega con el initial block size como indico a continuación,
  • El parámetro initial block size del /etc/freetds/freetds.conf según su guía sirve para especificar el tamaño máximo de un bloque, pero como yo tuve problemas de cuelgue (hanging) empecé a jugar con este parámetro (recordar que son multiplos de 512) y me funcionó para mitigar este problema que me surgió al hacer querys grandes.

 

En el siguiente post se muestra la conexión con una base Oracle utilizando su cliente oficial.

8 comentarios

3 pings

Ir al formulario de comentarios

    • Fernando en 8 marzo, 2016 a las 11:04
    • Responder

    hola Nemo.
    Te comento que seguí los pasos que indicaste para instalar el driver ODBC, pero cuando el comando tsql -C
    me muestra
    Version: freetds v0.95.21
    freetds.conf directory: /usr/local/etc
    MS db-lib source compatibility: no
    Sybase binary compatibility: no
    Thread safety: yes
    iconv library: yes
    TDS version: 5.0
    iODBC: no
    unixodbc: no
    SSPI «trusted» logins: no
    Kerberos: no
    OpenSSL: no
    GnuTLS: no

    Si notas , me indica unixodbc: no

    como podría arreglar este problema ?
    saludos y gracias

    1. Que tal Fernando, disculpa la demora, para poder realizar los pasos detallados en esta entrada debes antes haber instalado unixodbc, los detalles puedes verlos en: http://blog.espol.edu.ec/nemo/2014/07/18/coneccion-odbc-entre-ubuntu-14-04-trusty-tahr-con-sql-server-utilizando-el-microsoft-odbc-driver-11-for-linux/

    • Alberto en 21 octubre, 2014 a las 8:10
    • Responder

    I am able to connect the SQL Server via tsql (tsql -v DSNname Username Password), but the command isql -v DSNname Username Password returns this error:

    [01000][unixODBC][Driver Manager]Can’t open lib ‘/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so’ : file not found
    [ISQL]ERROR: Could not SQLConnect

    The file is there:

    -rwxrwxrwx 1 root root 400608 Sep 12 2013 /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

    Any help?

    1. If you connect with tsql and not with isql then there is an error in the odbc.ini or odbcinst.ini settings, it is likely that the Driver or Setup are pointing to a wrong file
      Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
      Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
      Do a search of libtdsodbc.so and libtdsS.so, maybe if you installed with root permission this file are in another place

        • Alberto en 24 octubre, 2014 a las 4:35
        • Responder

        sudo find / -name libtdsodbc.so
        /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

        sudo find / -name libtdsS.so
        /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
        /usr/lib/i386-linux-gnu/odbc/libtdsS.so

        my etc/odbc.ini:
        [MGHMAGAMP]
        Description = MAGAMP su MGH
        Driver = TDS
        Trace = No
        Server = MGHSERVER
        UserName =
        Password =
        Database = MAGAMP
        Port = 1433
        TDS_Version = 8

        my etc/odbcinst.ini:
        [TDS]
        Description = FreeTDS Driver for Linux & MSSQL on Windows
        Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
        Setup = /usr/lib/x86_64-linux-gnu(odbc/libtdsS.so
        UsageCount = 2

        Tried various «TDS-Version» values, «Server»/»ServerName» values or IP values

        my etc/freetds/freetds.conf:
        [MGHSERVER]
        host = xxx.xxx.xxx.xxx
        port = 1433
        tds version = 8
        client charset = UTF-8
        text size = 20971520

        Tried various «tds version» values, «host» names or IP values

        1. Yes, I had the same error when I use etc/odbc.ini and etc/odbcinst.ini, try using /usr/local/etc/odbcinst.ini and /usr/local/etc/odbcinst.ini like I recommend in my post, I don’t know why but this worked for my

  1. Listo, actualizado; gracias Carlos por la corrección.

    • Carlos en 22 septiembre, 2014 a las 13:50
    • Responder

    Nota: en el archivo odbc.ini, ServerName debiera ser srvMyServer que apunta justamente a la configuración hecha en el archivo freetds.conf.

  1. […] En Ubuntu es con freetds apt-get install freetds-bin freetds-common freetds-dev – See more at: http://blog.espol.edu.ec/nemo/2014/07/30/conexion-odbc-entre-ubuntu-14-04-trusty-tahr-con-sql-server&#8230; […]

  2. […] Conexión ODBC entre Ubuntu 14.04 (Trusty Tahr) con SQL Server utilizando FreeTDS » […]

  3. […] « Conexión ODBC entre Ubuntu 14.04 (Trusty Tahr) con SQL Server utilizando FreeTDS […]

Deja un comentario

Tu email nunca se publicará.


Ir a la barra de herramientas