Database
 sql >> база данни >  >> RDS >> Database

Как да коригирам ORA-12505, TNS:слушателят в момента не знае за SID, даден в дескриптора на свързване

За да разрешим правилно тази грешка и да се свържем с подходящата база данни на Oracle, ще трябва да изложим малко как се държи Oracle и следователно какво причинява този проблем на първо място.

SID срещу SERVICE_NAMES

Важно е да се разбере (леката) разлика между това, което Oracle дефинира като SID в сравнение с SERVICE_NAME , тъй като по-късно ще използваме тази информация, за да създадем правилен низ за връзка.

В Oracle системният идентификатор (или SID ) е локален идентификатор с дължина до осем знака, който се използва за идентифициране на конкретна база данни и разграничаването й от други бази данни в системата.

Често SID е представката или DB_UNIQUE_NAME който предхожда DB_DOMAIN . Например SID от нашата bookstore база данни, както се вижда в пълното global database name на bookstore.company.com .

SERVICE_NAMES , от друга страна, представляват имената, с които могат да бъдат свързани екземпляри на база данни. SERVICE_NAME обикновено следва формата на SID последвано от домейна на базата данни, така:DB_UNIQUE_NAME.DB_DOMAIN

TNS слушателят

Когато клиент се опитва да се свърже с база данни на Oracle, вместо да се свързва с базата данни директно , има брокерска услуга, която се намесва и обработва заявката за връзка за клиента.

Това приложение за брокер е известно като listener и изпълнява задачата слушане за входящи заявки от клиенти. Когато бъде получена заявка, listener обработва и препраща тази заявка към подходящия сървър на база данни на Oracle, използвайки service handler , който просто действа като връзка между listener и сървъра на базата данни.

TNS имена и конфигурация

Когато се свързвате към база данни на Oracle, обикновено вашият сървър на база данни ще има tnsnames.ora , който е конфигурационен файл, който информира сървъра за NET_SERVICE_NAMES които са валидни връзки към базата данни. По подразбиране този файл се намира в ORACLE_HOME/network/admin .

Например NET_SERVICE_NAME дескриптор в tnsnames.ora може да бъде форматиран така:

myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Това би дефинирало NET_SERVICE_NAME като използвате SERVICE_NAME обсъдихме по-рано (bookstore.company.com ) и свързване към localhost през порт 1521 .

Низ за връзка

С малко повече познания за това как Oracle всъщност се свързва с бази данни, сега можем да разгледаме как connection strings са форматирани.

Свързване чрез TNS име/NET_SERVICE_NAME

При свързване през NET_SERVICE_NAME както е посочено във вашия tnsnames.ora config файл, трябва да използвате username , password и след това добавете NET_SERVICE_NAME с @ символ, така:

username/password@NET_SERVICE_NAME

Така за предишния ни NET_SERVICE_NAME дескриптор по-горе, действителният NET_SERVICE_NAME дефинирахме е myDatabaseNetService , така че нашият низ за връзка може да изглежда така:

john/Hunter2@myDatabaseNetService

Свързване чрез SERVICE_NAME

При свързване през SERVICE_NAME , ще трябва също да добавите host и port , заедно с / символ, предхождащ SERVICE_NAME себе си:

username/password@host:port/SERVICE_NAME

Свързване чрез SID

И накрая, ако се свързвате без конфигуриран NET_SERVICE_NAME или дори SERVICE_NAME , можете да го направите директно чрез SID като използвате : символ вместо / символ както при SERVICE_NAME низ за свързване:

username/password@host:port:SID

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Първичен ключ в SQL:Всичко, което трябва да знаете за операциите с първичен ключ

  2. Могат ли да съществуват множество първични ключове на една маса?

  3. Броячи на PerfMon на коляното:Продължителност на живота на страницата

  4. Преименуване на Pluggable база данни

  5. Ръководство за функциите на PubNub