За да разрешим правилно тази грешка и да се свържем с подходящата база данни на 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