Здравствуйте! У меня проблема с доступом к БД Oracle из нашего центра обработки данных через туннель.
У нас есть довольно стандартный центр обработки данных, в котором одна машина доступна снаружи.
(Я помещаю его IP в файл / etc / hosts как dc), а внутри Oracle DB. IP-адрес нашей базы данных Oracle во внутренней сети: 192.168.1.7
Для создания туннеля я использую команду:
ssh -L 1521:192.168.1.7:1521 root@dc
и, конечно, это работает (иногда я также добавляю некоторую команду debug -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 HOST у нас 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 - мое локальное имя пользователя.
Почему оно отправлено на другую сторону?
UPDATE:
После небольшого исследования внутри центра обработки данных, оно выглядит следующим образом:
- первое соединение идет к порту 1521
- но затем sqlplus перенаправляется на номер порта> 3300, который каждый раз отличается и увеличивается на 3 (по крайней мере, несколько попыток у меня было)
- когда мы пытаемся подключиться через туннель, sqlplus попытается подключиться к локальному хосту, и он, очевидно, потерпит неудачу
Таким образом, ошибка «No Listener» возникает, вероятно, из-за того, что мы не перенаправляем эти порты. Есть ли способ (возможно, какая-то опция в файле tnsnames.ora) принудительно использовать какой-то определенный порт?