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
ytdsodbc
:
# 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 = srvMyServer
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
[srvMyServer]
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 conisql
entonces hay algun error en las configuraciones enodbc.ini
oodbcinst.ini
- Si no se conecta con
isql
ni contsql
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
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
Autor
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/
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?
Autor
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
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
Autor
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
Autor
Listo, actualizado; gracias Carlos por la corrección.
Nota: en el archivo odbc.ini, ServerName debiera ser srvMyServer que apunta justamente a la configuración hecha en el archivo freetds.conf.
[…] 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… […]
[…] Conexión ODBC entre Ubuntu 14.04 (Trusty Tahr) con SQL Server utilizando FreeTDS » […]
[…] « Conexión ODBC entre Ubuntu 14.04 (Trusty Tahr) con SQL Server utilizando FreeTDS […]