Sunday, May 4, 2014

"LISTENER", Reception คนเก่ง

โพสต์ครั้งแรก: 3 ธันวาคม 2011
ทความที่แล้วมีเพื่อนสมาชิกติงมาว่า SYSDATE แท้จริงแล้วคือฟังก์ชั่น ไม่ใช่ Pseudo Column ต้องขอขอบคุณด้วยนะครับสำหรับการท้วงติง ; ) สัปดาห์นี้เราลองมาดูเกี่ยวกับเรื่อง Listener กันดูบ้างนะครับ
ปกติเวลาเราไปติดต่อที่องค์กรใด ๆ เรามักจะพบกับพนักงานหนึ่งหรือหลายคนที่เคาน์เตอร์ที่เห็นได้ง่ายที่สุด พนักงานเหล่านี้มักจะมีหน้าตาน่ารักหรือไม่ก็ดูดีในระดับหนึ่ง และจะคอยแนะนำเราให้รู้ว่าเราจะต้องไปติดต่อที่ไหน ฯลฯ เราเรียกพนักงานเหล่านี้ว่า ประชาสัมพันธ์บ้าง รีเซฟชั่นบ้าง หรือพนักงานต้อนรับบ้าง
ระบบฐานข้อมูล Oracle หนึ่ง ๆ ก็มีประชาสัมพันธ์นี้เช่นกัน ต่างแต่เราเรียกประชาสัมพันธ์นี้ว่า Listener ซึ่งแปลตรงตัวว่า "ผู้คอยฟัง" หน้าที่ของเขาคือพาเอาผู้มาติดต่อได้เชื่อมต่อกับฐานข้อมูล และเมื่อเชื่อมต่อกันได้จนเกิดเป็น Session แล้วก็เป็นอันหมดหน้าที่ของ Listener
ผู้ที่ต้องการเชื่อมต่อจะติดต่อกับฐานข้อมูลผ่านระบบเครือข่ายเท่านั้นที่จำเป็นต้องได้ความช่วยเหลือจาก Listener เราสามารถเปิดฐานข้อมูลและทำงานกับมันได้โดยไม่ต้องเปิด Listener เลยก็ได้ ตราบใดที่เราเชื่อมต่อกับฐานข้อมูลผ่านโปรแกรมใด ๆ บนเครื่องที่ติดตั้งฐานข้อมูลนั้นไว้ ดังตัวอย่าง
บนเครื่อง Notebook ของผมมีฐานข้อมูล ORCL และมี Listener ON อยู่ และผมได้สร้าง Net Service ชื่อ ORCL เพื่อใช้ connect เข้าฐานข้อมูลในเครื่องเดียวกันผ่าน Listener
เราจะลองเช็คดูว่า Listener On อยู่
C:\> lsnrctl status
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 25-NOV-2011 18:26:32
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xp-orcl102)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENERVersion                   TNSLSNR for 32-bit Windows:
Version 10.2.0.1.0 - Production
Start Date                24-OCT-2011 13:30:21
Uptime                    32 days 4 hr. 56 min. 11 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   C:\oracle\product.2.0\db_1\network\admin\listener.ora
Listener Log File         C:\oracle\product.2.0\db_1\network\log\listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xp-orcl102)(PORT=1521)))
Services Summary...
Service "orcl.world" has 2 instance(s).
Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.world" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl_XPT.world" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully


ผมจะลองล็อกอินเข้าฐานข้อมูลโดยผ่าน Net Service (ซึ่งจะติดต่อกับ Listener) ซึ่งผมทำได้สำเร็จดังข้างล่าง

C:\>sqlplus scott/tiger@orcl
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Nov 25 19:04:15 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining options
SQL>


คราวนี้ผมจะปิด Listener แล้วลองเชื่อมต่อโดยใช้ Net Service อีกครั้ง

C:\>lsnrctl stop
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 25-NOV-2011 19:07:57
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xp-orcl102)(PORT=1521)))
The command completed successfully

C:\>sqlplus scott/tiger@orcl
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Nov 25 19:08:05 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
ERROR:ORA-12541: TNS:no listener

Enter user-name: scott/tiger
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining options
SQL>


จะเห็นว่าเมื่อเราปิด Listener เราจะไม่สามารถเชื่อมต่อกับฐานข้อมูลผ่านทาง Net Service (หรืออีกนัยหนึ่งผ่าน Listener) ซึ่งกรณีเดียวกันถ้าเราเชื่อมต่อจากเครื่อง Client เราก็จะพบปัญหาเดียวกัน อย่างไรก็ตามเรายังคงสามารถเชื่อมต่อกับระบบฐานข้อมูลได้ หากเราไม่ได้ระบุ Net Service ซึ่งเป็นการเชื่อมต่อแบบ Local 

ถ้าเราติดตั้งฐานข้อมูล Oracle ไว้หลาย Instance บนเครื่องของเรา เมื่อเราต้องการเชื่อมต่อกับฐานข้อมูลบนเครื่องโดยไม่ผ่าน Listener อย่าลืม Set Default SID ที่จะเข้าสู่ฐานข้อมูล ไม่เช่นนั้นเราอาจจะพบความประหลาดใจเมื่อมันเชื่อมต่อไปฐานข้อมูลอีกตัวหนึ่งแทน ซึ่งถ้าฐานข้อมูลตัวอื่นนั้นไม่ได้เปิดอยู่คุณก็จะเจอ Error คุณสามารถ Set Default SID ได้ดังนี้
บน Wndows (ตัวใหญ่เล็กไม่สำคัญ)
C:\> set oracle_sid=orcl
บน Unix (พิมพ์ตัวใหญ่เล็กให้ถูก)
-bash-3.00$ export ORACLE_SID=orcl


ด้วยข้อเท็จจริงดังกล่าวทำให้เราสามารถใช้เทคนิคนี้ในการปิดการให้บริการกับผู้ใช้ระบบซึ่งส่วนใหญ่จะติดต่อกับฐานข้อมูลผ่าน Listener ในขณะที่เราสามารถทำการ Maintain ฐานข้อมูลโดยเชื่อมต่อเข้าที่เครื่อง Server โดยตรง หรือผ่าน TELNET ก็ได้

No comments:

Post a Comment