Showing posts with label odbc. Show all posts
Showing posts with label odbc. Show all posts

Monday, February 8, 2010

Oracle Heterogeneous Service (HS) การเชื่อมต่อ Oracle กับฐานข้อมูลตัวอื่น ๆ เช่น Microsoft SQL Server หรือ AS400 (ตอนที่ 2)

เมื่อครั้งที่แล้วเราได้อ่านเรื่องของ ณัฐพล และอธิชาติซึ่งใช้วิธีการที่แตกต่างกันในการแก้ปัญหาเรื่องการเชื่อมต่อระบบฐานข้อมูลต่างยี่ห้อกันโดย ณัฐพลใช้วิธีการ Export Import ข้อมูลเข้าออกจากฐานหนึ่งไปยังอีกฐานหนึ่งทุกวัน ส่วนอธิชาตินั้นใช้วิธีการที่เราเรียกว่า Heterogeneous Service ซึ่งจะทำให้ระบบฐานข้อมูลต่างยี่ห้อสามารถคุยกันได้โดยตรง ครั้งนี้เราจะมาลองดูวิธีปฏิบัติกันนะครับ
สำหรับขั้นตอนนั้นเราสามารถแบ่งได้เป็นหัวข้อ ๆ ดังนี้ครับ
1. ลงโปรแกรมที่จำเป็นของระบบฐานข้อมูลที่เราต้องการเชื่อมต่อด้วย เช่นหากเราต้องการจะเชื่อมต่อกับ AS400 เราจะต้องลงโปรแกรม IBM AS400 Client Access Express เพื่อที่จะได้ Driver ของ AS400 มาสร้าง ODBC ลองปรึกษา System Admin ที่ดูแล AS400 อยู่นะครับเขาน่าจะช่วยคุณได้ อันนี้ไม่ยาก
2. คราวนี้เราก็สร้าง Datasource ใน ODBC ชื่อ "AS400" ดังตัวอย่างข้างล่างนี้ครับ








3. สร้างไฟล์ชื่อ ORACLE_HOME\hs\admin\initAS400.ora เพื่อให้ Oracle รู้จัก ODBC Datasource ที่เราสร้างขึ้น ORACLE_HOME คือ Oracle Home ที่เราลง Oracle ไว้ซึ่งจะต่างกันไปตามเวอร์ชั่นที่เราลง Oracle ไว้ ตัวอย่างเช่น บนเครื่องวินโดวส์ XP ของผม ORACLE_HOME จะเป็น C:\oracle\product\10.2.0\db_1 ผมก็จะสร้างไฟล์ไว้ที่ C:\oracle\product\10.2.0\db_1\hs\admin\initAS400.ora เป็นต้น (ชื่อไฟล์จะพิมพ์ตัวใหญ่หรือเล็กก็ได้) ในไฟล์นี้ให้เราพิมพ์ข้อความลงไปดังนี้

HS_FDS_CONNECT_INFO = AS400 #ODBC DSN
HS_FDS_TRACE_LEVEL = OFF

โดยตรง "AS400" จะต้องเหมือนกับชื่อที่เราตั้งไว้ตอนสร้าง ODBC Datasource

4. จากนั้นเราจะต้องอัพเดท Listener โดยเพิ่มส่วนของ AS400 เข้าไป เพื่อให้ Oracle รู้จักเสมือนว่า AS400 เป็น Instance หนึ่งที่รันอยู่บนเครื่องของมัน โดยเราจะเข้าไปเพิ่มเติมข้อความในไฟล์ LISTENER.ORA ซึ่งบนเครื่องของผมจะอยู่ที่ ORACLE_HOME\network\admin\LISTENER.ORA (แทนที่ ORACLE_HOME ด้วย C:\oracle\product\10.2.0\db_1)

(SID_DESC=
(SID_NAME=AS400)
(ORACLE_HOME=C:\oracle\product\10.2.0\db_1)
(PROGRAM=hsodbc)
)

ให้ใส่ตรงส่วน SID_LIST ดังตัวอย่างข้างล่าง (สีแดงคือส่วนที่เพิ่มเข้าไป)

SID_LIST_LISTENER =
  (SID_LIST =
      (SID_DESC =
         (SID_NAME = PLSExtProc)
         (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
         (PROGRAM = extproc)
      )
      (SID_DESC =
         (SID_NAME =AS400)
         (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
         (PROGRAM = hsodbc)
      )
  )

ตรง PROGRAM=hsodbc ให้พิมพ์ตรงตัวเลย ส่วนตรง ORACLE_HOME=ORACLE_HOME=C:\oracle\product\10.2.0\db_1 ถ้า Oracle Home ของคุณแตกต่างไปจากนี้ ก็ให้แก้ตาม Oracle Home ที่แท้จริงของคุณ หลังจาก Save ไฟล์แล้วเราจะต้อง Refresh Listener (Listener เป็นโปรแกรมเล็ก ๆ ที่ทำหน้าที่รอคอยการเชื่อมต่อจากเครื่อง Client) การ Refresh สามารถทำได้โดยการพิมพ์ที่ OS Prompt ดังนี้ (บนเครื่องผมจะเป็น DOS Prompt)

C:\>lsnrctl reload

5. จากนั้นเราก็ต้องอัพเดทไฟล์ TNSNAMES.ORA ไฟล์นี้เป็นไฟล์ที่เครื่อง Oracle Client ใช้ในการ Connect กับฐาน
ข้อมูล ในไฟล์จะประกอบด้วยข้อมูลว่าจะให้ Connect ไปที่เครื่องไหน ชื่อ Database คืออะไรเป็นต้น ไฟล์นี้จะอยู่ที่ ORACLE_HOME\network\admin\TNSNAMES.ORA

AS400 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=AS400))
(HS=OK)
)

ตรง HOST= จะเป็น "localhost" เสมอเนื่องจากเราต้องการให้ Connect เข้าหา AS400 ODBC ที่เราสร้างไว้บนตัวมัน ส่วน SID ก็คือชื่อของ Listener ที่เราได้สร้างไว้ในขั้นตอนก่อนหน้า ในไฟล์ TNSNAMES.ORA อาจจะมีข้อมูลของการ Connect ฐานข้อมูลอื่นอยู่ก่อนแล้ว ให้เราหาที่ ๆ จะเพิ่มข้อความใหม่ที่เหมาะสม โดยดูจากฟอร์แมตของเดิมเป็นหลัก

6. จากนั้นเราก็พร้อมที่จะติดต่อกับ AS400 แล้ว โดยการจะติดต่อเราจะต้องติดต่อผ่าน Database Link เท่านั้น เราไม่สามารถจะ Connect โดยตรง เช่นเราไม่สามารถจะ Connect โดยใช้วิธี SQL> connect qpcs@as400 ได้
การสร้าง Database Link ทำได้โดยการ Connect เข้าฐานข้อมูล Oracle โดยใช้ User ที่ต้องการให้ติดต่อกับฐานข้อมูล AS400 เช่น User ที่ต้องการเก็บข้อมูลพักของ AS400 หรือ User ที่ต้องการ Join ตารางใน Schema ของตนกับ AS400 โดย User นั้นจะต้องมีสิทธิ์ในการสร้าง Database Link ถ้าไม่มีก็ให้ DBA Grant ให้โดยใช้คำสั่ง

SQL> grant create database link to scott;

จากตัวอย่างเรา grant สิทธิ์ในการสร้าง Database Link ให้กับ Scott เราจะ Connect โดยใช้ User Scott แล้วสร้าง Database Link ก่อนอื่นเราจะต้องทราบ Username และ Password ที่จะใช้ในการ Connect เข้า AS400 ก่อน สมมติว่าเราจะ Connect เข้าสู่ AS400 ด้วย User QPCS (เป็น User จริง ๆ ที่มีอยู่บน AS400 และมีสิทธิ์ในตารางที่เราต้องการข้อมูล) โดยมี Password เป็น PassW01 เราก็สามารถจะสร้าง Database Link ได้ดังนี้

SQL> create database link as400 connect to qpcs identified by passw01 using 'AS400';

เพียงเท่านี้เราก็สามารถที่จะ Connect เข้ากับฐานข้อมูล AS400 โดยตรงโดยผ่าน User Scott บน Oracle

SQL> conn scott
Enter password:
Connected.
SQL> create database link as400 connect to qpcs identified by passw01 using 'AS400';

Database link created.

SQL> select * from ACCLIB.TBACCOUNT@as400;

คิวรีข้างบนนี้จะแสดงผลข้อมูลจากตาราง TBACCOUNT ใน Library ACCLIB ได้โดยตรงแบบ Real Time ถ้าเราต้อง
การสร้าง Copy ของตารางเก็บไว้ก็เพียงใช้คำสั่ง create as select เช่น

SQL> create table acclib_tbaccount nologging as select * from acclib.tbaccount@as400;

ถ้าเราไม่ซีเรียสเรื่องดึงข้อมูลจาก AS400 แบบ Real Time การสร้าง Copy ไว้บน Oracle จะทำให้การทำงานราบรื่นขึ้น เนื่องจากระหว่างวันที่มีการใช้งานระบบ AS400 อาจจะมีการ Lock ตาราง เป็นระยะ ๆ ซึ่งอาจจะทำให้เราไม่สามารถที่จะ Select ข้อมูลได้

บทความที่เกี่ยวเนื่องกัน
Oracle Heterogeneous Service (HS) การเชื่อมต่อ Oracle กับฐานข้อมูลตัวอื่น ๆ เช่น Microsoft SQL Server หรือ AS400 (ตอนที่ 1)

Sunday, December 27, 2009

Oracle Heterogeneous Service (HS) การเชื่อมต่อ Oracle กับฐานข้อมูลตัวอื่น ๆ เช่น Microsoft SQL Server หรือ AS400 (ตอนที่ 1)

การเชื่อมต่อระหว่างระบบฐานข้อมูลต่างยี่ห้อกันบางทีก็ทำให้ปวดหัวและเสียเวลาได้เหมือนกัน การใช้ Heterogeneous Service อาจจะช่วยคุณได้เหมือนกับอธิชาติดังเรื่องข้างล่างนี้ครับ

ณัฐพลถูกมอบหมายให้เขียนรายงานเพื่อนำข้อมูลกรมธรรม์หลักที่ได้จากระบบประกันชีวิตหลักที่อยู่บนเครื่อง AS400 มาเปรียบเทียบกับเงินสินไหมที่บริษัทต้องจ่ายในแต่ละวัน ของแต่ละกรมธรรม์ซึ่งข้อมูลการเคลมนี้อยู่บนฐานข้อมูลที่เป็น Mircrosoft SQL Server ในขณะที่รายงานที่ออกนี้จะต้องนำมาจากฐานข้อมูล Oracle ที่ได้จากการเตรียมข้อมลจากฐานข้อมูล AS400 และ MSSQL ทั้งสอง เพื่อให้ระบบจัดการความสัมพันธ์ของลูกค้า (Customer Relation Ship Management -- CRM) สามารถนำไปใช้ได้ด้วย ณัฐพลจะทำอย่างไรเพื่อให้สามารถนำข้อมูลจากแหล่งทั้ง 3 เข้ามารวมกันได้อย่างไร้รอยต่อ และให้ทุกอย่างสามารถเป็นไปได้โดยอัตโนมัติ และเชื่อถือได้

ในฐานะโปรแกรมเมอร์ ณัฐพลคิดถึงการใช้โปรแกรมที่เขาเขียน Connect เข้ากับฐานทั้งสองตัว (AS400 และ SQLServer) แล้วนำมา Join กันในโปรแกรมของเขา แต่เมื่อลองทดสอบดูแล้วพบว่าโปรแกรมของเขานั้นช้าเกินกว่าที่จะสามารถใช้ได้จริงในทางปฏิบัติ เนื่องจากข้อมูลในฐานทั้งสองมีอยู่เป็นจำนวนมาก

ณัฐพลจึงขอให้ทีม AS400 Export ข้อมูลออกมาเป็นเท็กซ์ไฟล์ และให้ทีมงานที่ดูแลระบบสินไหม Export ข้อมูลออกมาเป็นเท็กซ์ไฟล์ทุกวันเช่นกัน ส่วนตัวเขาเองในฐานะผู้รวบรวมข้อมูลให้กับระบบ CRM ซึ่งอยู่บนฐานข้อมูลจะทำหน้าที่ Import ข้อมูลเข้าระบบฐานข้อมูล Oracle ทุกวันเช่นกัน ต่อจากนั้นก็แล้วแต่ว่าณัฐพลจะใช้วิธีการใดในการ Join ข้อมูลจากทั้งสองฐานเข้าด้วยกัน

วิธีการดังกล่าวเป็นวิธีการหนึ่งที่พบได้อยู่ทั่วไป แต่ด้วยขั้นตอนการนำข้อมูลเข้า ๆ ออก ๆ จากระบบหนึ่ง ไปยังอีกระบบหนึ่ง อาจทำให้เกิดความไม่สะดวกในการทำงาน และจะต้องอาศัยทักษะในการนำเข้า-ออกข้อมูลจากระบบต่าง ๆ เป็นเท็กซ์ไฟล์
ณัฐพลหากไม่ได้รับความช่วยเหลือจากทีม AS400 หรือ Microsoft SQL Server จะต้องมีทักษะในระบบฐานข้อมูลทั้งสองด้วย แล้วมีวิธีการอื่นไหมที่มีประสิทธิภาพกว่านี้

อธิชาติเป็นโปรแกรมเมอร์ที่มีความรู้ในระบบฐานข้อมูล Oracle เป็นอย่างดี และทราบว่า Oracle มีคุณสมบัติที่สามารถจะติดต่อกับฐานข้อมูลของบริษัทอื่น ๆ โดยผ่าน Heterogeneous Service เขาเริ่มจากการ Install โปรแกรม Client ของ AS400 ลงบนเครื่อง Oracle10gR2 Database Server ซึ่งมี OS เป็น Windows Server2003 และสร้าง ODBC Datasource เพื่อที่จะให้เครื่อง Database Server นี้สามารถมองเห็นทั้ง MSSQL และ AS400 ได้ จากนั้นเขาก็เข้าไปคอนฟิค Oracle Listener, และสร้างคอนเนคชั่นคอนฟิคกูเรชั่นในไฟล์ TNSNames.ora จากนั้นจึงได้เข้าไปสร้าง Database Link ในฐานข้อมูล Oracle เพียงเท่านี้เขาก็สามารถที่จะล็อกอินเข้าในฐานข้อมูล Oracle ในขณะเดียวกันก็สามารถที่จะคิวรีข้อมูลจาก AS400 หรือ MSSQL ได้โดยตรงโดยไม่ต้องล็อกเอาท์ออกมา เพียงเท่านี้อธิชาติก็สามารถที่จะคิวรีข้อมูลจากตารางใน AS400 หรือ MSSQL ได้สด ๆ ราวกับอยู่ในฐานข้อมูลเดียวกัน หลังจากไตร่ตรองแล้วเขาเลือกที่จะใช้วิธีการสร้างตารางที่เป็นก๊อปปี้ของตารางต้นทางแล้ว Import ข้อมูลเข้าไปทุกคืน ด้วยวิธีการนี้เขาสามารถควบคุมประสิทธิภาพของคิวรีในช่วงกลางวันที่มีผู้ใช้งานจำนวนมากได้ดีกว่าการคิวรีจากฐานข้อมูล AS400 หรือ MSSQL แบบ Online โดยหลังจากสร้างตารางเปล่าที่เหมือนต้นฉบับเอาไว้บน Oracle แล้ว อธิชาติจะเขียนคำสั่งเพื่อไปดึงข้อมูลมาโดยมีลักษณะคล้าย ๆ คำสั่งข้างล่างนี้
SQL> insert into ORACLE_TABLES select * from AS400_TABLES@AS400_DB_LINK;
เขาเขียนคำสั่งเหล่านี้เป็นสคริปต์ไฟล์เอาไว้เพื่อให้ข้อมูลอัพเดททุก ๆ คืน เพื่อให้แน่ใจว่าในตอนกลางวันระบบ CRM และรายงานของเขาจะมีข้อมูลที่ทันสมัยเอาไว้ใช้ทุกวัน

เรื่องของ Heterogeneous Service ยังมีต่อ ครั้งหน้าเราจะมาพูดถึงวิธีการทำกันนะครับ ขอขอบคุณที่ติดตามครับ

บทความที่เกี่ยวเนื่องกัน
Oracle Heterogeneous Service (HS) การเชื่อมต่อ Oracle กับฐานข้อมูลตัวอื่น ๆ เช่น Microsoft SQL Server หรือ AS400 (ตอนที่ 2)