Что такое TNS: слушатель в контексте Oracle? - PullRequest
12 голосов
/ 25 января 2010

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

Я пытаюсь подключиться к базе данных 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: слушатель или SID в контексте Oracle (у меня есть смутные идеи, но смутные идеи редко помогают, когда вы отлаживаете что-то вроде этого)

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

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

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

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

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

    LSNRCTL> services

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

Ответы [ 3 ]

8 голосов
/ 25 января 2010

Имя 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)
    )
  )
2 голосов
/ 28 декабря 2012

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

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

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

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

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

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

1 голос
/ 25 января 2010

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

НТН

С

...