Pendengar Oracle 11g gagal dengan kesalahan ORA-12514 dan ORA-12505

17

Saya menjalankan instance Oracle 11g secara lokal pada mesin pengembangan saya dan dapat terhubung ke instance lokal secara langsung melalui SqlPlus:

c:\>sqlplus ace

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:50:20 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

SQL> select count(*) from my_table ;

  COUNT(*)
----------
      5297

Tapi saya tidak bisa terhubung melalui pendengar:

c:\>sqlplus -L "user/pw@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))"

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:52:40 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus

Demikian pula, jika saya terhubung melalui SqlDeveloper saya mendapatkan kesalahan (meskipun ORA-12505, TNS:listener does not currently know of SID given in connect descriptor).

Contoh ini telah stabil dan berfungsi dengan baik selama satu tahun atau lebih hingga hari ini, Senin pagi. IT korporat kami kadang-kadang mendorong kebijakan dan pembaruan baru selama akhir pekan, jadi saya berasumsi bahwa ada sesuatu yang berubah, tetapi saya tidak dapat menemukan apa.

Saya telah me-restart layanan dan pendengar beberapa kali, log pendengar tidak memberikan petunjuk apa pun.

Pendengar tampaknya baik-baik saja:

c:\>lsnrctl status

LSNRCTL for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 11:55:33

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 11.2.0.2.0 - Beta
Start Date                11-MAR-2013 11:17:30
Uptime                    0 days 0 hr. 38 min. 3 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           XE
Listener Parameter File   C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\listener.ora
Listener Log File         C:\oraclexe\app\oracle\diag\tnslsnr\FBC305BB46560\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

Port 1521 tampaknya ok:

c:\>netstat -an -O | find /i "1521"
  TCP    0.0.0.0:1521           0.0.0.0:0              LISTENING       4368
  TCP    169.243.90.109:55307   159.185.207.100:1521   ESTABLISHED     12416
  TCP    [::]:1521              [::]:0                 LISTENING       4368

(PID 4368 adalah proses TNSLSNR.exe.)

Juga, saya bisa tnspingke layanan XE:

c:\>tnsping xe

TNS Ping Utility for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 12:27:47

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Used parameter files:
C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (210 msec)

The listenerr.oraFile:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

Selain itu, dan saya tidak tahu apakah itu terkait, saya tidak bisa mengakses apex https://127.0.0.1:8080/apex(meskipun izin untuk itu tampak baik-baik saja).

Jadi ke mana lagi saya harus mencari?

Perbarui dengan informasi yang diminta:

SQL> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      XE
SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string

Update2 : seperti yang ditunjukkan oleh @ miracle173 dengan benar, pendengarnya tidak baik. Dengan parameter 'local_listener' yang diperbarui sekarang menunjukkan informasi tambahan:

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully
Tanpalicliced
sumber
Apa nilai INSTANCE_NAMEparameter inisialisasi Anda dan ORACLE_SIDvariabel lingkungan? Basis data Anda tidak mendaftar dengan pendengar default karena beberapa alasan. Cobalah untuk mengeluarkan alter system register;dan kemudian sambungkan kembali ke database.
Yasir Arsanukaev
@YasirArsanukaev instance_name adalah 'xe' (huruf kecil jika itu relevan) dan saya tidak memiliki variabel lingkungan ORACLE_SID.
Tanpa izin
3
dua catatan: "pendengarnya tampak baik-baik saja": Saya tidak berpikir begitu karena tidak menampilkan layanan bernama "XE" "Saya dapat melakukan ping ke layanan XE": tnsping terhubung ke pendengar tetapi tidak peduli tentang layanan. jadi Anda hanya dapat menunjukkan apakah pendengar sudah aktif dan berjalan tetapi Anda tidak dapat menggunakan ist untuk memeriksa apakah pendengar telah mendaftarkan layanan. Jadi tnsping "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))" akan berhasil jika pendengar berjalan di port 1521 localhost bahkan jika layanan tidak ada.
miracle173
Saya mengalami masalah yang sama hari ini, dan seperti yang dijelaskan oleh @ miracle173, ada pendaftaran di alert.log. Oracle berjalan pada VM. Ternyata pada VM, baik hostname, dan hostname.domain semua mengarah ke alamat ip yang berbeda dari 127.0.0.1 (localhost). Setelah memodifikasi file hosts (Windows \ system32 \ drivers \ dll) untuk memaksa pemetaan, semuanya baik-baik saja sekarang.
ubah register memperbaiki masalah .. terima kasih :)
user116258

Jawaban:

15

Jadi, dengan terima kasih kepada @YasirArsanukaev untuk waktu yang dimasukkannya, saya telah menemukan solusi yang berfungsi, tetapi saya tidak bisa menjelaskannya.

Menimbang LOCAL_LISTENERpemikiran itu, saya membaca jawaban lain ini di mana tertulis:

Basis data menggunakan parameter LOCAL_LISTENER untuk mengidentifikasi pendengar yang harus didaftarkan. Secara default itu adalah nol, yang menurut dokumentasi setara dengan nama host: 1521.

Jadi saya mencoba ping nama host saya sendiri dan tidak bisa - sepertinya ada masalah IPv6, menerima pesan kegagalan umum.

Jadi saya menerima saran dari jawaban itu

SQL> alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both;
SQL> alter system register;

dan sekarang berfungsi, mungkin karena ia dapat menyelesaikan referensi localhost, di mana ia gagal menyelesaikan nama host yang sebenarnya.

Tanpalicliced
sumber
1
Anda benar-benar melihat solusinya: penghilangan otomatis basis data ke default LOCAL_LISTENER = '(ADDRESS = (PROTOCOL = TCP) (HOST = hostname) (PORT = 1521))' (di mana nama host adalah nama jaringan mesin) melakukannya tidak berfungsi karena ada masalah untuk mencapai mesin dengan nama ini. Mungkin ada entri di alert.log atau di beberapa sqnlnet.log (% ORACLE_HOME% / network / log /) tentang masalah pendaftaran basis data
miracle173
@Disebabkan saya sebenarnya memiliki masalah yang sama, untuk kasus saya itu diselesaikan karena ID layanan yang digunakan menghapus teks postfix ".Domain.local".
Nap
menjalankan dua pernyataan perubahan memecahkan pesan kesalahan listner tns untuk saya dan saya dapat terhubung
smartexpert