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 TNSPing
die correct is opgelost en
Ik heb SQLPlus
geprobeerd om verbinding te maken, wat mislukte met dezelfde fout als hierboven. Ik heb deze syntaxis gebruikt voor SQLPlus
:
sqlplus username/password@addressname[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.ora
de SERVICE_NAME
een 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.ora
heb bijgewerkt naar:
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = *<servicenamefromDB>*)
)
)
toen rende ik:
sqlplus user@TEST
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 orcl
te 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, sid
en 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 mydatabase
in 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 stop
en lsnrctl start
vanuit 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/mypassword@localhost
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 sys@orastand as sysdba
(orastand
is 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_2
de 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).
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.ora
dat wordt geleverd met 3 vooraf gedefinieerde servicenamen (een daarvan is “XE”).
- Ik heb de Oracle Express-database OracleXE112 geïnstalleerd die al wordt geleverd met enkele vooraf geïnstalleerde demotabellen.
- Wanneer u het installatieprogramma start, wordt u om een wachtwoord gevraagd. Ik heb “xxx” ingevoerd als wachtwoord. (niet gebruikt in productie)
- Mijn server draait op de machine 192.168.1.158
- Op de server moet u expliciet toegang verlenen voor het proces TNSLSNR.exe in de Windows Firewall. Dit proces luistert op poort 1521.
- 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 naarHKLM\SOFTWARE\Wow6432Node\Oracle\...
- 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
- 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.dll
die 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. - 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=XE
fout is, krijg je fout 12514. De SERVICE_NAME
is 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/$DATASOURCE_PASSWORD@$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
tnslsnr
is 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.
-
Ik heb de ORACLE_HOME ingesteld met de opdrachtprompt
(klik met de rechtermuisknop op cmd.exe en Uitvoeren als systeembeheerder). -
Gebruikt onder commando
set oracle_home="path to the oracle home"
-
Ga naar Alle programma’s–> Oracle -ora home1–> Hulpprogramma’s voor configuratiemigratie–> Netbeheerder–> Luisteraar
-
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:
- 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.ora
bladeren.
XE
was 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