Что такое TNS: слушатель в контексте Oracle?
-
22-09-2019 - |
Вопрос
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.