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