Como usar o FreeTDS e o UnixODBC em um CentOS 7 com PHP 5.4 para acessar bancos de dados SQL Server e Sybase ASA

Este texto mostrará como configurar conexões ao SQL Server e ao Sybase ASA, a partir de um CentOS 7, usando o FreeTDS, UnixODBC e  o PHP/Apache.

Dependendo das versões de cada um dos componentes envolvidos as configurações necessárias poderão ser um pouco diferentes das que serão mostradas aqui mas, mesmo assim, você saberá por onde começar e o caminho das pedras a seguir. Especificamente as configurações foram feitas no seguinte ambiente:

  • CentOS 7.1, rodando:
    • Apache 2.4.6
    • PHP 5.4.16
    • FreeTDS 0.95
    • UnixODBC 2.3.1
  • MS SQL Server 2008 R2, rodando em um Windows 2008 R2 Server
  • Sybase Adaptive Server Anywhere (ASA) 9.0.2, rodando em Windows 2008 R2 Server

Como você pode ver, o host linux (CentOS está atualizado) mas o SQL Server e o Sybase já são versões muito antigas (bem, foi o que conseguimos para testar).

Se você tem versões mais novas do SQL Server ou do Sybase, siga as instruções abaixo e altere, se necessário, as configurações para seu ambiente. Você terá que consultar a documentação na internet.

Observação: o Sybase Adaptive Server Anywhere (Sybase ASA) foi renomeado para Syabse SQL Anywhere nas versões mais novas. Note também que existe um outro produto, o Sybase Adaptive Server Enterprise (Sybase ASE). Independentemente do produto Sybase que você está usando, as configurações são semelhantes ao descrito aqui (talvez você tenha que ajustar um ou outro parâmetro, consulte a documentação na internet).

Mãos à obra!

1) Atualize o CentOS

Recomendação padrão antes de qualquer coisa: atualize o CentOS para garantir que todos os pacotes estejam nas últimas versões, com os patches de segurança instalados:

yum check-update
yum update

2) Instale os pacotes necessários

Você precisará, minimamente, do Apache, PHP e do UnixODBC:

yum install httpd httpd-tools php php-common php-cli php-odbc php-pdo unixODBC unixODBC-devel

A configuração do Apache e do PHP estão fora do escopo deste documento. Consulte Instalação do Apache, PHP e MySQL (MariaDB) no CentOS 7 para maiores informações.

3) Instale e configure o FreeTDS

O FreeTDS é uma implementação open source do protocolo TDS (Tabular Data Stream) usado pelo SQL Server e pelo Sybase, e permite que hosts unix/linux consigam se conectar a esses bancos de dados.

O CentOS não traz um pacote pronto para a instalação do FreeTDS, mas no repositório EPEL (Extra Packages for Enterprise Linux) existe um pacote prontinho para uso. Configure o CentOS para usar o repositório EPEL e instale o FreeTDS:

yum install epel-release
yum check-update
yum install freetds freetds-devel

O arquivo de configuração do FreeTDS é o /etc/freetds.conf. Edite esse arquivo para ficar semelhante ao seguinte (prestando atenção aos itens em vermelho):

[global]
 # Versão global do protocolo TDS
 #tds version = 4.2
 tds version = 5.0

 # Armazenar dump (TDSDUMP file) para debug?
 dump file = /tmp/freetds.log
 debug flags = 0xffff

 # Timeouts
 timeout = 10
 connect timeout = 10

 # Tamanho do buffer para campo TEXT para evitar
 # erros do tipo out-of-memory errors
 text size = 64512


[nome_banco_sybase]
 host = ip_do_servidor
 port = porta_do_servidor
 tds version = 5.0


[nome_banco_sqlserver]
 host = ip_do_servidor
 port = porta_do_servidor
 tds version = 7.0

Agora temos que testar se a conexão ao Sybase e ao SQL Server, via FreeTDS, está funcionando corretamente. Para isso usamos o utilitário tsql do FreeTDS.

Teste de conexão ao Sybase:

# tsql -S nome_banco_sybase -U usuario -P senha
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> quit

Se você chegou no prompt “1>”, conforme mostrado acima, pode dar o quit e sair feliz pois a conexão FreeTDS ao Sybase está funcionando corretamente.

Teste de conexão ao SQL Server:

# tsql -S nome_banco_sqlserver -U usuario -P senha
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> quit

Se você chegou no prompt “1>”, conforme mostrado acima, pode dar o quit e sair feliz pois a conexão FreeTDS com o SQL Server está funcionando corretamente.

Se alguma dessas conexões não foi bem-sucedida, você terá que procurar uma solução antes de continuar. Em particular o nome do banco do Sybase é uma configuração chata: qualquer errinho nesse nome e você verá uma mensagem de erro conforme a seguir:

# tsql -S nome_banco_sybase_errado -U usuario -P senha
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Msg 911 (severity 16, state 0) from [nome_banco_sybase_errado]:
 "ASA Error -83: Specified database not found"
There was a problem connecting to the server

A mensagem acima é típica de uma configuração do FreeTDS usando o nome do banco de dados do Sybase errado. Consulte seu DBA para saber exatamente o nome do banco de dados que tem que ser configurado no FreeTDS.

4) Configure o UnixODBC

Até o momento já temos o FreeTDS instalado, configurado e acessando os bancos SQL Server e Sybase (se você não conseguiu completar a seção 3, nem adianta seguir adiante: consulte a documentação e faça o FreeTDS se conectar corretamente aos bancos de dados, pois o UnixODBC usará essa conexão).

Agora é hora de configurar o UnixODBC.

Edite o arquivo /etc/odbcinst.ini e deixe com o seguinte conteúdo:

[ODBC]
Trace = No
TraceFile = /tmp/sql.log
ForceTrace = No

[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so.0
FileUsage = 1

No arquivo acima estamos dizendo que o UnixODBC deve usar o driver do FreeTDS (/usr/lib64/libtdsodbc.so.0) para as conexões. Se quisermos, para debug de conexões problemáticas, podemos habilitar os trace file mudando de No para Yes (em sistemas de produção, deixar como No).

Agora crie ou edite o arquivo /etc/odbc.ini e deixe com o seguinte conteúdo:

# Data Source Name (DSN) para o MS SQL-Server:
[alias1]
Description = Conexão ao SQL Server 2008 R2
Driver = FreeTDS
Trace = No
Server = ip_do_servidor
Database = nome_banco_sqlserver
Port = porta_do_servidor


# Data Source Name (DSN) para o Sybase:
[alias2]
Description = Conexão ao Sybase ASA 9
Driver = FreeTDS
Trace = No
Servername = nome_banco_sybase  # igual ao /etc/freetds.conf
Port = porta_do_servidor
TDS_Version = 5.0

Explicando o arquivo acima para o SQL Server:

  • alias1 = é um alias arbitrário, o nome do DSN. Pode ser qualquer coisa e será usado nas chamadas de conexões ao SQL Server
  • Server = IP do servidor SQL Server
  • Database = nome do banco de dados ao qual você quer se conectar
  • Port = porta do SQL Server para receber conexões

Explicando o arquivo acima para o Sybase:

  • alias2 = é um alias arbitrário, o nome do DSN. Pode ser qualquer coisa e será usado nas chamadas de conexões ao Sybase
  • Servername = atenção com esse parâmetro: apesar do parâmetro se chamar “servername”, ele significa o nome do banco de dados do Sybase, idêntico ao nome do banco de dados do Sybase configurado no arquivo /etc/freetds.conf. O DSN alias2 procurará pela entrada “Servername” em /etc/freetds.conf para saber como estabelecer a conexão.
  • Port = porta do Sybase para receber conexões

Agora vamos testar as conexões aos bancos de dados via UnixODBC, através do utilitário isql do UnixODBC.

Teste de conexão ao SQL Server, usando o DSN alias1:

# isql alias1 usuario senha -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select count(*) from tabela;
+------------+
|            |
+------------+
| 2094       |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL> quit

Muito bom, tudo funcionando. Nos conectamos ao DSN chamado alias1 (que no arquivo /etc/odbc.ini aponta para um SQL Server) com um usuário e senha. A conexão foi bem-sucedida e fizemos um select simples de uma tabela qualquer que tinha 2094 linhas. Como tudo funciona, demos o quit para sair.

Agora vamos testar a conexão ao Sybase, usando o DSN alias2:

 # isql alias2 usuario senha -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select count(*) from tabela;
+------------+
| count(*)   |
+------------+
| 347342     |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL> quit

Perfeito, tudo funcionando! Nos conectamos ao DSN chamado alias2 (que no arquivo /etc/odbc.ini aponta para um Sybase) com um usuário e senha. A conexão foi bem-sucedida e fizemos um select simples de uma tabela qualquer que tinha 347342 linhas. Como tudo funciona, demos o quit para sair.

5) Ajuste o SELinux

O CentOS 7 traz o SELinux (Security Enhanced Linux) habilitado por padrão e, por causa dessas de segurança, o Apache não pode acessar recursos de rede nem de bancos de dados.

Para configurar o SELinux com as permissões corretas, liberando o Apache para acessar recursos de rede e de banco de dados, temos que ajustar duas propriedades booleanas no SELinux, com os comandos abaixo:

setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect_db on

6) Configure o acesso via PHP

A configuração do PHP é simples: basicamente é definir as conexões aos bancos de dados em um arquivo .php, via PDO ou via odbc_connect.

O seguinte arquivo teste.php testa a conexão ao SQL Server via PDO e ao Sybase via odbc_connect:

<?php

 $ip = "ip_do_servidor_sqlserver";
 $porta = "porta_do_servidor";
 $banco = "nome_do_banco";
 $usuario = "usuario";
 $senha = "senha";

 $conexao1 = new PDO("odbc:Driver=FreeTDS; Server=$ip; Port=$porta; Database=$banco; UID=$usuario; PWD=$senha;");
 if (! $conexao1 ) {
 print '<h3>Não foi possível conectar ao MS SQL-Server.</h3>';
 } else {
 print '<h3>Conexão ao MS SQL-Server, via PDO, concluída com sucesso!</h3>';
 }

?>

<?php

 $banco = "alias2";
 $usuario = "usuario";
 $senha = "senha";

 $conexao2 = odbc_connect("Driver=FreeTDS;DSN=$banco", $usuario, $senha );
 if (! $conexao2 ) {
 print '<h3>Não foi possível conectar ao Sybase.</h3>';
 } else {
 print '<h3>Conexão ao Sybase, via odbc_connect, concluída com sucesso!</h3>';
 odbc_close($conexao2);
 }

?>

Como usamos diretamente o PDO sem especificar um DSN para acessar o SQL Server, tivemos que especificar IP, porta, etc. Poderíamos ter feito a conexão com um DSN também, ficaria assim (a variável $dsn deve apontar para o alias do DSN do SQL Server definido em /etc/odbc.ini):

$conexao1 = new PDO("odbc:Driver=FreeTDS;DSN=$dsn", $usuario, $senha);

Para acessar o Sybase usamos o DSN configurado em /etc/odbci.ini, portanto tivemos que usar o alias configurado nesse arquivo.

Se tudo correu bem você verá em seu browser duas mensagens de conexões concluídas, uma para o SQL Server e a outra para o Sybase.

Você pode acessar tanto o SQL Server quanto o Sybase pela PDO ou pelo odbc_connect. Qual é melhor? Não sei, não sou desenvolvedor PHP…

7) Busque ajuda

Se tudo está dando errado, busque documentação nesses sites:

Erro do Java com Sybase 9 e Windows 7

Ao tentar usar as ferramentas do Sybase 9 (Interactive SQL 9.0.2 e Sybase Central 4.3.0) em um computador Windows 7 (64 bits, não testei com 32 bits) com Java 1.8 instalado, sempre ocorre um erro de Java e o Interactive SQL e o Sybase Central não abrem (ocorre um erro java.lang.NullPointerException).

A mensagem de erro é a seguinte:

erro_sybase

Isso ocorre pois as ferramentas do Sybase 9 são baseadas em Java 1.4, uma versão muito antiga, e ocorre uma incompatibilidade com alguns atributos visuais do Windows. Para corrigir isso, faça o seguinte:

  1. Clique em Painel de Controle -> Sistema;
  2. Clique na opção “Configurações Avançadas do Sistema”;
  3. Na janela de Propriedades do Sistema, clique na aba “Avançado”;
  4. Na janela Opções de Desempenho, DESMARQUE a opção “Usar estilos visuais em janelas e botões”. Print da tela:
    correcao_sybase
  5. Aplique e salve tudo.

Agora o Sybase 9 vai funcionar com o Windows 7. Efeito colateral: seu windows não ficará “bonitinho”, ficará com cara de Windows XP antigão (o que pode ser melhor do que o Windows 7!).