sql >> Database teknologi >  >> RDS >> Database

Sådan rettes ORA-12505, TNS:listener kender i øjeblikket ikke til SID givet i forbindelsesbeskrivelsen

For at løse denne fejl korrekt og oprette forbindelse til den relevante Oracle-database, bliver vi nødt til at forklare lidt om, hvordan Oracle opfører sig og derfor, hvad der forårsager dette problem i første omgang.

SID'er vs. SERVICE_NAMES

Det er vigtigt at forstå den (lille) forskel mellem, hvad Oracle definerer som en SID sammenlignet med en SERVICE_NAME , da vi vil bruge disse oplysninger til at oprette en ordentlig forbindelsesstreng senere.

I Oracle, systemidentifikationen (eller SID ) er en lokal identifikator på op til otte tegn i længden, der bruges til at identificere en bestemt database og differentiere den fra andre databaser på systemet.

Ofte SID er præfikset eller DB_UNIQUE_NAME der går forud for DB_DOMAIN . For eksempel SID fra vores bookstore database, som det ses i det fulde global database name af bookstore.company.com .

SERVICE_NAMES , på den anden side repræsenterer de navne, som databaseinstanser kan forbindes med. En SERVICE_NAME vil typisk følge formatet for SID efterfulgt af databasedomænet, som sådan:DB_UNIQUE_NAME.DB_DOMAIN

TNS-lytteren

Når en klient forsøger at oprette forbindelse til en Oracle-database i stedet for at oprette forbindelse til databasen direkte , er der en mæglertjeneste, der griber ind og håndterer forbindelsesanmodningen for klienten.

Denne mæglerapplikation er kendt som listener og den udfører opgaven at lytte for indkommende kundeønsker. Når en anmodning modtages, vil listener behandler og videresender denne anmodning til den relevante Oracle-databaseserver ved hjælp af en service handler , som bare fungerer som forbindelsen mellem listener og databaseserveren.

TNS-navne og -konfiguration

Når du opretter forbindelse til en Oracle-database, vil din databaseserver typisk have tnsnames.ora , som er en konfigurationsfil, der informerer serveren om NET_SERVICE_NAMES som er gyldige databaseforbindelser. Som standard er denne fil placeret på ORACLE_HOME/network/admin .

For eksempel en NET_SERVICE_NAME deskriptor i tnsnames.ora kan formateres som dette:

myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Dette ville definere en NET_SERVICE_NAME ved hjælp af SERVICE_NAME vi diskuterede tidligere (bookstore.company.com ) og opretter forbindelse til localhost gennem port 1521 .

Forbindelsesstreng

Med lidt mere viden om, hvordan Oracle rent faktisk forbinder til databaser, kan vi nu se på, hvordan connection strings er formateret.

Opret forbindelse via TNS-navn/NET_SERVICE_NAME

Når du opretter forbindelse via en NET_SERVICE_NAME som angivet i din tnsnames.ora config-fil, skal du bruge username , password , og tilføj derefter NET_SERVICE_NAME med @ symbol, som sådan:

username/password@NET_SERVICE_NAME

Således for vores tidligere NET_SERVICE_NAME beskrivelsen ovenfor, den faktiske NET_SERVICE_NAME vi definerede var myDatabaseNetService , så vores forbindelsesstreng kan se sådan ud:

john/Hunter2@myDatabaseNetService

Opret forbindelse via SERVICE_NAME

Når du opretter forbindelse via en SERVICE_NAME , skal du også tilføje host og port , sammen med / symbol foran SERVICE_NAME selv:

username/password@host:port/SERVICE_NAME

Opret forbindelse via SID

Endelig, hvis du opretter forbindelse uden en konfigureret NET_SERVICE_NAME eller endda SERVICE_NAME , kan du gøre det direkte gennem SID ved at bruge : symbol i stedet for / symbol som med SERVICE_NAME forbindelsesstreng:

username/password@host:port:SID

  1. Jeg prøver at kopiere en fil, men får fejlmeddelelse

  2. SQLSTATE[HY093]:Ugyldigt parameternummer:parameter blev ikke defineret

  3. MySQL offset uendelige rækker

  4. MySQL – Forskellige metoder til at kende nuværende bruger