วันพฤหัสบดีที่ 17 กรกฎาคม พ.ศ. 2557

เริ่มต้นเรียนรู้ Oracle Database part 4-2

: Oracle Listener (ตอนจบ)

>> ต่อจาก part 4-1 นะครับ ทิ้งท้ายไว้ที่ผมต้องการติดต่อฐานข้อมูล Oracle ด้วยโปรแกรม SQL Developer ผ่านช่องทาง TCP/IP

>> จากลิงค์นี้ http://www.toadworld.com/platforms/oracle/b/weblog/archive/2013/08/14/the-oracle-listener-process-how-does-it-work-connecting-to-oracle.aspx

>> คุณ Dan Hotka ได้กล่าวว่า (เท่าที่ผมเข้าใจนะครับ เพราะภาษาอังกฤษผมก็ไม่ค่อยดีนัก) Oracle ใช้วิธีการติดต่อฐานข้อมูลผ่านทาง port ประเภท TCP/IP ด้วยสิ่งที่เรียกว่า 'host string' หรือในทางเทคนิคเรียกว่า 'TNS Names Entry'

>> เขายังเล่าว่าโดยปกติแล้วฝั่ง server (หมายถึงเครื่องที่ติดตั้งฐานข้อมูลไว้) จะมี process ที่ชื่อ 'listener' ทำหน้าที่คอยฟังคอยรับรู้ความเคลื่อนไหวของฐานข้อมูล (ต้องเข้าใจว่าฐานข้อมูลของ Oracle นี้สำคัญมาก เราติดต่อโดยตรงไม่ได้ จะต้องผ่านผู้ช่วยหรือตัวแทนในลักษณะต่างๆตามที่ Oracle กำหนดหรือยอมรับเท่านั้นนะครับ) เพราะเจ้า listener นี้จะเริ่มต้นทำงานเมื่อฐานข้อมูลเริ่มต้นทำงาน ดังนั้นที่เครื่อง server เราสามารถควบคุมมันได้ จะสั่งให้มันเริ่มทำงาน หรือหยุดทำงาน หรือสอบถามสถานะการทำงานของมันอย่างไรก็ได้ ฆ่าได้ ทารุณกรรมมันได้ตามใจอยาก หึหึหึ

>> แน่นอนว่าผมลงฐานข้อมูลไว้ในเครื่องนี้ เครื่องของผมจึงกลายเป็น server โดยปริยาย คุณ Dan Hotka บอกว่ารายละเอียดของเจ้า listener ถูกเขียนเก็บไว้ในไฟล์ที่ชื่อ 'listener.ora' ด้วยเครื่องของผมเป็น server จึงสามารถตามไปดูได้ ณ
C:\app\ProS\product\11.2.0\dbhome_2\NETWORK\ADMIN
.
.
.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ORCL11G)
(ORACLE_HOME = C:\app\ProS\product\11.2.0\dbhome_2)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\ProS\product\11.2.0\dbhome_2\bin\oraclr11.dll")
)
)
.
.
.
สองสิ่งสำคัญที่ต้องรู้จักคือ
- SID_NAME ในที่นี้ยังคงเป็น Global Database Name ง่ายๆว่าชื่อฐานข้อมูลซึ่งผมตั้งเป็น ORCL11G (ตอนที่ติดตั้งไง ที่เคยเล่าให้ฟังไง ถ้าไม่ตรงขออภัยด้วยนะครับ เพราะนี่ติดตั้งฐานข้อมูลลูกที่สองแล้ว) จำได้ว่าเขียนด้วยพิมพ์เล็กทั้งหมดนะ สงสัยมันไม่สนใจพิมพ์เล็กพิมพ์ใหญ่
- ORACLE_HOME ก็คือ path หรือเส้นทางที่วางเจ้าฐานข้อมูลไว้

>> รายละเอียดดังข้างต้นเป็นตัวบอกว่าฐานข้อมูลชื่ออะไรและอยู่ที่ไหนในเครื่อง server และส่วนต่อไปนี้คือรายละเอียดการติดต่อเข้ามายังฐานข้อมูลลูกนี้ครับ
.
.
.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
)
)

ADR_BASE_LISTENER = C:\app\ProS
.
.
.
สองสิ่งสำคัญที่ต้องรู้จักคือ
- HOST หมายถึงชื่อโดเมน หรือไอพีแอดเดรสที่ทำงานผ่าน TCP/IP นั่นเอง ในที่นี้คือ localhost (หลายคนคงเข้าใจดี เพราะถ้าฐานข้อมูลเราไปอยู่ที่ Google ก็ต้องใส่ว่า google.com หรือ google.th หรือก็แล้วแต่ว่าติดตั้งฐานข้อมูลไว้ที่ชื่อโดเมนไหน)
- PORT หมายถึงช่องทางหรือหมายเลขช่องทางที่จะใช้ติดต่อมายังฐานข้อมูลข้างต้น ในที่นี้ค่าคือ 1522 (เพราะผมติดตั้งครั้งที่สอง Oracle จึงรันเลข port ให้อัติโนมัติ ลูกแรกคือ 1521 ดังนั้นลูกนี้จึงเป็น 1522 ครับ)

>> เอาละครับทั้งหมดข้างต้นคือรายละเอียดของเจ้า listener ที่มันจะต้องทราบขณะที่ฐานข้อมูลเริ่มต้นทำงาน ตัวมันเองทำงานอยู่ฝั่ง server ผู้ที่ทำหน้าที่ปรับเปลี่ยนรายละเอียดการใช้ port ตลอดจนชื่อโดเมน แหล่งที่วางฐานข้อมูลและชื่อฐานข้อมูลก็คงจะเป็น administrator ทางฝั่ง server แหละ (ดีที่เครื่องเรากลายเป็น server อิอิ)

>> แล้วเราในฐานะผู้ต้องการใช้งานฐานข้อมูลล่ะ จะคุยกับเจ้า listener เพื่อเชื่อมต่อไปยังฐานข้อมูลได้อย่างไร?
ตอบ ประเด็นนี้คุณ Dan Hotka มีคำตอบให้แต่แรกแล้วไงครับ เขากล่าวว่าที่ฝั่ง client หรือก็คือเราผู้ที่ต้องการคุยกับ listener จะมีไฟล์ที่ชื่อว่า 'TNSNAMES.ora' ซึ่ง Oracle จัดเตรียมไว้ให้ไว้สำหรับผู้ใช้หรือ client อย่างเราๆติดต่อกับฐานข้อมูลได้ง่ายขึ้น (ผ่าน listener นะอย่าลืม) ในไฟล์จะบรรจุสิ่งที่จำเป็นในการเชื่อมต่อเอาไว้ (This file gives a simple name to the information needed to connect to the database) ประมาณนี้ครับ (ตัดมาเพียงชื่อเดียว)
.
.
.
ORCL11G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl11g)
)
)
.
.
.
ดูจากรายการแล้วเพื่อนๆคงเดาได้ไม่ยากเลย ทั้ง HOST ทั้ง PORT ทั้งชื่อ SERVICE_NAME (ที่จริงหนึ่งฐานข้อมูลตั้งแต่เวอร์ชัน 8i เขาเปลี่ยนจากการใช้ชื่อฐานข้อมูลตรงๆเป็น service name แทน เพื่อที่ฐานข้อมูลเดียวจะได้แบ่งการทำงานออกเป็นหลายๆ service เช่น ฐานข้อมูลชื่อ A มีสอง service ได้แก่ HR_SERVICE กับ ACCOUNT_SERVICE เป็นต้น) หากใส่ค่าให้ตรงกับที่เจ้า listener ฝั่ง server คอยฟังอยู่ล่ะก็ ก็ติดต่อไปยังฐานข้อมูลลูกนั้นๆได้เลย

>> สุดท้ายคุณ Dan Hotka เขาบอกว่าสำหรับ client ที่ต้องการคุยกับ listener ผ่านสิ่งที่เรียกว่า host string หรือ TNS Names Entry หรือก็คือใช้ไฟล์ TNSNAMES.ora จะต้องไปกำหนด variable specified ที่ windows environment variable ก่อนนะจึงจะเรียกใช้ไฟล์ดังกล่าวได้ ภาษาเราๆก็คือ set path น่ะ คงรู้ๆกันชิมิ โดยตั้งชื่อตัวแปรว่า TNS_ADMIN และให้ค่ามันไปตามเส้นทางที่เครื่องของเราได้เก็บไฟล์ TNSNAMES.ora ไว้ (Oracle จัดเตรียมไว้ให้อยู่ที่เดียวกับ listener.ora จ้า) ก็เป็นอันจบข่าว

>> แบ่งปันกันนะครับ ใครรู้อะไรก็แชร์ๆกัน ผมไม่ได้อวดรู้ แต่ผมคิดว่าการแชร์สิ่งที่รู้ซึ่งอาจจะผิดหรือถูกเป็นสิ่งที่ดี ผมแก้ปัญหาที่บริษัทได้หลายต่อหลายครั้งก็เพราะ Google ต้องขอบคุณเพื่อนๆใจกว้างในโลกออนไลน์ที่กล้าแชร์สิ่งที่คิดสิ่งที่น่าเป็นไปได้แก่ผมและคนอื่นๆ ถ้าไม่มีพวกเขาผมก็คงไม่มีทางได้รู้ ถ้าไม่มีคุณ Dan Hotka โพสต์นี้ก็ยังไม่เกิดขึ้น เสียสละเวลาสักนิดทำสิ่งเหล่านี้เป็นความรู้สึกที่ผมไม่เคยเสียใจเลย คืนนี้ฝันดีครับผม zZ


JavaScript Picture

JavaScript Picture

ไม่มีความคิดเห็น:

แสดงความคิดเห็น