Что такое TNS: слушатель в контексте Oracle?

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

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

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

это ошибка, которую сообщает PHP, и ошибка, которая появляется в прослушивателе Oracle.бревно.

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

Это в среде разработки, которая работает на моей локальной машине windows и работает до сих пор. К сожалению, окружающая среда была передана мне (я ее не настраивал) и людям, которые сделал set it up недоступны, чтобы помочь мне отладить его.

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

любой общий совет был бы признателен.

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

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

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

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

    LSNRCTL> services

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

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 (в )? Он расположен в 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)
    )
  )

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

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

тем не менее, ваша ошибка выдает проблему: вы указываете ОМР в строке подключения вместо ИМЯ_СЛУЖБЫ что tnsnames успешно использует.

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

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

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


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

HTH

С.