Sunday, March 11, 2012

Mengakses Database MySQL Dari Oracle Dengan Heterogeneous Service

Oracle Heterogeneous Services atau biasa disingkat Oracle HS saja merupakan salah satu fitur hebat yang dimiliki server database Oracle. Mengapa saya sebut hebat? Dengan Oracle Heterogeneous Services, kita dapat mengakses berbagai database eksternal non-Oracle langsung dari Oracle. Seolah-olah kita memiliki satu database saja. Kita juga tidak perlu lagi login satu per satu setiap layanan database yang kita miliki. Oracle Heterogeneous Services sangat cocok untuk menyatukan semua server database yang beraneka ragam.

Oracle Heterogeneous Services ini ada dua, Oracle Transparent Gateways dan Generic Connectivity. Server database yang dapat diakses cukup beragam, mulai dari MySQL, Sybase, PostgreSQL, dll. Di tutorial ini kita akan mencoba mengakses database MySQL dari Oracle dengan Generic Heterogeneous Services. Untuk itu kita sudah harus punya satu server Oracle XE (Express Edition) dan satu server MySQL yang sudah running dengan baik.

Keseluruhan konfigurasi akan dilakukan di server Oracle. Kita hanya butuh informasi username, password, database, dan alamat IP dari server MySQL yang akan diakses. Di server Oracle, kita harus memasang dukungan ODBC untuk MySQL. Driver-nya dapat diunduh dari mysql.com. Setelah driver MySQL ODBC dipasang, buat konfigurasi di /etc/odbc.ini sebagai berikut.
[MY_SQL]
DRIVER = /usr/lib/libmyodbc5.so
SERVER = 10.15.5.71
UID = username
PWD = password
DATABASE = my_database
PORT = 3306
Ganti 10.15.5.71 dengan alamat IP server MySQL, username dengan nama user MySQL, password dengan password user mysql, dan my_database dengan nama database mysql yang hendak diakses dari Oracle.

Tambahkan konfigurasi heterogeneous system untuk MySQL di /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/hs/admin/initMYSQL_DB.ora.
HS_FDS_CONNECT_INFO = MY_SQL
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /usr/lib/libmyodbc5.so
Update konfigurasi listener Oracle di /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora , dengan menambahkan entry untuk database MySQL.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = MYSQL_DB)
      (ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)
      (PROGRAM = hsodbc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )
Kemudian update konfigurasi tnsnames Oracle, dengan menambahkan untuk MySQL. Konfigurasi ini dapat ditemukan di /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/tnsnames.ora.
MYSQL_DB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SID = MYSQL_DB)
    )
    (HS = OK)
  )
Reload listener Oracle untuk memperbarui konfigurasi yang baru kita tambahkan.
lsnrctl reload
Login ke server Oracle, buat database link ke MySQL, lalu tes query ke salah satu tabel di database MySQL.
sqlplus / as sysdba
create database link mysql connect to "username" identified by "password" using 'MYSQL_DB';
select * from m_kota@mysql