Почему sqlplus не подключается?

Моя цель - подключиться к экземпляру 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?


ОБНОВИТЬ

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

Пытался...

sqlplus xxx/yyy@//dbhost/zzz

Есть...

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. Я смог выполнить ping по имени хоста, поэтому подумал, что все должно работать нормально. Я также попробовал I.P. адрес. Оказалось, что мне нужен был внутренний "10.1.x.x" I.P. адрес для его работы на этой машине 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, который был близок к тому, что мне было нужно, и скопировал его содержимое в свой файл. Поменял параметры и теперь все работает. Не уверен, почему мой не работал.


person Ethan    schedule 17.04.2009    source источник


Ответы (9)


Поскольку вы используете клиент 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

person Quassnoi    schedule 17.04.2009
comment
Я думаю, что он, должно быть, отлично находит файл tnsnames, так как он не жалуется, что zzz - неизвестный сервис. - person Dave Costa; 17.04.2009

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

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

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

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

Прочтите о SID здесь.

person aintnoprophet    schedule 17.04.2009

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

sqlplus user/password@servicename_host

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

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

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

e.g

sqlplus user/password@'(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))'
person Chars    schedule 25.03.2010

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

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

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

person Dave Costa    schedule 17.04.2009
comment
Да, я могу пропинговать хост БД, указанный в моем файле tnsnames.ora. - person Ethan; 17.04.2009

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

person trent    schedule 17.04.2009
comment
Я могу подключиться к этой БД с других машин с помощью таких инструментов, как SQLDeveloper, поэтому я знаю, что хост разрешает соединения. - person Ethan; 17.04.2009
comment
Но блокирует ли локальный брандмауэр исходящие соединения? - person trent; 22.04.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).
person Jon Ericson    schedule 17.04.2009
comment
У меня есть инструменты, которые поставляются с Oracle Instant Client для OS X. Это включает sqlplus, но, похоже, у меня нет команды tnsping. - person Ethan; 18.04.2009
comment
Что такое переменная $ ORACLE_SID? Это не в моем окружении. Это должно быть? - person Ethan; 18.04.2009
comment
У меня нет опыта работы с Oracle Instant Client. Я почти уверен, что для использования сценария установки oraenv необходимо указать $ ORACLE_SID. Похоже, вам здесь не хватает некоторых деталей. - person Jon Ericson; 18.04.2009

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

Подключение похоже на любой из этих вариантов:

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

(// перед именем хоста необязательно). Однако отказ от пароля или обоих user / pass не выполняется следующим образом:

    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 запрашивает у вас имя пользователя / пароль, он по глупости выйдет из строя с ложным сообщением об ошибке, если вы введете их в командной строке. Это работает, только если вы поместите их (оба!) В начало строки подключения.

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

person Alan Thompson    schedule 02.04.2015

СЛЕДУЙТЕ ЭТОМ ССЫЛКА ДЛЯ ПОШАГОВОЙ УСТАНОВКИ И МЕТОДОВ ПОСЛЕ УСТАНОВКИ. БУДЬТЕ С ЭТИМ ВНИМАТЕЛЬНЫМ ОБРАЗОМ.

И для подключения к sql plus:

  1. ИМЯ ПОЛЬЗОВАТЕЛЯ WiLL BE system в соответствии с инструкцией, приведенной выше по ссылке.
  2. ваш пароль НЕ ДОЛЖЕН БЫТЬ тигром, а тот, который вы установили в начале установки

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

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

soruces: я инженер по информатике, в основном кодирую на java

person SAGAR MANOCHA    schedule 10.09.2013

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

ЭТО. на моей работе был установлен 32-битный и 64-битный Oracle, и на основе моей переменной PATH оболочка просматривала 64-битный путь для SQLPLUS.exe по сравнению с 32-битным путем.

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

Oracle \ продукт \ 11.1.0 \ client_1_64bit \ network \ admin \ TNSNAMES.ora

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

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

person Mr_Moneybags    schedule 21.10.2013