ORA-12514 TNS: pendengar saat ini tidak mengetahui layanan yang diminta dalam deskriptor hubungkan


226

Kami memiliki aplikasi yang berjalan secara lokal tempat kami mengalami kesalahan berikut:

ORA-12514: TNS: pendengar saat ini tidak mengetahui layanan yang diminta dalam deskriptor hubungkan

Saya telah menguji koneksi yang menggunakan TNSPingyang diselesaikan dengan benar dan saya mencoba SQLPlusmencoba menghubungkan, yang gagal dengan kesalahan yang sama seperti di atas. Saya menggunakan sintaks ini untuk SQLPlus:

sqlplus username/password@addressname[or host name]

Kami telah memverifikasi bahwa:

  • Pendengar TNS di server sedang berjalan.
  • Oracle sendiri di server sedang berjalan.

Kami tidak mengetahui adanya perubahan apa pun yang dilakukan pada lingkungan ini. Ada lagi yang bisa kita uji?


2
apa perintah TNSPing (dengan params) yang Anda gunakan?
Grzegorz W

ketika Anda mengatakan "berjalan secara lokal" yang Anda maksudkan adalah aplikasi terhubung ke database pada host yang sama? Juga, apa isi file sqlnet.ora Anda? versi apa yang dilaporkan untuk sqlplus dan tnsping, dan apakah Anda yakin mereka berada di ORACLE_HOME yang sama?
David Aldridge

1
coba restart database. Karena mereka seharusnya memberi tahu Pendengar tentang keberadaan mereka saat startup, ini dapat memperbaiki masalah Anda.
Jens Schauder

1
REGISTRASI SISTEM ALTER kurang drastis daripada memulai kembali basis data.
DCookie

Jawaban:


209

Saya memiliki masalah ini dan perbaikannya adalah untuk memastikan tnsnames.orabahwa SERVICE_NAMEini adalah nama layanan yang valid di database Anda. Untuk mengetahui nama layanan yang valid, Anda dapat menggunakan kueri berikut dalam oracle:

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

Setelah saya perbarui tnsnames.orake:

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

kemudian saya berlari:

sqlplus user@TEST

Keberhasilan! Pendengar pada dasarnya memberi tahu Anda bahwa apa pun service_name yang Anda gunakan bukan layanan yang valid menurut DB.

(* Saya menjalankan sqlplus dari Win7 client workstation ke DB jarak jauh dan menyalahkan DBA;) *)


2
Pada win7,% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe

198
Bagaimana saya bisa meminta DB jika saya bahkan tidak dapat terhubung ke sana ??
isabelle martz

2
Bisakah Anda ssh ke server DB secara langsung dan menjalankan sqlplus dari sana?
Brad Rippe

1
ini mungkin tidak terjadi ketika beberapa klien / server, atau dulu, diinstal pada mesin yang sama. (tnsping menampilkan lokasi direktori yang digunakannya) - dalam kasus saya, listener.ora dalam direktori tersebut berisi informasi yang berkaitan dengan contoh database lama yang telah saya hapus instalasinya - cara cepat dan kotor adalah menyalin seluruh isi listener.ora dari instalasi Oracle Express saya saat ini, ke direktori lain yang tampaknya diperiksa oleh pendengar (saya pikir saya mengubahnya melalui registri atau sesuatu, dan itu lebih diutamakan daripada ORACLE_HOME (?))
hello_earth

8
ORA-00942: tabel atau tampilan tidak ada
Tommy Holman

44

Saya tahu ini adalah pertanyaan lama, tetapi masih belum terjawab. Butuh satu hari penelitian, tetapi saya menemukan solusi paling sederhana, setidaknya dalam kasus saya (Oracle 11.2 pada Windows 2008 R2) dan ingin berbagi.

Kesalahan, jika dilihat secara langsung, menunjukkan bahwa pendengar tidak mengenali nama layanan. Tetapi di mana ia menyimpan nama layanan? Di%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

"SID_LIST" hanya itu, daftar SID dan nama layanan yang dipasangkan dalam format yang dapat Anda salin atau cari.

Saya menambahkan masalah Nama Layanan, kemudian di panel kontrol "Layanan" Windows, saya melakukan "Restart" pada layanan pendengar Oracle. Sekarang semuanya baik-baik saja.


Misalnya, file listener.ora Anda pada awalnya mungkin terlihat seperti:

# 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))
    )
  )

... Dan untuk membuatnya mengenali nama layanan orcl, Anda dapat mengubahnya menjadi:

# 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))
    )
  )

3
Perlu memperbarui jawaban ini dengan sintaks bagaimana listener.oramenyimpan nama. Saya bahkan tidak punya listener.orafile. Saya juga berada di workstation klien yang menjalankan SQL Developer dan mencoba membuat Database Link ketika saya mendapatkan kesalahan. Saya tidak memiliki layanan Oracle Listener untuk memulai kembali.
vapcguy

vapcguy, Anda harus berada di server database. sepertinya Anda ada di klien
Joseph Argenio

Setelah mengikuti instruksi Sepideh yang melibatkan Manajer Net, saya perhatikan bahwa file listeners.ora saya telah diperbarui untuk memuat entri SID_LIST baru. Saya telah mengedit jawaban ini untuk menyertakan contoh sintaks sebelum dan sesudah, untuk kepentingan pembaca yang tidak dapat menggunakan Net Manager, untuk alasan apa pun.
Kevin

12

Saya punya masalah ini di server Windows 2008 R2 dan Oracle 11g

masuk ke Net Manager> Listener> pilih layanan database dari combox> "Global Database Name" harus sama dengan "SID" dan "Oracle Home Directory" harus benar.

Jika Anda tidak memiliki entri untuk layanan database, buat satu dan setel database global yang benar, siddan oracle home.


12

Dalam keadaan saya kesalahan itu disebabkan oleh fakta bahwa pendengar tidak mendaftarkan layanan db. Saya memecahkan masalah ini dengan mendaftarkan layanan. Contoh:

Deskriptor saya di tnsnames.ora:

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

Jadi, saya melanjutkan untuk mendaftarkan layanan di listener.oramanual:

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

Terakhir, restart pendengar dengan perintah:

> lsnrctl stop
> lsnrctl start

Selesai!


8

Memulai OracleServiceXXX dari services.msc bekerja untuk saya di Windows.


Di windows, jika Anda menggunakan Oracle Release 12.x, maka pastikan layanan OracleServiceORCL berjalan. Jika layanan ini tidak dimulai, maka Anda juga akan menerima kode kesalahan yang sama.
street hawk

5

Ini benar-benar harus menjadi komentar untuk jawaban Brad Rippe , tetapi sayangnya, tidak cukup perwakilan. Jawaban itu membuat saya 90% dari perjalanan ke sana. Dalam kasus saya, instalasi dan konfigurasi database memasukkan entri dalam file tnsnames.ora untuk database yang saya jalankan. Pertama, saya dapat terhubung ke database dengan mengatur variabel lingkungan (Windows):

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

dan kemudian menghubungkan menggunakan

sqlplus / as sysdba

Selanjutnya, menjalankan perintah dari jawaban Brad Rippe:

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

menunjukkan bahwa nama-nama itu tidak sama persis. Entri yang dibuat menggunakan Asisten Konfigurasi Basis Data Oracle tempat asalnya:

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

Nama layanan dari kueri mydatabaselebih dari sekadar mydatabase.mydomain.com. Saya mengedit file tnsnames.ora menjadi hanya nama dasar tanpa bagian domain sehingga terlihat seperti ini:

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

Saya memulai kembali layanan Pendengar TNS (saya sering menggunakan lsnrctl stopdan lsnrctl startdari jendela perintah administrator [atau Windows Powershell] alih-alih panel kontrol Layanan, tetapi keduanya berfungsi.) Setelah itu, saya dapat terhubung.


4

Saya memiliki masalah yang sama. Bagi saya, hanya menulis

sqlplus myusername/mypassword@localhost

melakukan trik, melakukannya membuatnya terhubung ke nama layanan default, kurasa.


1
Kami memiliki masalah serupa dengan string koneksi kami yang menyebabkan kesalahan ini. Kami menghubungkan menggunakan driver JDBC tipis Oracle dengan connection string: jdbc:oracle:thin:@//localhost:1521/orcl. String koneksi yang dikoreksi untuk menghilangkan kesalahan ini adalah: jdbc:oracle:thin:@localhost:1521.
dan

itu tergantung apakah ini akan berhasil - saya pikir cara menghubungkan ini, menilai apa yang orang lain katakan, melewati pendengar sepenuhnya, menggunakan nama host komputer alih-alih SID - cara menghubungkan ini menyebabkan masalah pada klien pihak ketiga, - saya pikir ini juga berfungsi hanya ketika EZCONNECT ditentukan dalam sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth

3

apa yang bekerja untuk saya benar-benar sederhana, saya hanya perlu memulai layanan secara manual di "Layanan Windows" (services.msc dalam cmd trompt). nama layanan saya adalah: OracleServiceXXXXX.


Dalam kasus saya, meskipun Jenis Startup diatur ke Otomatis, itu tidak mulai ketika mesin boot. Setelah memulai layanan "OracleServiceXE" secara manual, ia berfungsi untuk Oracle Database 11g Express untuk tersambung ke halaman web DB dan APEX (Oracle Application Express).
Ivan Chau

2

Periksa untuk melihat database sudah habis. Masuk ke server, atur variabel lingkungan ORACLE_SID ke SID basis data Anda, dan jalankan SQL * Plus sebagai koneksi lokal.


Ini persis masalah saya. Basis data kami di-host pada VM yang turun ketika saya mencoba menggunakan program lain yang menggunakan DP. Setelah melihat utas ini saya menyadari bahwa itu mungkin turun.
Sh4d0wsPlyr

2

Kesalahan ini dapat terjadi ketika aplikasi membuat koneksi baru untuk setiap interaksi database atau koneksi tidak ditutup dengan benar. Salah satu alat gratis untuk memantau dan mengonfirmasi ini adalah pengembang Oracle Sql (walaupun ini bukan satu-satunya alat yang dapat Anda gunakan untuk memantau sesi DB).

Anda dapat mengunduh alat dari situs oracle Sql Developer

di sini adalah tangkapan layar tentang bagaimana memonitor sesi Anda. (jika Anda melihat banyak sesi yang menumpuk untuk pengguna aplikasi Anda saat Anda melihat kesalahan ORA-12514 maka itu indikasi yang baik bahwa Anda mungkin memiliki masalah kumpulan koneksi).

masukkan deskripsi gambar di sini


2

Saya mengatasi masalah ini di lingkungan linux saya memperbarui IP mesin saya di file / etc / hosts.

Anda dapat memverifikasi IP jaringan Anda (inet end.) Dengan:

$ifconfig

Lihat apakah IP Anda cocok dengan file / etc / hosts:

$cat /etc/hosts

Edit file / etc / hosts Anda, jika ada:

$sudo gedit /etc/hosts

Sampai jumpa.


2
ini sudah lama, tetapi tidak masuk akal untuk menambahkan IP Anda ke / etc / hosts. OP hilang SERVICE_NAME, hal-hal lain sangat tidak terkait
Ostap

Saya belum menambahkan IP saya ke / etc / host. Saya baru saja memperbaikinya. Seperti yang Anda lihat dalam topik ini, ada banyak jawaban dan varietas yang valid (dengan upvote) untuk menyelesaikan pertanyaan ini. Jika jawaban itu tidak membantu Anda, mengapa harus downvote? Jawaban ini mungkin masih membantu seseorang karena membantu saya.
Sergio MC Figueiredo

2

Bagi mereka yang mungkin menjalankan Oracle di VM (seperti saya) saya melihat masalah ini karena VM saya kehabisan memori, yang tampaknya telah mencegah OracleDB memulai / menjalankan dengan benar. Meningkatkan memori VM saya dan me-restart memperbaiki masalah.


2

Banyak jawaban di sini, tetapi inilah contoh kerja dengan kode yang dapat Anda salin dan tempel dan uji segera:

Bagi saya kesalahan 12514 diselesaikan setelah menetapkan SERVICE_NAME yang benar. Anda menemukan bahwa di server dalam file tnsnames.orayang datang dengan 3 nama layanan yang telah ditentukan (salah satunya adalah "XE").

  1. Saya menginstal database Oracle Express, OracleXE112 yang sudah dilengkapi dengan beberapa tabel demo yang sudah diinstal.
  2. Ketika Anda memulai penginstal Anda diminta kata sandi. Saya memasukkan "xxx" sebagai kata sandi. (tidak digunakan dalam produksi)
  3. Server saya berjalan pada mesin 192.168.1.158
  4. Di server Anda harus secara eksplisit mengizinkan akses untuk proses TNSLSNR.exe di Windows Firewall. Proses ini mendengarkan pada port 1521.
  5. OPSI A: Untuk C # (.NET2 atau .NET4) Anda dapat mengunduh ODAC11 , dari mana Anda harus menambahkan Oracle.DataAccess.dll ke proyek Anda. Selain itu, DLL ini bergantung pada: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. DLL ini harus dalam direktori yang sama seperti EXE atau Anda harus menentukan jalur DLL di: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Pada mesin 64 bit tulis jugaHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPSI B: Jika Anda telah mengunduh ODAC12, Anda memerlukan Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), Oraons.dll, msvcr100.dll. Jalur Registry adalahHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPSI C: Jika Anda tidak ingin DLL besar lebih dari 100 MB, Anda harus mengunduh ODP.NET_Managed12.xxxxxxxx.zip di mana Anda menemukan Oracle.ManagedDataAccess.dllyang hanya 4 MB dan DLL dikelola murni yang bekerja dalam proses 32 bit dan 64 bit juga dan tidak bergantung pada DLL lain dan tidak memerlukan entri registri.
  8. Kode C # berikut ini berfungsi untuk saya tanpa konfigurasi di sisi server (hanya instalasi default):
menggunakan Oracle.DataAccess.Client;
atau
menggunakan Oracle.ManagedDataAccess.Client;

....

string oradb = "Sumber Data = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)));"
    + "Id Pengguna = SISTEM; Kata Sandi = xxx;";

menggunakan (OracleConnection conn = new OracleConnection (oradb)) 
{
    samb.Buka ();
    menggunakan (OracleCommand cmd = OracleCommand baru ())
    {
        cmd.Connection = samb;
        cmd.CommandText = "pilih TABLESPACE_NAME dari DBA_DATA_FILES";

        menggunakan (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

Jika SERVICE_NAME=XEsalah, Anda mendapatkan kesalahan 12514. Ini SERVICE_NAMEopsional. Anda juga bisa meninggalkannya.


Terima kasih banyak, dari solusi Anda, saya menemukan triknya, dalam kasus saya, anti-virus yang memblokir program, maka tidak dapat memperoleh koneksi ke Oracle db.
robot_alien

2

Saya juga menghadapi masalah yang sama dan menghabiskan 3 hari untuk menggali itu.

Ini terjadi karena entri layanan TNS Anda salah.

Pertama, periksa apakah Anda dapat terhubung ke database siaga dari database primer menggunakan sql> sqlplus sys@orastand as sysdba( orastandadalah database siaga).

Jika Anda tidak dapat terhubung maka itu adalah masalah dengan layanan. Perbaiki entri nama layanan dalam file TNS di ujung utama.

Periksa database siaga dengan cara yang sama. Buat perubahan di sini juga jika diperlukan.

Pastikan log_archive_dest_2parameter memiliki nama layanan yang benar.


1

Saya mendapat kesalahan yang sama karena remote SID yang ditentukan salah:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

Saya menanyakan database sistem:

pilih * dari global_name;

dan menemukan SID jarak jauh saya ("XE").

Lalu saya bisa terhubung tanpa masalah.


0

Dalam kasus saya, basis data telah kehabisan ruang disk. Yang menyebabkannya tidak merespon. Setelah saya membereskan masalah itu semuanya bekerja kembali.


Bagaimana saya bisa mengetahui ini?
CodeSlave

0

Bagi saya ini disebabkan oleh menggunakan iPad dinamis menggunakan instalasi. Saya menginstal ulang Oracle menggunakan ipadress statis dan kemudian semuanya baik-baik saja



0

Masalah saya diselesaikan dengan mengganti'SID 'di URL dengan' nama layanan 'dan host yang benar.


0

tnslsnr sudah habis tetapi basis data sedang rusak.

Untuk pemula oracle tidak jelas bahwa database mungkin turun saat koneksi diterima.

Saya harus memulai database secara manual seperti itu

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

Dan kemudian di konsol sql

startup

Dalam kasus saya saya gagal untuk memulai tetapi mendapat pesan kesalahan lain dan menemukan sumber masalah - saya harus mengubah nama host dan kemudian startup otomatis database berfungsi kembali.


0

Saya telah menerapkan solusi di bawah ini untuk menyelesaikan masalah ini.

  1. Saya telah menetapkan ORACLE_HOME menggunakan command prompt (klik kanan cmd.exe dan Run as System administrator).

  2. Digunakan perintah di bawah ini

    set oracle_home="path to the oracle home"

  3. Buka Semua program -> Oracle -ora home1 -> Alat migrasi konfigurasi -> Manajer Net -> Pendengar

  4. Pilih Layanan Database dari dropdown. Baik nama basis data global dan SID disetel sama (ORCL dalam kasus saya). Atur Oracle Home Directory.

Contoh jendela Oracle Net Manager dari dokumentasi oracle: Contoh Oracle Net Manager

  1. Klik File dan simpan konfigurasi jaringan.

0

Masalahnya adalah bahwa url string koneksi saya berisi nama database dan bukan SID. Mengganti nama database dengan koneksi database oracle SID memecahkan masalah ini.

Untuk mengetahui SID oracle Anda, Anda dapat menelusuri tnsnames.orafile.

XE adalah SID yang sebenarnya, jadi ini adalah bagaimana string koneksi kucing jantan saya terlihat seperti sekarang:

    <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" />

Versi server saya adalah "Oracle 11.2 Express", tetapi solusi juga harus bekerja pada versi lain.


0

Dalam kasus saya, tanda kurung bulat di sekitar SERVICE_NAME tidak ada di file 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))

0

Untuk mereka yang menggunakan spring-boot dan jdbc untuk koneksi. Anda harus berhati-hati saat menulis jdbcUrl di application.properties

Dengan SID dalam koneksi Database - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Dengan nama Layanan dalam koneksi db globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Ini bekerja untuk saya :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.