Thursday, April 12, 2012

Install Oracle Heterogeneous Services Untuk MySQL di Oracle Linux 6.2

Beberapa waktu yang lalu saya sudah menulis tentang Oracle HS (Heterogeneous Services) di blog ini. Kala itu saya menggunakan Oracle HS di sistem operasi RedHat Enterprise Linux 4.5 dengan database Oracle 10g R2 XE (Express Edition) untuk mengakses database MySQL di sistem operasi Windows Server 2003. Di artikel ini saya akan membahas topik yang sama tapi kasusnya berbeda. Kali ini database Oracle 11g R2 Enterprise Edition terpasang di Oracle Linux 6.2, sedangkan database MySQL di Windows Server 2003. Dalam kasus ini kita tidak perlu melakukan konfigurasi di MySQL atau Windows Server 2003, semua konfigurasi Oracle HS akan dilakukan di sisi Oracle Linux 6.2.

Kita mulai dengan memasang driver ODBC untuk MySQL di server Oracle Linux 6.2.
su
rpm -ivh mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm
Paket RPM tersebut sudah ada di DVD installer Oracle Linux 6.2 tapi kita bisa juga mengunduhnya dari situs MySQL. Namun dari pengalaman saya, installer ODBC dari situs MySQL membutuhkan paket dependency yang belum tersedia di Oracle Linux 6.2.

Selanjutnya kita akan membuat konfigurasi ODBC di /etc/odbc.ini, gunakan editor seperti vim atau nano untuk menambahkan baris berikut ke berkas tersebut.
[MY_SQL]
DRIVER = /usr/lib64/libmyodbc5.so
SERVER = 10.15.5.71
UID = username
PWD = password
DATABASE = database
PORT = 3306

[ODBC]
TRACE = 1
TRACEFILE = /tmp/odbc.log
Ganti informasi SERVER, UID, PWD, DATABASE masing-masing secara berurutan dengan alamat IP server, username, password user bersangkutan, dan basis data MySQL yang akan diakses.

Kita juga harus membuat konfigurasi Oracle HS di $ORACLE_HOME/hs/admin/initSID.ora yang berisi data-data di bawah ini.
HS_FDS_CONNECT_INFO = MY_SQL
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P15

set ODBCINI = /etc/odbc.ini
set ODBCINSTINI = /etc/odbcinst.ini
Perhatikan baris HS_FDS_CONNECT_INFO harus memiliki nilai yang sama dengan konfigurasi di /etc/odbc.ini. $ORACLE_HOME adalah direktori untuk produk database Oracle. Di Oracle Linux 6.2 kita bisa menampilkannya dengan perintah:
echo $ORACLE_HOME
SID pada initSID.ora harus diganti dengan nama SID yang akan digunakan untuk mengakses MySQL. Di sistem Oracle Linux yang saya gunakan, path lengkap untuk konfigurasi inisial Oracle HS menjadi /oracle/product/11.2.0/dbhome_1/hs/admin/initMYSQLDB.ora.

Terakhir, kita harus menambahkan konfigurasi untuk mengakses database MySQL melalui Oracle HS (Heterogeneous Services) di $ORACLE_HOME/network/admin/tnsnames.ora dan $ORACLE_HOME/network/admin/listener.ora. Kedua konfigurasi ini sangat sensitifm sedikit kesalahan ketik saja akan mengakibatkan Oracle HS tidak berjalan dengan baik. Berikut cuplikan untuk konfigurasi tnsnames.ora.
MYSQLDB =
   (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db.company.com)(PORT = 1521))
         (CONNECT_DATA =
            (SID = MYSQLDB)
      )
      (HS = OK)
   )
Tambahkan baris-baris di atas ke baris terakhir tnsnames.ora. Jangan lupa mengganti db.company.com pada parameter HOST dengan nama domain atau alamat IP server Oracle Linux 6.2. Lalu di listener.ora konfigurasinya menjadi:
SID_LIST_LISTENER =
  (SID_LIST =
     (SID_DESC =
        (SID_NAME = MYSQLDB)
        (ORACLE_HOME = /oracle/product/11.2.0/dbhome_1)
        (PROGRAM = dg4odbc)
     )
  )

LISTENER =
  (DESCRIPTION_LIST =
     (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = db.company.com)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
     )
     (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = db.company.com)(PORT = 1522))
      )
   )

ADR_BASE_LISTENER = /oracle
Konfigurasi yang berwarna merah menandakan baris yang saya tambahkan di konfigurasi lama. Samakan db.company.com pada parameter HOST seperti pada tnsnames.ora. Selanjutnya kita reload konfigurasi listener Oracle dengan menjalankan perintah berikut dari terminal:
lsnrctl reload
Pastikan instance untuk layanan MySQL sudah dijalankan dengan perintah lsnrctl status yang menghasilkan output untuk SID MYSQLDB, lebih kurang seperti:
Service "MYSQLDB" has 1 instance(s).
   Instance "MYSQLDB", status UNKNOWN, has 1 handler(s) for this service...
Cek juga apakah output dari lsnrctl services sudah menampilkan instance MYSQLDB. Jika sudah, masuk ke Oracle menggunakan sqlplus, buat database link, dan coba jalankan query ke server MySQL.
sqlplus / as sysdba
create public database link mysql connect to "username" identified by "password" using 'MYSQLDB'
select from nm_tabel@mysql
mysql adalah nama database link yang kita buat pada perintah create public database link. Ganti username dan password seperti yang kita gunakan di /etc/odbc.ini. Ganti juga nm_tabel dengan nama tabel yang ada di database yang kita tetapkan di /etc/odbc.ini. Seharusnya perintah terakhir menampilkan semua record yang ada di tabel nm_tabel jika konfigurasi instalasi Oracle HS sudah tepat.