Что такое TNS:listener в контексте Oracle?

Вопрос Borderline ServerFault, но я решил сначала попробовать здесь, так как в прошлом мне везло с вопросами Oracle.

Я пытаюсь подключиться к базе данных оракула из PHP и получаю следующую ошибку.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

Это ошибка, о которой сообщает PHP, и ошибка, которая отображается в Oracle listener.log.

Моя непосредственная проблема - исправить эту ошибку. Более крупный вопрос, на который я хотел бы получить ответ, заключается в том, как работает модель соединения Oracle?

Это среда разработки, которая работает на моем локальном компьютере с Windows и работает до сих пор. К сожалению, среда была передана мне (не я ее настраивал), и люди, которые настраивали ее, не могут помочь мне в ее отладке.

Если бы я получал аналогичную ошибку с MySQL или PostgreSQL (две системы, с которыми я более знаком), я бы проверил, чтобы убедиться, что процесс базы данных запущен, а затем попытался подключиться к базе данных вручную, используя имя пользователя/пароль/ строка подключения. К сожалению, я не знаком с инструментами Oracle для Windows (кроме SQL Developer) и не знаю, что такое TNS:listener или SID в контексте Oracle (у меня есть смутные идеи, но смутные идеи редко помогают, когда вы отлаживаете что-то вроде этого)

Любые общие советы будут оценены.

Обновления по комментариям:

В моем файле tnsnames.ora есть несколько целых, соответствующая запись

OBS2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = OBS2)
    )
  )

Это не отражается в списке экземпляров, когда я запускаю

    LSNRCTL> services

Поэтому я думаю, что мой следующий вопрос: как мне попытаться вручную запустить экземпляр OBS2?


person Alan Storm    schedule 25.01.2010    source источник
comment
Запись TNS является частью строки подключения к Oracle.   -  person OMG Ponies    schedule 25.01.2010


Ответы (3)


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

Затем вы можете проверить, правильно ли прослушиватель TNS видит службу, используя инструмент командной строки:

%>lsnrctl services

Который должен вывести что-то вроде следующего:

Service "myservice" has 1 instance(s).
  Instance "myinstance", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER <machine: LOCALHOST, pid: 12345>
         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))

Не могли бы вы опубликовать соответствующую запись TNS (в файле tnsnames.ora)? Он находится в ORAHOME\client или db\ADMIN\NETWORK. Если у вас есть и клиент, и сервер, убедитесь, что обе копии файла tnsnames.ora имеют правильные значения, просто на всякий случай.

Вот пример правильного определения имени TNS в tnsnames.ora под названием «mydb»:

myDbAlias =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myservice)
    )
  )
person Mike Atlas    schedule 25.01.2010
comment
Обновленный вопрос с соответствующей информацией. Похоже, что соответствующая запись TNS не отображается в прослушивателе. Есть ли способ вручную запустить экземпляр TNS? Также возможна релевантность; Если я использую dbca и пытаюсь настроить параметры базы данных для рассматриваемой базы данных/схемы (правильный термин?), я получаю следующую ошибку: ORA-02778: Имя, указанное для каталога журнала, недопустимо. Я решил свою проблему, создав новую базу данных и импортировав недавний дамп, но меня все еще интересуют любые методы отладки для такого рода вещей. - person Alan Storm; 25.01.2010
comment
Вы сказали, что работаете в Windows, поэтому вы должны увидеть, запущена ли служба в компоненте оснастки служб Windows. Пуск->Инструменты администратора->Службы. Посмотрите, есть ли OracleServiceOBS2 (я предполагаю, что это имя, оно может быть другим). Затем начните оттуда. Ваш сервис прослушивателя TNS тоже находится там же и называется как-то вроде OracleOraDb10g_home_1TNSListener. - person Mike Atlas; 26.01.2010
comment
Итак, я думаю, что меня здесь смущает то, как одна база данных оракула может работать, а другая - нет. То есть, когда я перечислил службы, я увидел, что другие базы данных (OBS3, OBS4 и т. д.) работают. Все ли базы данных контролируются OracleServiceOBS2 или каждая база данных получает свой собственный OracleServiceOBS2? (извините, если это не имеет смысла, но я не знаю, чего я здесь не знаю!) - person Alan Storm; 26.01.2010
comment
Вы просто немного не знакомы с выбором Oracle терминологии, исходящей из другой системы. Ознакомьтесь с этой темой SO: stackoverflow.com/questions/1087076/ - person Mike Atlas; 26.01.2010
comment
Также эта ссылка: club-oracle. ком/форумы/ - person Mike Atlas; 26.01.2010
comment
Особенно стоит прояснить: экземпляр может иметь несколько табличных пространств (вы называете их базами данных?). - person Mike Atlas; 26.01.2010
comment
Да, тут явно проблемы с терминологией. В MySQL у вас может быть база данных с именем Foo, содержащая две таблицы с именами bar и baz. - person Alan Storm; 26.01.2010
comment
А в Oracle база данных — это скорее общий термин для набора объектов, некоторые из которых относятся к таблицам. Мой любимый клиент для разработки — бесплатный SQL Developer. Вы можете подключиться через имена TNS в качестве теста, чтобы проверить, правильно ли они настроены, или подключиться с помощью необработанных подключений в качестве запасного варианта. oracle.com/technology/products/database/sql_developer/ - person Mike Atlas; 26.01.2010

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

Во-первых, ключевые слова SID и SERVICE_NAME не совсем совпадают. Это было мое первое неправильное предположение. Во многих средах вы можете поменять местами SID и SERVICE_NAME, но не всегда, это зависит от обстоятельств.

Тем не менее, ваша ошибка выдает проблему: вы указываете SID в строке подключения вместо SERVICE_NAME, которое успешно использует tnsnames.

Итак, если вы указываете строку подключения в своем коде, попробуйте использовать ключевое слово SERVICE_NAME в строке подключения (*или, если вы уже используете SERVICE_NAME и не можете подключиться, попробуйте использовать ключевое слово SID*).

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

Надеюсь, это поможет.

person tbone    schedule 28.12.2012

Ответ Майка Атласа довольно исчерпывающий, но обратите внимание, что вы можете подключаться к 10g (или более поздним) БД, у которых нет опубликованного имени tns, используя [//] host_name [: port] [/ service_name]

ХТН

C.

person symcbean    schedule 25.01.2010