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