2

Моя основная (физическая) машина - Windows 7. Я установил "домашнюю" виртуальную машину, используя VirtualBox, чтобы я мог разработать приложение Laravel на виртуальной машине. Homestead (VM) работает под управлением Ubuntu 14.10.

Также на моем компьютере с Win 7 я установил базу данных Oracle. База данных работает нормально, и я могу получить к ней доступ из сеанса Sql*Plus работающего на самой машине Windows. Однако я хочу получить доступ к той же базе данных Oracle с компьютера Homestead (в конечном итоге, чтобы я мог получить доступ к базе данных через мое веб-приложение). В качестве первого шага к достижению этой цели я попытался установить Oracle Instant Client на Homestead (11.2) и настроить его, насколько мне известно, следующим образом:

Некоторые переменные окружения, которые установлены на машине Ubuntu/Homestead:

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

Я могу пинговать машину Win7 из 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

Я могу запустить Sql*Plus из сеанса SSH, который я открываю для Homestead:

# sqlplus /nolog
SQL>

tnsnames.ora на машине Homestead содержит следующую запись:

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

listener.ora на машине Win7 выглядит так:

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

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

Когда я делаю соединение:

SQL> conn usr/pass@oracbh

Возвращает:

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

Мне кажется, что он не замечает файл tnsnames.ora . Это проблема сама по себе, но, возможно, я смогу обойти эту проблему, напрямую подключившись к строке подключения.

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

Но это просто встречается со следующим:

ERROR:
ORA-12541: TNS:no listener

Я отключил все брандмауэры, поэтому не думаю, что это проблема. В противном случае у меня заканчиваются идеи. :-/

Слушатель, кажется, работает нормально.

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\10.2.0\db_2\network\admin\listener.ora
Listener Log File         C:\oracle\product\10.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

Я склонен думать, что проблема в том, как виртуальная машина обращается к сети. Я не думаю, что это проблема Oracle. Мое знание сетей и тому подобное ограничено, поэтому не стесняйтесь просветить меня на этом фронте! О подобных проблемах сообщается на некоторых страницах поддержки Oralce и VM, например: https://community.oracle.com/thread/2439416

Пытаясь отладить соединение по сети, я использовал Telnet следующим образом:

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

Но, как уже говорилось, я уже отключил все программное обеспечение брандмауэра, что устранит блокировку портов на этом уровне.

2 ответа2

1

Выполните следующие действия, которые позволят вам использовать Ubuntu, как если бы он был физически подключен к операционной системе хоста.

Используйте мостовой адаптер:

Мостовой адаптер

  1. Выберите свой сетевой интерфейс хоста в раскрывающемся списке.

Отключите DHCP и используйте статический IP:

1- В верхней части экрана выберите значок сети, рядом с часами и громкостью, затем нажмите «Изменить подключения».

2- В открывшемся окне перейдите на вкладку Wired, выберите ваше соединение (должно быть только одно соединение, если вы ничего не трогали). Затем нажмите «Изменить».

3- На вкладке «Настройки IPv4» измените метод с автоматического (DHCP) на ручной.

4. В поле «Адреса» нажмите «Добавить».

5. Введите желаемый IP-адрес и маску подсети и нажмите «Сохранить». Здесь вы также можете ввести дополнительный DNS-сервер.

0

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

Во-первых, убедитесь, что вы знаете, используете ли вы TNSNAMES для разрешения строки подключения или нет. В файле sqlnet.ora вы можете добавить параметр NAMES.DIRECTORY_PATH(TNSNAMES) . Если вы добавите это, то, похоже, вы обязаны использовать разрешение имен в файле tnsnames.ora (что меня удивило). В результате вы не можете использовать «//servername.com:1521/dbsid» в качестве строки подключения DSN. Как это происходит, мне нужно, чтобы веб-сервер мог подключаться без использования записи TNS, поэтому я удалил опцию TNSNAMES из файла sqlnet.ora .

Во-вторых, убедитесь, что у вас нет брандмауэров, блокирующих ваши порты (в частности, порт 1521). Я думал, что допустил исключение для своего порта 1521 в брандмауэре Windows, но, как я вижу это сейчас, кажется, что сделанные мной изменения не вступили в силу, пока я не перезагрузил компьютер Windows (!?!?).

Вы можете убедиться, что порт открыт и не защищен брандмауэром, согласно комментарию @BjarteBrandt (с помощью инструмента nmap ), чтобы убедиться, что порт действительно open . Запустите на виртуальной машине следующее:

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

Затем, когда я снова проверяю соединение SQL ...

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.

Требуется перезагрузка виртуальной машины (или, по крайней мере, веб-сервера), чтобы это изменение конфигурации OCI было распространено на веб-сервер и веб-страницу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .