ORA-12514 TNS:luisteraar weet momenteel niet welke service gevraagd wordt in connect descriptor

We hebben een applicatie die lokaal wordt uitgevoerd en waarbij de volgende fout optreedt:

ORA-12514: TNS:luisteraar weet momenteel niet welke service is aangevraagd
in verbindingsdescriptor

Ik heb de verbinding getest met TNSPingdie correct is opgelost en
Ik heb SQLPlusgeprobeerd om verbinding te maken, wat mislukte met dezelfde fout als hierboven. Ik heb deze syntaxis gebruikt voor SQLPlus:

sqlplus username/[email protected][or host name]

We hebben geverifieerd dat:

  • de TNS Listener op de server is actief.
  • Oracle zelf op de server is actief.

We zijn niet op de hoogte van wijzigingen die in deze omgeving zijn aangebracht.
Kunnen we nog iets testen?


Antwoord 1, autoriteit 100%

Ik had dit probleem en de oplossing was om ervoor te zorgen dat in tnsnames.orade SERVICE_NAMEeen geldige servicenaam is in je database. Om geldige servicenamen te achterhalen, kunt u de volgende zoekopdracht in oracle gebruiken:

select value from v$parameter where name='service_names'

Zodra ik tnsnames.oraheb bijgewerkt naar:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

toen rende ik:

sqlplus [email protected]

Succes!
De luisteraar vertelt je in feite dat welke servicenaam je ook gebruikt, geen geldige service is volgens de DB.

(*Ik draaide sqlplus van het Win7-clientwerkstation naar de externe database en gaf de DBA’s de schuld 😉 *)


Antwoord 2, autoriteit 24%

Ik weet dat dit een oude vraag is, maar nog steeds onbeantwoord. Het kostte me een dag van onderzoek, maar ik vond de eenvoudigste oplossing, althans in mijn geval (Oracle 11.2 op Windows 2008 R2) en wilde deze delen.

De fout, indien direct bekeken, geeft aan dat de luisteraar de servicenaam niet herkent. Maar waar bewaart het servicenamen? In %ORACLE_HOME%\NETWORK\ADMIN\listener.ora

De “SID_LIST” is precies dat, een lijst met SID’s en servicenamen die zijn gekoppeld in een indeling die u kunt kopiëren of opzoeken.

Ik heb de servicenaam van het probleem toegevoegd en in het configuratiescherm “Services” van Windows heb ik een “Herstart” uitgevoerd op de Oracle-luisterservice. Nu is alles goed.


Uw listener.ora-bestand kan er bijvoorbeeld in eerste instantie als volgt uitzien:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

… En om de servicenaam orclte laten herkennen, kunt u deze wijzigen in:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

Antwoord 3, autoriteit 9%

In mijn omstandigheden was de fout te wijten aan het feit dat de luisteraar de db-service niet had geregistreerd. Ik heb dit opgelost door de services te registreren. Voorbeeld:

Mijn beschrijving in tnsnames.ora:

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

Dus ik ga verder met het handmatig registreren van de service in de listener.ora:

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

Ten slotte, herstart de luisteraar met het commando:

> lsnrctl stop
> lsnrctl start

Klaar!


Antwoord 4, autoriteit 5%

Ik had dit probleem bij Windows server 2008 R2en Oracle 11g

ga naar Net Manager > Luisteraar > selecteer databaseservices uit de combox > “Global Database Name” moet hetzelfde zijn als “SID” en “Oracle Home Directory” moet correct zijn.

Als je geen gegevens hebt voor databaseservices, maak er dan een aan en stel de juiste globale database, siden oracle home in.


Antwoord 5, autoriteit 3%

Het starten van OracleServiceXXX vanuit de services.msc werkte voor mij in Windows.


Antwoord 6, autoriteit 2%

Dit zou eigenlijk een reactie moeten zijn op Brad Rippe‘s antwoord, maar helaas, niet genoeg rep. Dat antwoord bracht me 90% van de weg daarheen. In mijn geval plaatsten de installatie en configuratie van de databases vermeldingen in het tnsnames.ora-bestand voor de databases die ik gebruikte. Ten eerste kon ik verbinding maken met de database door de omgevingsvariabelen in te stellen (Windows):

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1

en vervolgens verbinding maken met

sqlplus / as sysdba

Vervolgens het commando uitvoeren van Brad Rippe’s antwoord:

select value from v$parameter where name='service_names';

toonde aan dat de namen niet exact overeenkwamen. De vermeldingen zoals gemaakt met Oracle’s Database Configuration Assistant waren oorspronkelijk:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase.mydomain.com)
    )
  ) 

De servicenaam uit de query was gewoon mydatabasein plaats van mydatabase.mydomain.com. Ik heb het tnsnames.ora-bestand bewerkt tot alleen de basisnaam zonder het domeingedeelte, zodat ze er als volgt uitzagen:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase)
    )
  ) 

Ik heb de TNS Listener-service opnieuw opgestart (ik gebruik vaak lsnrctl stopen lsnrctl startvanuit een beheerdersopdrachtvenster [of Windows Powershell] in plaats van het Services-configuratiescherm, maar beide werken.) Daarna kon ik verbinding maken.


Antwoord 7, autoriteit 2%

Ik had hetzelfde probleem. Voor mij, gewoon schrijven

sqlplus myusername/[email protected]

het is gelukt, door dit te doen maakt het verbinding met de standaard servicenaam, denk ik.


Antwoord 8

wat voor mij werkte was heel eenvoudig, ik moest de service alleen handmatig starten in de “Windows Services” (services.msc in cmd trompt).
mijn servicenaam is: OracleServiceXXXXX.


Antwoord 9

Ik had ook met hetzelfde probleem te maken gehad en heb er 3 dagen over gedaan om het op te graven.

Dit gebeurt vanwege uw verkeerde invoer van de TNS-service.

Controleer eerst of u verbinding kunt maken met de standby-database vanuit de primaire database met behulp van sql > sqlplus [email protected] as sysdba(orastandis een stand-by database).

Als u geen verbinding kunt maken, is er een probleem met de service. Corrigeer de invoer van de servicenaam in het TNS-bestand aan het primaire uiteinde.

Controleer de standby-database op dezelfde manier. Breng indien nodig ook hier de wijzigingen aan.

Zorg ervoor dat de parameter log_archive_dest_2de juiste servicenaam heeft.


Antwoord 10

Controleer of de database actief is. Log in op de server, stel de ORACLE_SID-omgevingsvariabele in op uw database-SID en voer SQL*Plus uit als een lokale verbinding.


Antwoord 11

Deze fout kan optreden wanneer een toepassing een nieuwe verbinding maakt voor elke database-interactie of de verbindingen niet correct worden gesloten. Een van de gratis tools om dit te controleren en te bevestigen is Oracle Sql-ontwikkelaar (hoewel dit niet de enige tool is die u kunt gebruiken om DB-sessies te controleren).

u kunt de tool downloaden van de oracle-site Sql Ontwikkelaar

hier is een screenshot van hoe u uw sessies kunt volgen. (als u veel sessies ziet opstapelen voor uw toepassingsgebruiker wanneer u de ORA-12514-fout ziet, is dit een goede indicatie dat u mogelijk een probleem met de verbindingspool heeft).

voer hier de afbeeldingsbeschrijving in


Antwoord 12

Ik heb dit probleem opgelost in mijn Linux-omgeving door het IP-adres van mijn machine bij te werken in het bestand /etc/hosts.

U kunt uw netwerk-IP (inet end.) verifiëren met:

$ifconfig

Kijk of je IP overeenkomt met het bestand /etc/hosts:

$cat /etc/hosts

Bewerk uw /etc/hosts-bestand, indien nodig:

$sudo gedit /etc/hosts

Dag.


Antwoord 13

Voor degenen die Oracle mogelijk in een VM draaien (zoals ik), ik zag dit probleem omdat mijn VM bijna geen geheugen meer had, wat OracleDB lijkt te hebben verhinderd om correct te starten/draaien. Het vergroten van mijn VM-geheugen en herstarten loste het probleem op.


Antwoord 14

Veel antwoorden hier, maar hier komt een werkend voorbeeld met code die u direct kunt kopiëren en plakken en testen:

Voor mij is de fout 12514 opgelost na het specificeren van de juiste SERVICE_NAME.
Je vindt dat op de server in het bestand tnsnames.oradat wordt geleverd met 3 vooraf gedefinieerde servicenamen (een daarvan is “XE”).

  1. Ik heb de Oracle Express-database OracleXE112 geïnstalleerd die al wordt geleverd met enkele vooraf geïnstalleerde demotabellen.
  2. Wanneer u het installatieprogramma start, wordt u om een wachtwoord gevraagd. Ik heb “xxx” ingevoerd als wachtwoord. (niet gebruikt in productie)
  3. Mijn server draait op de machine 192.168.1.158
  4. Op de server moet u expliciet toegang verlenen voor het proces TNSLSNR.exe in de Windows Firewall. Dit proces luistert op poort 1521.
  5. OPTIE A:Voor C# (.NET2 of .NET4) kunt u ODAC11downloaden, van waaruit u Oracle.DataAccess.dll aan uw project moet toevoegen. Daarnaast is deze DLL afhankelijk van: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), msvcr80.dll.
    Deze DLL’s moeten zich in dezelfde map bevinden als de EXE of u moet het DLL-pad opgeven in: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Schrijf op 64-bits machines bovendien naar HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPTIE B:als je ODAC12hebt gedownload, heb je Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), oraons nodig .dll, msvcr100.dll. Het registerpad is HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPTIE C:Als u geen enorme DLL’s van meer dan 100 MB wilt, moet u ODP.NET_Managed12.xxxxxxxx.zip downloaden waarin u Oracle.ManagedDataAccess.dlldie slechts 4 MB is en een pure beheerde DLL is die ook in 32-bits en 64-bits processen werkt en van geen enkele andere DLL afhankelijk is en geen registervermeldingen vereist.
  8. De volgende C#-code werkt voor mij zonder enige configuratie aan de serverzijde (alleen de standaardinstallatie):
met Oracle.DataAccess.Client;
of
met behulp van Oracle.ManagedDataAccess.Client;
....
string oradb = "Gegevensbron=(DESCRIPTION="
  + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
  + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));"
  + "Gebruikers-ID=SYSTEEM;Wachtwoord=xxx;";
met behulp van (OracleConnection conn = nieuwe OracleConnection(oradb))
{
  verbind.Open();
  met behulp van (OracleCommand cmd = new OracleCommand())
  {
    cmd.Verbinding = verbinding;
    cmd.CommandText = "selecteer TABLESPACE_NAME uit DBA_DATA_FILES";
    met behulp van (OracleDataReader dr = cmd.ExecuteReader())
    {
      terwijl (dr.Read())
      {
        listBox.Items.Add(dr["TABLESPACE_NAME"]);
      }
    }
  }
}

Als de SERVICE_NAME=XEfout is, krijg je fout 12514. De SERVICE_NAMEis optioneel. Je kunt het ook weglaten.


Antwoord 15

Voor degenen die spring-boot en jdbc gebruiken voor verbinding.
Je moet voorzichtig zijn bij het schrijven van jdbcUrl in application.properties

Met SID in databaseverbinding –
source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Met servicenaam in db-verbinding
globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Dit werkte voor mij 🙂


Antwoord 16

In mijn geval had de database onvoldoende schijfruimte. Waardoor hij niet reageerde. Toen ik dat probleem eenmaal had opgelost, werkte alles weer.


Antwoord 17

Ik kreeg dezelfde fout omdat de opgegeven externe SID verkeerd was:

> sqlplus $DATASOURCE_USERNAME/[email protected]$DB_SERVER_URL/$REMOTE_SID 

Ik heb de systeemdatabase opgevraagd:

selecteer * van global_name;

en vond mijn externe SID (“XE”).

Dan kon ik zonder problemen verbinding maken.


Antwoord 18

Voor mij werd dit veroorzaakt door het gebruik van een dynamisch ipadres tijdens installatie. Ik heb Oracle opnieuw geïnstalleerd met een statisch ipadres en toen was alles in orde


Antwoord 19

Het herstarten van de VM werkte voor mij


Antwoord 20

Mijn probleem is opgelost door de ‘SID’ in de URL te vervangen door ‘servicenaam’ en de juiste host.


Antwoord 21

tnslsnris up maar database is down.

Voor beginners in Oracle is het niet duidelijk dat de database down kan zijn terwijl verbindingen worden geaccepteerd.

Ik moest de database zo handmatig opstarten

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

En dan in sql console

startup

In mijn geval kon ik niet opstarten, maar kreeg ik een ander foutbericht en vond ik de oorzaak van een probleem – ik moest de hostnaam wijzigen en daarna functioneerde het automatisch opstarten van de database weer.


Antwoord 22

Ik heb onderstaande tijdelijke oplossing geïmplementeerd om dit probleem op te lossen.

  1. Ik heb de ORACLE_HOME ingesteld met de opdrachtprompt
    (klik met de rechtermuisknop op cmd.exe en Uitvoeren als systeembeheerder).

  2. Gebruikt onder commando

    set oracle_home="path to the oracle home"

  3. Ga naar Alle programma’s–> Oracle -ora home1–> Hulpprogramma’s voor configuratiemigratie–> Netbeheerder–> Luisteraar

  4. Selecteer Database Services in de vervolgkeuzelijst.
    Zowel de globale databasenaam als de SID zijn op hetzelfde ingesteld (ORCL in mijn geval).
    Oracle Home Directory instellen.

Oracle Net Manager-venstervoorbeeld uit Oracle-documentatie:
Oracle Net Manager-voorbeeld

  1. Klik op Bestand en sla netwerkconfiguratie op.

Antwoord 23

Het probleem was dat mijn verbindingsreeks-URL een databasenaam bevatte in plaats van een SID.
Het vervangen van de databasenaam door de Oracle-databaseverbinding SID loste dit probleem op.

Om je oracle SID’s te kennen, kun je door het bestand tnsnames.orabladeren.

XEwas de daadwerkelijke SID, dus zo ziet mijn tomcat-verbindingsreeks er nu uit:

   <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

Mijn serverversie was “Oracle 11.2 Express”, maar de oplossing zou ook op andere versies moeten werken.


Antwoord 24

In mijn geval ontbraken ronde haakjes rond de SERVICE_NAME in het bestand tnsnames.ora.

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )
LISTENER_<DBNAME> =
  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

Antwoord 25

Ik had een geval dat ik DBMS gebruikte waarbij ik een db-verbindingsformulier moest invullen.

Ik plaatste SID in het veld Database en in de vervolgkeuzelijst, naast het veld, had ik de waarde ‘Servicenaam’ in plaats van de waarde ‘SID’.
(normaal gebruik ik geen Oracle-database, dus ik ben me niet bewust van het verschil)

Dat was de reden dat ik de foutmelding kreeg.


Antwoord 26

Het probleem kan in de onjuiste URL zitten.

Ik gebruik bijvoorbeeld Oracle-database (binnen VM) met Spring-framework en heb dit probleem.

Ik had in mijn bestand application.properties:

spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orcl12c

Maar de db-versie was afwijkend:

spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orclcdb

De juiste URL kan worden gevonden in het bestand tnsnames.ora(dit bestand zou beschikbaar zijn waar de Oracle-server is, dus als u VM gebruikt, moet u dit bestand in uw host-VM zoeken) .
Bijvoorbeeld voor Oracle in de VirtualBox is de opdracht om dit bestand te zien:

nano /u01/app/oracle/product/version/db_1/network/admin/tnsnames.ora

Other episodes