2010-01-13 4 views
8

Привет, у меня есть проблема с доступом к Oracle DB из нашего центра обработки данных через туннель.Использование оракула db через туннель ssh. Ошибка «ORA-12541: TNS: нет слушателя»

У нас есть довольно стандартный центр обработки данных с одной машиной, доступной снаружи (я помещаю его в файл/etc/hosts как dc) и внутри базы данных Oracle. IP-адрес нашего оракула базы данных по внутренней сети 192.168.1.7

Чтобы создать туннель, я использую команду:

ssh -L 1521:192.168.1.7:1521 [email protected] 

и, конечно, он работает (иногда я также добавить некоторые отладки -vv чтобы увидеть, проходит ли что-то).

Теперь сложная часть - подключение к Oracle. Я установил instantclient 11.2. и мой tnsnames.ora выглядит следующим образом:

testdb = 
    (DESCRIPTION = 
    (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) 
    ) 
    (CONNECT_DATA = 
     (SERVICE_NAME = dbname) 
    ) 
) 

И когда я пытаюсь подключиться с помощью команды:

./sqlplus username/[email protected] 

Он начинает подключаться через туннель (я вижу его в SSH отладки), но затем он не рассказывающие:

./sqlplus username/[email protected] 

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 20:46:07 2010 

Copyright (c) 1982, 2009, Oracle. All rights reserved. 

ERROR: 
ORA-12541: TNS:no listener 


Enter user-name: 

когда я пытаюсь выполнить эту же команду, когда я нахожусь в интрасети он работает (очевидно, единственное отличие состоит в том, что в tnsnames.ora HOST ш e имеют 192.168.1.7, а не localhost).

Я также попытался использовать простую команду:

./sqlplus username/[email protected]//localhost:1521/testdb 

или альтернативно

./sqlplus username/[email protected]//localhost:1521/testdb 

Но ничего не помогло :)

Я был бы признателен за любую помощь или предложения. Я пропустил какой-то флаг ssh, чтобы сделать это возможным?

Вероятно, файл журнала:

*********************************************************************** 

Fatal NI connect error 12541, connecting to: 
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DBNAME)(CID=([email protected])(HOST=velvet)(USER=johndoe)))) 

    VERSION INFORMATION: 
    TNS for Linux: Version 11.2.0.1.0 - Production 
    TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production 
    Time: 13-JAN-2010 20:48:42 
    Tracing not turned on. 
    Tns error struct: 
    ns main err code: 12541 

TNS-12541: Message 12541 not found; No message file for product=network, facility=TNS 
    ns secondary err code: 12560 
    nt main err code: 511 

TNS-00511: Message 511 not found; No message file for product=network, facility=TNS 
    nt secondary err code: 111 
    nt OS err code: 0 

где бархат мой локальное имя и JohnDoe мой локальный имя пользователя. Почему он отправляется на другую сторону?

UPDATE:

После изучения немного больше внутри центров обработки данных, и это выглядит так: - первое подключение происходит к порту 1521 - но затем SQLPLUS перенаправляется на номер порта> 3300 , который отличается каждый раз и увеличивается на 3 (по крайней мере, несколько попыток, которые у меня были) - когда мы пытаемся подключиться через туннель, sqlplus попытается подключиться к локальному хосту, и он, очевидно, потерпит неудачу

Итак, ошибка «Нет прослушивателя» «происходит, вероятно, из-за того, что мы не перенаправляем se портов. Есть ли способ (возможно, некоторый вариант в файле tnsnames.ora), чтобы заставить использовать определенный порт?

+0

Что такое операционная система сервера баз данных? Если это Windows, Google USE_SHARED_SOCKET –

+0

Удар по этому поводу; Вы когда-нибудь находили решение? –

+0

Чтобы уточнить: я подключаюсь к Oracle RAC, и я не в состоянии перенастроить прослушиватель с другой стороны (например, установить его для использования совместно используемого сокета). sqlplus подключается один раз каждые несколько попыток подключения, мое приложение никогда не удается подключиться. –

ответ

3

Посмотрите в Metalink ID 361284.1 (Edit: эффективно не публичной, но найти информацию here)

Похоже, Oracle Connection Manager, будет ваш выбор. Он в основном обрабатывает перенаправление портов внутри брандмауэра. Я раньше этого не использовал, поэтому не могу больше советовать вам.


Update: Другим путь будет использовать МТС, настроить диспетчер с определенными портами и открыть эти порты в брандмауэре. Вам не нужно было устанавливать дополнительное программное обеспечение для этого, но для подключения через общий сервер может потребоваться увеличение LARGE_POOL_SIZE, среди прочих соображений. Поэтому для изменения параметра DISPATCHERS вам потребуется роль DBA. Вам также придется отскакивать БД.

+0

К сожалению, у меня нет возможности добавлять что-либо на серверной стороне, не говоря уже о брандмауэре. Раньше я читал о диспетчере соединений Oracle, и если вы в состоянии настроить его, это, безусловно, звучит как отличный вариант для работы с перенаправлением на подключении. –

3

Обычно это должно работать.Я бы не использовал порт прослушивателя по умолчанию в качестве записи для туннеля ssh, но это не должно быть проблемой. Я также не стал бы пользователем root-учетной записи создавать ssh-соединение, предпочтительно специальную регулярную учетную запись. Используете ли вы общие серверы или база данных является базой данных RAC с конфигурацией баланса нагрузки? Приятное объяснение здесь How can I connect to ORACLE DB through ssh tunnel chain (double tunnel, server in company network) ?, немного сложнее .....

обновления фотографии DbVisualizer, теперь он имеет встроенный SSH туннелирование. Я думаю, что стоит хотя бы попробовать. Это не бесплатно, но хорошо. Многоплатформенная и мульти база данных и очень гибкая.

0

Вы можете попробовать сделать трассировку, чтобы точно определить, что происходит:

  • Для сервера трассировки, попробуйте here (будьте осторожны, все, что новый запрос будет отслеживаться и сервер может быть свернут!).
  • Для отслеживания клиентов, проверка here.
-1

Возможно, ваш слушатель еще не запущен. Попробуйте запустить «lsnrctrl start».

+0

Нет, слушатель определенно начал; обратите внимание, что «sqlplus подключается один раз каждые несколько попыток подключения». –

-1

Также хорошее объяснение здесь connection to an oracle database though a SSH secure shell, который работал для меня.

  1. Открыть шпатлевки и на странице сеанса, введите имя сервера и убедитесь, что SSH проверяется. Сервер может быть любым сервером, на котором у вас есть логин и пароль . Я использую один здесь под названием BLUEBIRD как У меня есть это!

  2. На странице подключения-> ssh-> туннели снимите оба параметра вверху («Локальные порты принимают ...» и «Удаленные порты делают то же самое»).

  3. Введите 9999 (или любой порт выше 1024 в качестве порта источника.

  4. В пункте назначения, введите хост базы данных и порт как на TNSNAMES. В моем случае это сервер под названием GREENBIRD и порт из

  5. Введите это в качестве сервера: порт

  6. поскольку порт пересылается на рабочем столе, установите флажок «Local» вариант..Оставьте «Авто» также для версии IP.

  7. Нажмите кнопку «Добавить». Вы увидите L9999 greenbird: 1521 (ваш будет отличаться) в списке переадресованных портов.

  8. Перейдите на страницу сеанса еще раз, введите имя для сохраненной сессии и нажмите «Сохранить».

  9. Нажмите, чтобы открыть. Поставьте имя пользователя и пароль для сервера (BLUEBIRD в моем случае). Вы войдете в обычную сессию ssh на сервер с именем BLUEBIRD.

+0

Отправлено. В этом вопросе не упоминается шпатлевка. – zb226

0

MJ! Ваш туннель предназначен только для первоначального подключения tcp, ваш собственный порт LISTEN не туннелирован и, вероятно, не реализован. Брандмауэр должен подключиться к вам, подобно активному FTP. Все порты для Oracle документированы довольно широко, начиная со страницы 670 «Создание интернет-брандмауэров» 2/E Глава 23, пункт: Oracle SQL * Net и Net8. Вы можете просмотреть его на SafariBooksOnline.com

ISBN 1565928718