Bagaimana cara mengkonfigurasi Pendengar Oracle tanpa SID_LIST_LISTENER di listener.ora?

13

Saya memiliki akses ke server 11g ORACLE menggunakan listener.ora berikut

# listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.111)(PORT = 1521))
    )
  )

dan itu melayani semua contoh di server itu, seperti yang saya bisa verifikasi oleh

lsnrctl status

Masalah saya adalah, bahwa ketika saya membuat instalasi baru Oracle 11g di mesin virtual, saya harus menggunakan listener.ora seperti

# listener.ora Network Configuration File: C:\app\oracle\product\11.2.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\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )

   (SID_DESC =
     (GLOBAL_DBNAME = ORCL)
     (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
     (SID_NAME = orcl)
    )

   (SID_DESC =
     (GLOBAL_DBNAME = BMBK)
     (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
     (SID_NAME = BMBK)
    )

 )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 169.254.200.102)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = C:\app\oracle

Tanpa SID_LIST_LISTENER masuk, yaitu menggunakan listener.ora seperti itu dari server lain yang saya dapatkan

C:\Windows\system32>lsnrctl status

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 27-NOV-2011 10:14
:24

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

Anmeldung bei (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS des LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
Startdatum                27-NOV-2011 10:14:08
Uptime                    0 Tage 0 Std. 0 Min. 18 Sek.
Trace-Ebene               off
Sicherheit                ON: Local OS Authentication
SNMP                      OFF
Parameterdatei des Listener C:\app\oracle\product\11.2.0\dbhome_1\network\admin\
listener.ora
Log-Datei des Listener    c:\app\oracle\diag\tnslsnr\WSV-BK-W7en64-S\listener\al
ert\log.xml
Zusammenfassung Listening-Endpunkte...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=169.254.200.102)(PORT=1521)))
Der Listener unterst³tzt keine Services
Der Befehl wurde erfolgreich ausgef³hrt.

Pesan terakhir diterjemahkan menjadi

Pendengar tidak mendukung Layanan.

Saya tidak tahu, mengapa kedua server ini berperilaku berbeda. Saya tidak menemukan petunjuk dalam file konfigurasi atau kunci registri.

Edit:

Saya kira jawabannya ada di suatu tempat dimakamkan dalam posting ini oleh Burleson Consulting , tetapi saya tidak menemukan tempat, di mana itu sebenarnya dikonfigurasi.

bernd_k
sumber

Jawaban:

14

Agak terlambat ke pesta yang satu ini ...

Basis data harus mendaftar dengan pendengar secara otomatis, membuat SID_LISTentri menjadi berlebihan, dan ini tampaknya terjadi pada 192.168.111.111lingkungan Anda . Jika pendengar dimulai setelah basis data, perlu beberapa saat untuk mendaftar, dan mungkin ada situasi di mana ia tidak melakukannya sama sekali.

Anda dapat mencoba membuatnya mendaftar dengan alter system registerperintah. Basis data menggunakan LOCAL_LISTENERparameter untuk mengidentifikasi pendengar yang harus didaftarkan. Secara default itu adalah nol, yang menurut dokumentasi setara dengan hostname:1521.

Jika alter system registertidak membuat layanan muncul di lsnrctl statusoutput maka saya menduga itu tidak dapat mengidentifikasi nama host atau mengatasinya, atau itu menyelesaikan ke alamat yang berbeda dari yang pendengar aktif, atau LOCAL_LISTENERdiatur ke sesuatu yang tidak valid untuk kotak virtual. Anda dapat mengatur LOCAL_LISTENERuntuk mencocokkan listener.orasecara langsung, misalnya:

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

Atau Anda dapat menggunakan alias yang memiliki detail tersebut di tnsnames.ora. Misalnya, jika Anda menambahkan tnsnames.oraentri seperti:

MY_LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  )

Maka Anda bisa:

alter system set local_listener='MY_LISTENER' scope=both;
alter system register;

Satu-satunya keuntungan nyata yang dapat saya lihat dari menggunakan tnsnames.oraversi ini, selain mungkin dari singkatnya, adalah Anda dapat mengubah konfigurasi dalam file SQL * Net daripada dalam database; dan bahkan itu hanya benar-benar berguna jika Anda mengkloning basis data antar mesin, atau menyuruh pendengar dan basis data Anda berjalan di bawah akun yang berbeda (misalnya dengan gridpengguna untuk RAC / HA).

Ada lebih banyak di LOCAL_LISTENER sini .

Sunting: Dan ini sepertinya cukup komprehensif.

Alex Poole
sumber
-2

Saya memiliki masalah yang sama dan menemukan bahwa hanya mematikan dan memulai kembali contoh menyebabkannya untuk mendaftar dengan benar.

Ini dapat dilakukan dengan menggunakan baris perintah sqlplus. Anda harus masuk sebagai pengguna dengan sintaks SYSDBA priveledges (mis. Sistem):

sqlplus name/pass as SYSDBA

kemudian jalankan 'shutdown' dan tunggu sampai selesai. kemudian jalankan 'startup' dan tunggu sampai selesai.

semoga Anda sekarang memiliki instance terdaftar dengan pendengar.

Untuk memeriksa apakah ini masalahnya, Anda dapat menjalankan lsnrctl dan menjalankan perintah 'status'. jika tidak berhasil Anda masih akan melihat pesan 'Pendengar tidak mendukung layanan' jika tidak, Anda akan melihat sesuatu seperti

Service "horse" has 1 instance(s).
 Instance "horse", status READY, has 1 handler(s) for this service...
JonnyRaa
sumber
4
Tolong, jangan ... sama sekali tidak perlu me-restart database hanya untuk pendaftaran pendengar. "ubah register sistem;" dari sqlplus melakukannya, dan itu sudah ditulis di jawaban sebelumnya.
Balazs Papp