Вопрос

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

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

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

Это ошибка, о которой сообщает PHP, и ошибка, которая появляется в Oracle's Listener.log.

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

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

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

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

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

В моем файле tnsnames.ora есть ряд Entires, соответствующая запись -

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

Это не отражено в списке случаев, когда я бегу

    LSNRCTL> services

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

Это было полезно?

Решение

Имя 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)
    )
  )

Другие советы

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

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

Тем не менее, ваша ошибка раздает проблему: вы указываете Сидень в строке соединения вместо НАИМЕНОВАНИЕ УСЛУГИ Эти TNSNAME успешно используют.

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

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

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

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

Hth

C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top