Почему sqlplus не подключается? - PullRequest
7 голосов
/ 17 апреля 2009

Моя цель - подключиться к экземпляру Oracle 9i с моего компьютера с OS X. Я следовал инструкциям по установке здесь и прошел их без ошибок (в конце концов). Однако я обнаружил, что sqlplus не может подключиться:

[ ethan@gir ~ ]$ sqlplus xxx/yyy@zzz

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Apr 17 10:13:08 2009

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Looooong подождите ...

ERROR:
ORA-12170: TNS:Connect timeout occurred

Enter user-name: xxx
Enter password: 
ERROR:
ORA-12162: TNS:net service name is incorrectly specified

Enter user-name:

Мой tnsnames.ora файл ...

zzz =
  (DESCRIPTION = 
    (ADDRESS_LIST =
      (ADDRESS =
        (PROTOCOL = TCP)
        (HOST = dbhost)
        (PORT = 1521))
    )
  (CONNECT_DATA =
    (SERVICE_NAME = zzz)
  )
)

Может быть, есть переменная env, которую нужно установить?


UPDATE

Возможность пинговать хост-компьютер БД без проблем.

Пробовал ...

sqlplus xxx/yyy@//dbhost/zzz

Got ...

ERROR:
ORA-12170: TNS:Connect timeout occurred

Попробовал использовать SID вместо SERVICE_NAME в tnsnames.ora. Не похоже, чтобы изменить результат. Возвращен обратно к SERVICE_NAME.


Последние записи пары в sqlnet.log ...

***********************************************************************
Fatal NI connect error 12170.

  VERSION INFORMATION:
    TNS for MacOS X Server: Version 10.2.0.4.0 - Production
    TCP/IP NT Protocol Adapter for MacOS X Server: Version 10.2.0.4.0 - Production
  Time: 17-APR-2009 10:33:06
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535
    TNS-12535: Message 12535 not found; No message file for product=network, facility=TNS
    ns secondary err code: 12560
    nt main err code: 505
    TNS-00505: Message 505 not found; No message file for product=network, facility=TNS
    nt secondary err code: 60
    nt OS err code: 0


***********************************************************************
Fatal NI connect error 12170.

  VERSION INFORMATION:
    TNS for MacOS X Server: Version 10.2.0.4.0 - Production
    TCP/IP NT Protocol Adapter for MacOS X Server: Version 10.2.0.4.0 - Production
  Time: 17-APR-2009 11:24:08
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535
    TNS-12535: Message 12535 not found; No message file for product=network, facility=TNS
    ns secondary err code: 12560
    nt main err code: 505
    TNS-00505: Message 505 not found; No message file for product=network, facility=TNS
    nt secondary err code: 60
    nt OS err code: 0

ЧАСТИЧНЫЙ ОТВЕТ

Спасибо всем за ваши ответы. Они были полезны. Я обнаружил, что была проблема с DNS. Мне удалось пинговать по имени хоста, поэтому подумал, что должно работать нормально. Я также попробовал И.П. адрес. Оказалось, что мне нужен внутренний"10.1.x.x" И.П. адрес, чтобы он работал на этом компьютере с OS X (но имя хоста хорошо в Windows).

На данный момент, я могу подключиться с ...

sqlplus xxx/yyy@//INTERNAL_IP/zzz

Однако с этими значениями, введенными в tnsnames.ora, это все равно не работает ...

sqlplus xxx/yyy@zzz

...

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

Я искал образец файла tnsnames.ora, который был близок к тому, что мне было нужно, и скопировал содержимое в мой файл. Изменились параметры и теперь все работает. Не уверен, почему мой не работал.

Ответы [ 9 ]

8 голосов
/ 17 апреля 2009

Поскольку вы используете клиент 10g, рекомендуется использовать синтаксис Easy Connect вместо:

export TWO_TASK=//dbhost/zzz
sqlplus xxx/yyy

, или просто так:

sqlplus 'xxx/yyy@//dnhost/zzz'

Также проверьте ваши ORACLE_HOME точки на нужную папку: tnsnames.ora ищется в $ORACLE_HOME/network/admin/tnsnames.ora

4 голосов
/ 17 апреля 2009

Ваши скобки кажутся правильными.

Попробуйте использовать SID:

Ниже приведен пример файла tnsnames.ora:

IDENTIFIER =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP) (HOST = userid.myhosteddb.net)(PORT = 1521))
    )
    (CONNECT_DATA = (SID = odb))
  )

Подробнее о SID читайте здесь.

2 голосов
/ 25 марта 2010

Вы можете использовать

sqlplus user/password@servicename_host

если вы не можете подключиться, вы можете использовать

sqlplus user/password@(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))

если вы используете linux другую * Nix OS, вам нужно использовать кавычки, иначе () интерпретируется оболочкой

1009 * например *

sqlplus user/password@'(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))'
1 голос
/ 03 апреля 2015

У меня была похожая проблема, и похоже, что Oracle sqlplus был проблемой!

Подключение как любая из этих работ:

   > sqlplus MyUsername/MyPassword@MyHostname:1521/MyServiceName
   > sqlplus MyUsername/MyPassword@//MyHostname:1521/MyServiceName

(// необязательно перед именем хоста). Тем не менее, сбрасывая пароль или оба пользователя / пароль не удается, как это:

    sqlplus @//MyHostname:1521/MyServiceName

    SQL*Plus: Release 11.2.0.4.0 Production on Thu Apr 2 15:59:49 2015

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

    SP2-0310: unable to open file "//MyHostname:1521/MyServiceName.sql"
    Enter user-name: MyUsername
    Enter password: MyPassword
    ERROR: 
    ORA-12162: TNS:net service name is incorrectly specified

Таким образом, даже несмотря на то, что sqlplus запрашивает у вас имя пользователя / пароль, он глупо завершится ошибочным сообщением об ошибке, если вы введете их в командной строке. Это работает, только если вы поместите их (оба!) В начало строки подключения.

Глупый Оракул !!!

1 голос
/ 18 апреля 2009

Вы настроили свою среду с помощью скрипта oraenv ?

Вы пробовали tnsping?

$ tnsping $ORACLE_SID

Возможно, это поможет сравнить выходные данные на машине, которая подключается к выходу на машине, которая не может подключиться. По крайней мере, это то, что я делаю перед тем, как связаться с нашим администратором базы данных.

Вы можете получить более подробную информацию о том, в чем ошибка, с помощью команды oerr:

$ oerr ora 12170
12170, 00000, "TNS:Connect timeout occurred"
// *Cause:  The server shut down because connection establishment or
// communication with a client failed to complete within the allotted time
// interval. This may be a result of network or system delays; or this may
// indicate that a malicious client is trying to cause a Denial of Service
// attack on the server.
// *Action: If the error occurred because of a slow network or system,
// reconfigure one or all of the parameters SQLNET.INBOUND_CONNECT_TIMEOUT,
// SQLNET.SEND_TIMEOUT, SQLNET.RECV_TIMEOUT in sqlnet.ora to larger values.
// If a malicious client is suspected, use the address in sqlnet.log to
// identify the source and restrict access. Note that logged addresses may
// not be reliable as they can be forged (e.g. in TCP/IP).
1 голос
/ 17 апреля 2009

Вы пытались использовать telnet, чтобы добраться до открытого порта, чтобы убедиться, что брандмауэр не блокирует вас? может стоит попробовать telnet port-num host

1 голос
/ 17 апреля 2009

Вероятно, в вашем рабочем каталоге создается файл sqlnet.log. Это может помочь вам, или если вы опубликуете его содержание, это может дать нам больше информации.

В вашем примере вы пробуете две разные вещи. В командной строке вы использовали "xxx / yyy @ zzz". Похоже, что это успешно находит запись «zzz» в tnsnames.ora, но тайм-аут указывает, что он не получает никакого ответа от сервера. Вы можете успешно пропинговать dbhost?

Со второй попытки вы просто ввели «xxx» для имени пользователя; это имеет смысл, если вы не привыкли к SQLPlus, но, как вы можете видеть, нет смысла запрашивать имя базы данных. Таким образом, в этом случае он пытался подключиться к «xxx / yyy» без имени службы, что привело ко второй ошибке. Это просто означает, что у вас не установлено имя службы по умолчанию. Так что эта ошибка происходит из-за неполного ввода. (Вы должны ввести «xxx @ zzz» для имени пользователя, чтобы указать имя службы в этом приглашении. Вы можете фактически ввести всю строку подключения «xxx / yyy @ zzz» в приглашении имени пользователя, если вы не возражаете против того, чтобы пароль был виден.)

0 голосов
/ 22 октября 2013

У меня была та же ошибка (ORA-12162: TNS: имя сетевой службы указано неверно), но другая причина (в Windows 7 Enterprise 64-bit). Надеюсь, это кому-нибудь поможет:

I.T. на моей работе был установлен 32-битный и 64-битный Oracle, и на основе моей переменной PATH оболочка искала SQLPLUS.exe в 64-битном пути по сравнению с 32-битным.

В разных путях используются разные файлы TNSNAMES.ora, и у меня не было строки подключения в 64-битном пути:

Oracle \ продукт \ 11.1.0 \ client_1_64bit \ сеть \ Admin \ TNSNames.ora

У меня была только строка подключения в 32-битном TNSNAMES.ora: Oracle \ продукт \ 11.1.0 \ client_1_32bit \ сеть \ Admin \ TNSNames.ora

Кроме того, поскольку было несколько установок ORACLE, мне пришлось удалить переменную среды ORACLE_HOME, чтобы обе установки могли использовать разные домашние каталоги.

0 голосов
/ 10 сентября 2013

СЛЕДУЙТЕ ЭТОМ ССЫЛКАМ НА ШАГ ПО ШАГОВУЮ УСТАНОВКУ И МЕТОДЫ ПОЧТОВОЙ УСТАНОВКИ.

А для связи с sql plus:

  1. ИМЯ ПОЛЬЗОВАТЕЛЯ БУДЕТ СИСТЕМОЙ В СООТВЕТСТВИИ С ИНСТРУКЦИЕЙ, ВЫДЕЛЕННОЙ ВЫШЕ ССЫЛКОЙ
  2. ваш пароль НЕ ДОЛЖЕН быть тигром, а тот, который вы указали в начале установки

P.S: не паникуйте, если обнаружите проблему (несовместимость браузера) при подключении Oracle Enterprise Manager во время тестирования установки, если ваш браузер - Google Chrome. нажмите стрелку на задней странице и стрелку на следующей странице, чтобы согласовать условия, и нажмите кнопку ОК.

Я решил эту проблему на своей машине за один день ... но это будет за пару часов.

Soruces: я инженер по компьютерным наукам, в основном код на Java

...