Abychom správně vyřešili tuto chybu a připojili se k příslušné databázi Oracle, budeme muset trochu vysvětlit, jak se Oracle chová, a tedy co je příčinou tohoto problému.
SID vs SERVICE_NAMES
Je důležité pochopit (nepatrný) rozdíl mezi tím, co Oracle definuje jako SID ve srovnání se službou SERVICE_NAME , protože tyto informace později použijeme k vytvoření správného připojovacího řetězce.
V Oracle je systémový identifikátor (nebo SID ) je lokální identifikátor o délce až osmi znaků, který se používá k identifikaci konkrétní databáze a její odlišení od ostatních databází v systému.
Často SID je slovo předpony nebo DB_UNIQUE_NAME který předchází DB_DOMAIN . Například SID našeho bookstore databáze, jak je vidět v úplném global database name z bookstore.company.com .
SERVICE_NAMES , na druhé straně představují názvy, pomocí kterých lze instance databáze připojit. SERVICE_NAME bude obvykle odpovídat formátu SID následuje doména databáze, například:DB_UNIQUE_NAME.DB_DOMAIN
TNS Listener
Když se klient pokouší připojit k databázi Oracle, místo aby se k databázi připojoval přímo , existuje služba brokera, která zasahuje a zpracovává žádost o připojení pro klienta.
Tato aplikace zprostředkovatele je známá jako listener a plní úlohu naslouchání pro příchozí požadavky klientů. Když je přijat požadavek, listener zpracuje a předá tento požadavek na příslušný databázový server Oracle pomocí service handler , který funguje pouze jako spojení mezi listener a databázový server.
Názvy a konfigurace TNS
Při připojování k databázi Oracle bude mít váš databázový server obvykle tnsnames.ora , což je konfigurační soubor, který informuje server o NET_SERVICE_NAMES což jsou platná databázová připojení. Ve výchozím nastavení je tento soubor umístěn na adrese ORACLE_HOME/network/admin .
Například NET_SERVICE_NAME deskriptor v tnsnames.ora může být formátován takto:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
To by definovalo NET_SERVICE_NAME pomocí SERVICE_NAME jsme diskutovali dříve (bookstore.company.com ) a připojení k localhost přes port 1521 .
Řetězec připojení
S trochu více znalostmi o tom, jak se Oracle skutečně připojuje k databázím, se nyní můžeme podívat na to, jak connection strings jsou naformátovány.
Připojit přes název TNS/NET_SERVICE_NAME
Při připojení prostřednictvím NET_SERVICE_NAME jak je uvedeno ve vašem tnsnames.ora konfiguračního souboru, musíte použít username , password a poté připojte NET_SERVICE_NAME pomocí @ symbol, třeba takto:
username/password@NET_SERVICE_NAME
Tedy pro naše předchozí NET_SERVICE_NAME deskriptor výše, skutečný NET_SERVICE_NAME definovali jsme myDatabaseNetService , takže náš připojovací řetězec může vypadat nějak takto:
john/Hunter2@myDatabaseNetService
Připojit přes SERVICE_NAME
Při připojení prostřednictvím SERVICE_NAME , budete také muset přidat host a port , spolu s / symbol před SERVICE_NAME sám:
username/password@host:port/SERVICE_NAME
Připojit přes SID
Konečně, pokud se připojujete bez nakonfigurovaného NET_SERVICE_NAME nebo dokonce SERVICE_NAME , můžete tak učinit přímo prostřednictvím SID pomocí : namísto / symbol jako u SERVICE_NAME připojovací řetězec:
username/password@host:port:SID