sql >> Databáze >  >> RDS >> Database

Jak opravit ORA-12505, TNS:listener aktuálně neví o SID uvedeném v deskriptoru připojení

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

  1. Při spouštění aplikace ověřte připojení k databázi pomocí pg-promise

  2. Podrobný pohled na indexování databáze

  3. Jak nainstalovat PgBackRest

  4. jak používat datový typ Blob v Postgresu