Não é possível acessar o banco de dados Oracle Win7 do Ubuntu VM

2

Minha máquina principal (física) é o Windows 7. Instalei uma máquina virtual "homestead" usando o VirtualBox para poder desenvolver um aplicativo Laravel na VM. Homestead (a VM) executa o Ubuntu 14.10 como seu SO.

Também na minha máquina Win 7, instalei um banco de dados Oracle. O banco de dados está funcionando bem e posso acessá-lo de uma sessão Sql*Plus em execução na própria máquina Windows. No entanto, desejo acessar esse mesmo banco de dados Oracle da máquina Homestead (para que eu possa acessar o banco de dados por meio do aplicativo da Web). Como primeiro passo para alcançar esse objetivo, tentei instalar o Oracle Instant Client no Homestead (11.2) e configurei-o de acordo com o que eu sei:

Algumas variáveis de ambiente que são definidas na máquina Ubuntu / Homestead são:

export ORACLE_HOME=/usr/lib/ora_home_directory
export LD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$PATH:$ORACLE_HOME

Eu posso fazer ping na máquina Win7 da Homestead:

# ping -c 4 cbh01
PING cbh01 (192.168.1.9) 56(84) bytes of data.
64 bytes from 192.168.1.9: icmp_seq=1 ttl=127 time=2.96 ms
64 bytes from 192.168.1.9: icmp_seq=2 ttl=127 time=1.04 ms
64 bytes from 192.168.1.9: icmp_seq=3 ttl=127 time=1.21 ms
64 bytes from 192.168.1.9: icmp_seq=4 ttl=127 time=1.45 ms

Eu posso lançar Sql*Plus da sessão SSH que abro para Homestead:

# sqlplus /nolog
SQL>

tnsnames.ora na máquina Homestead contém a seguinte entrada:

ORACBH =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = cbh01)(PORT = 1521))
      (CONNECT_DATA = (SERVICE_NAME = ORACBH))
  )

listener.ora na máquina Win7 tem esta aparência:

SID_LIST_LISTENER =
    (SID_LIST =
        (SID_DESC =
            (SID_NAME = PLSExtProc)
            (ORACLE_HOME = C:\oracle\product.2.0\db_2)
            (PROGRAM = extproc)
        )
        (SID_DESC =
            (GLOBAL_DBNAME = ORACBH)
            (ORACLE_HOME = C:\oracle\product.2.0\db_2)
            (SID_NAME = ORACBH)
        )
    )

LISTENER =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)

Quando faço uma conexão:

SQL> conn usr/pass@oracbh

Ele retorna:

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

Parece-me que não está tomando conhecimento do arquivo tnsnames.ora . Este é um problema em si, mas não importa, talvez eu possa contornar o problema conectando diretamente com a string de conexão.

SQL> conn usr/pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=CBH01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORACBH)))

Mas isso é simplesmente encontrado com o seguinte:

ERROR:
ORA-12541: TNS:no listener

Eu desliguei todos os firewalls, então não acho que esse seja o problema. Caso contrário, estou ficando sem ideias. : - /

O ouvinte parece estar funcionando bem.

C:\Users\Bob>lsnrctl status

LSNRCTL for 32-bit Windows: Version 10.2.0.4.0 - Production on 05-JUN-2015 08:07:44

Copyright (c) 1991, 2007, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 10.2.0.4.0 - Production
Start Date                05-JUN-2015 06:49:27
Uptime                    0 days 1 hr. 18 min. 21 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   C:\oracle\product.2.0\db_2\network\admin\listener.ora
Listener Log File         C:\oracle\product.2.0\db_2\network\log\listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "ORACBH" has 1 instance(s).
  Instance "ORACBH", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

Eu costumo pensar que o problema é uma combinação de como a VM acessa a rede. Eu não acho que seja um problema do Oracle. Meu conhecimento de redes e afins é limitado, então sinta-se à vontade para me esclarecer sobre essa frente !! Problemas semelhantes são relatados em algumas páginas de suporte do Oralce e VM, por exemplo: link

Tentando depurar a conexão na rede, usei o Telnet da seguinte forma:

vagrant@homestead:~$ telnet 192.168.1.9 1521
Trying 192.168.1.9...
telnet: Unable to connect to remote host: Connection refused

Mas, como dito anteriormente, já desativei todos os softwares de firewall, o que eliminaria o bloqueio de portas nesse nível.

    
por cartbeforehorse 05.06.2015 / 08:33

2 respostas

1

Siga estes passos que lhe permitirão usar o Ubuntu como se estivesse conectado fisicamente ao sistema operacional host.

Use o adaptador em ponte:

  1. Escolha sua interface de rede do host no menu suspenso.

Desative o DHCP e use um IP estático:

1- Na parte superior da tela, selecione o ícone de rede, ao lado do relógio e do volume, depois clique em Editar conexões.

2- A partir da janela que se abre, vá para a guia Wired, selecione sua conexão (deve haver apenas uma conexão, se você não tocou em nada). Em seguida, clique em Editar.

3- Na guia Configurações IPv4, altere o método de Automático (DHCP) para Manual.

4- No campo Endereços, clique em Adicionar.

5- Digite o endereço IP desejado e a máscara de sub-rede e clique em Salvar. Você também pode inserir um servidor DNS opcional aqui.

    
por 02.09.2015 / 15:23
0

Eu tenho jogado com várias configurações, então não é fácil dizer que havia uma solução específica para esse problema. A conclusão é que, se as configurações estiverem corretas, parece não haver nenhuma limitação inerente ao fato de a estrutura da VM poder se conectar ao banco de dados do servidor físico (ao contrário de alguns comentários que eu encontrei em outros fóruns).

Primeiramente, verifique se você está ou não usando o TNSNAMES para resolver sua string de conexão ou não. No arquivo sqlnet.ora , você pode optar por adicionar o parâmetro NAMES.DIRECTORY_PATH(TNSNAMES) . Se você adicionar isso, então parece que você está a usar uma resolução de nome no seu arquivo tnsnames.ora (o que me surpreendeu). Como resultado, você não pode usar '//servername.com:1521/dbsid' como sua string de conexão DSN. Quando isso acontece, eu preciso que o servidor web seja capaz de se conectar sem usar a entrada TNS, então eu removi a opção TNSNAMES do arquivo sqlnet.ora .

Em segundo lugar, verifique se você não tem firewalls bloqueando suas portas (especificamente, a porta 1521). Eu pensei que eu tinha permitido uma exceção para a minha porta 1521 no Firewall do Windows, mas como eu vejo agora, parece que as alterações que fiz não tiveram efeito até que eu reiniciei a máquina Windows (!?!?).

Você pode verificar se a porta está aberta e não-firewall, conforme comentário de @BjarteBrandt (usando a ferramenta nmap ), para garantir que a porta seja realmente open . Execute o seguinte da VM:

vagrant@homestead:~$ nmap -p 1521 cbh01

Starting Nmap 6.46 ( http://nmap.org ) at 2015-06-07 16:37 UTC
Nmap scan report for cbh01 (192.168.10.1)
Host is up (0.00046s latency).
Other addresses for cbh01 (not scanned): 192.168.1.14 192.168.56.1
PORT     STATE SERVICE
1521/tcp open  oracle

Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

Então, quando eu testar a conexão SQL novamente ...

vagrant@homestead:~$ sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on Sun Jun 7 16:42:48 2015
Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> conn usr/pass@//192.168.1.14/oracbh
Connected.

Requer uma reinicialização da VM (ou do servidor da Web, pelo menos), para que essa alteração na configuração da OCI seja propagada para o servidor da Web e a página da Web.

    
por 07.06.2015 / 18:50