Использование oracle db через ssh туннель. Ошибка "ORA-12541: TNS: нет слушателя"
Здравствуйте, у меня проблема с доступом к базе данных Oracle из нашего центра обработки данных через туннель.
У нас есть довольно стандартный центр обработки данных с одним компьютером, доступным извне (я указал его IP в файле /etc/hosts как dc) и базу данных Oracle внутри. IP-адрес нашей базы данных Oracle во внутренней сети - 192.168.1.7.
Для создания туннеля я использую команду:
ssh -L 1521:192.168.1.7:1521 root@dc
и, конечно, это работает (иногда я также добавляю отладку -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/pass@testdb
Это начинает соединяться через туннель (я вижу это в отладке ssh), но затем это терпит неудачу, говоря:
./sqlplus username/pass@testdb
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 у нас есть 192.168.1.7, а не localhost).
Я также попытался использовать простую командную строку:
./sqlplus username/pass@//localhost:1521/testdb
или в качестве альтернативы
./sqlplus username/pass@//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=(PROGRAM=sqlplus@velvet)(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
где velvet - мое локальное имя хоста, а johndoe - мое локальное имя пользователя. Почему это отправлено на другую сторону?
ОБНОВИТЬ:
После более подробного исследования внутри центра обработки данных, оно выглядит следующим образом: - первое соединение идет к порту 1521 - но затем sqlplus перенаправляется на номер порта> 3300, который каждый раз отличается и увеличивается на 3 (по крайней мере, несколько попыток У меня было) - когда мы пытаемся подключиться через туннель, sqlplus попытается подключиться к локальному хосту, и он, очевидно, потерпит неудачу
Поэтому ошибка "No Listener" возникает, вероятно, из-за того, что мы не перенаправляем эти порты. Есть ли способ (возможно, какая-то опция в файле tnsnames.ora), чтобы заставить использовать какой-то определенный порт?
6 ответов
Загляните в Metalink ID 361284.1 (Редактировать: фактически не публично, но найти информацию здесь)
Похоже, Oracle Connection Manager будет вашим выбором. Он в основном обрабатывает перенаправления портов внутри брандмауэра. Я не использовал его раньше, поэтому не могу посоветовать вам дальше.
Обновление. Другой способ - использовать MTS, настроить диспетчеры с определенными портами и открыть эти порты в брандмауэре. Для этого вам не нужно устанавливать дополнительное программное обеспечение, но для подключения через общий сервер может потребоваться увеличение LARGE_POOL_SIZE, помимо прочего. Таким образом, вам все еще нужна роль DBA для изменения параметра DISPATCHERS. Вы также должны были бы отказаться от DB.
Обычно это должно работать. Я бы не использовал порт прослушивателя по умолчанию в качестве входа для туннеля ssh, но это не должно быть проблемой. Я также не хотел бы использовать учетную запись root для создания ssh-соединения, предпочтительно выделенную обычную учетную запись. Используете ли вы общие серверы или база данных является базой данных RAC с конфигурацией распределения нагрузки? Хорошее объяснение здесь Как я могу подключиться к базе данных ORACLE через туннельную цепочку SSH (двойной туннель, сервер в сети компании)? немного сложнее.....
проверкаобновлений DbVisualizer, теперь он имеет встроенное туннелирование ssh. Я думаю, что стоит хотя бы попробовать. Это не бесплатно, но хорошо. Многоплатформенная и многопользовательская база данных, очень гибкая
В моем случае проблема в том, что сервер БД имеет несколько IP-адресов, и когда я использовал SSH-туннель, он подключался к неправильному другому.
Поэтому попробуйте проверить, совпадает ли целевой IP-адрес с IP-адресом в файле listener.ora на сервере БД.
MJ! Ваш туннель предназначен только для начального соединения TCP, ваш собственный порт LISTEN не туннелирован и, вероятно, не реализован. Брандмауэр должен разрешить подключение обратно к вам, аналогично активному FTP. Все порты для Oracle достаточно подробно документированы, начиная со страницы 670 "Создание межсетевых экранов в Интернете" 2/E, глава 23, параграф: Oracle SQL*Net и Net8. Вы можете просмотреть его на SafariBooksOnline.com
ISBN 1565928718
Можете ли вы попытаться сделать трассировку, чтобы точно определить, что происходит:
Возможно, ваш слушатель еще не был запущен. Попробуйте запустить команду " lsnrctrl start ".
Также хорошим объяснением здесь является подключение к базе данных Oracle через безопасную оболочку SSH, которая работала для меня.
Откройте putty и на странице сеанса введите имя сервера и убедитесь, что установлен SSH. Сервер может быть любым сервером, к которому у вас есть логин и пароль для входа. Я использую один под названием BLUEBIRD, так как я им владею!
На странице connection->ssh->tunnels снимите оба флажка вверху ("Локальные порты принимают..." и "Удаленные порты делают то же самое").
Введите 9999 (или любой порт выше 1024 в качестве порта источника.
В месте назначения введите хост и порт базы данных согласно tnsnames. В моем случае это сервер под названием GREENBIRD и порт
Введите это как сервер: порт.
Поскольку перенаправляемый порт находится на вашем рабочем столе, установите флажок "Локальный". Оставьте "Авто" проверенным также и для версии IP.
Нажмите кнопку Добавить. Вы увидите L9999 greenbird:1521 (ваш будет отличаться) в списке переадресованных портов.
Снова перейдите на страницу сеанса, введите имя сохраненного сеанса и нажмите "Сохранить".
Нажмите открыть. Укажите имя пользователя и пароль для сервера (BLUEBIRD в моем случае). Вы войдете в обычный сеанс ssh на сервер с именем BLUEBIRD.