Beberapa waktu lalu, aplikasi saya tiba-tiba tidak dapat terhubung ke database Oracle. Saya belum mengetahui secara pasti apa penyebabnya. Saat mencoba login ke database, muncul pesan error ORA-12514.

Error saat login ke database oracle.
Error saat login ke database oracle.

Solusi Pertama

Setelah mencoba berbagai cara, akhirnya saya menemukan solusi agar database dapat berjalan kembali. Namun, solusi ini masih bersifat sementara — setidaknya database sudah bisa digunakan terlebih dahulu. Langkah-langkahnya saya ringkas sebagai berikut:

Setting Environment ORACLE_SID
set ORACLE_SID=ORCL

Ket: ORCL adalah nama database saya.

Login dengan Akses Administrator (SYSDBA)
sqlplus / as sysdba
Login dengan akses SYSDBA.
Login dengan akses SYSDBA.
Jalankan Database
startup;

Setelah menjalankan (startup) database, ternyata muncul satu permasalahan lagi yaitu error ORA-01078,

Error ORA-01078.
Error ORA-01078.

Error ini menunjukkan bahwa Oracle gagal membaca parameter file INITORCL.ORA, walaupun file tersebut sebenarnya ada.

Tambahkan parameter file (PFILE)

Dari error yang muncul saya coba cari keberadaan file INITORCL.ORA tersebut, dan ternyata memang file itu ada, namun Oracle service tidak memiliki akses untuk membaca file tersebut. Akhirnya saya coba menambahkan parameter file PFILE='C:\app\Administrator\product\12.2.0\dbhome_1\database\INITORCL.ORA setelah startup.

startup PFILE='C:\app\Administrator\product\12.2.0\dbhome_1\database\INITORCL.ORA';

Dan seperti yang diharapkan, akhirnya database dapat berjalan.

Database berhasil dijalankan.
Database berhasil dijalankan.

Cek status database,

SELECT instance_name, status FROM v$instance;
Status database open.
Status database open.

Masalah Baru

Sampai disini, terlihat masalah sudah teratasi, namun ada masalah baru yang muncul yaitu setelah database dishutdown atau komputer direstart.

Database tidak bisa startup otomatis.
Database tidak bisa startup otomatis.

Masalahnya adalah, ternyata Oracle tidak bisa melakukan startup secara otomatis setelah database dishutdown atau komputer direstart. Karena secara umum, oracle akan melalui 3 tahap utama saat melakukan startup yaitu:

  1. NOMOUNT / STARTED
  2. MOUNT
  3. OPEN

Bagaimana Proses / Tahapan STARTUP pada Oracle?

STARTUP NOMOUNT / STARTED

Pada tahap NOMOUNT / STARTED, Oracle setidaknya akan melakukan beberapa aktivitas diantaranya:

  • Membaca SPFILEORCL.ORA atau INITORCL.ORA
  • Membuat SGA (System Global Area)
  • Menjalankan background proses seperti: PMON, SMON, DBWn, LGWR, dan CKPT

Pada tahap ini oracle belum membuka control file, datafile, dan redo log. Kegagalan umum yang sering terjadi pada tahap ini biasanya:

  1. Parameter file rusak (INITORCL.ORA)
  2. SPFILE tidak ditemukan
  3. Oracle tidak memiliki akses untuk menulis (write) dan membaca (read) file pada ORACLE_HOME — seperti pada kasus saya ini — yang mana solusi untuk permasalah ini akan saya bahas nanti.
STARTUP MOUNT

Setelah instance hidup, Oracle akan membaca control file seperti: control01.ctl, sehingga Oracle akan mengetahui: nama database, lokasi datafile, redo log, dan checkpoint. Kegagalan yang sering terjadi pada tahap ini adalah control file hilang atau rusak.

STARTUP OPEN

Ini adalah tahap terakhir dari proses startup. Pada tahap ini Oracle akan membuka datafile, undo, dan redo log. Kegagalan umum pada tahap ini adalah:

  • datafile hilang
  • redo log corrupt
  • recovery needed

Inilah beberapa tahapan yang akan dilakukan saat Oracle pertama dijalankan. Normalnya, saat perintah STARTUP dijalankan, Oracle secara otomatis akan melakukan perintah:

  1. STARTUP NOMOUNT
  2. ALTER DATABASE MOUNT
  3. ALTER DATABASE OPEN

Sehingga kegagalan pada setiap tahap akan menyebabkan proses STARTUP terhenti.


Solusi Final dari Permasalahan Saya

Setelah melakukan analisa dan trial and error pada setiap tahapan STARTUP Oracle, akhirnya saya menemukan solusi dari permasalahan ini. Langkah-langkahnya adalah sebagai berikut:

Hapus / rename SPFILEORCL.ORA

Langkah pertama yang saya lakukan adalah menghapus atau merename SPFILEORCL.ORA, karena file ini nantinya akan dicreate ulang. Lokasi file biasanya ada pada folder %ORACLE_HOME%\database.

Setting Environment ORACLE_SID
set ORACLE_SID=ORCL
Login dengan Akses Administrator (SYSDBA)
sqlplus / as sysdba
Startup dengan parameter file
STARTUP PFILE='C:\app\Administrator\product\12.2.0\dbhome_1\database\INITORCL.ORA';

Cat: Langkah-langkah ini sudah dijelaskan sebelumnya.

Show parameter spfile
SHOW PARAMETER spfile;
Show parameter spfile.
Show parameter spfile.

Terlihat bahwa value spfile masih kosong, yang menandakan bahwa SPFILE belum dibuat.

Buat SPFILE
CREATE SPFILE FROM MEMORY;
Error saat membuat SPFILE.
Error saat membuat SPFILE.

Dan ternyata terjadi error saat membuat SPFILE. Dari error ini saya menemukan akar permasalahannya, yaitu Oracle service tidak memiliki akses untuk membaca (read) dan menulis (write) file pada folder database. OracleServiceORCL berjalan menggunakan account NT SERVICE\OracleServiceORCL, sehingga account tersebut harus memiliki permission untuk membaca dan menulis file pada folder database Oracle. Perhatikan Service OracleServiceORCL — buka Services.msc, cari OracleServiceORCL, klik kanan, pilih Properties, dan buka tab Log On — berikut:

Oracle Service pada Windows.
Oracle Service pada Windows.
Tambahkan account NT SERVICE\OracleServiceORCL pada folder database

Klik kanan pada folder database, pilih Properties, klik pada tab Security, dan klik tombol Advanced.

Tab Security pada Properties folder database.
Tab Security pada Properties folder database.

Klik tombol add dan centang Replace all child object permission...,

Klik tombol Add.
Klik tombol Add.

Klik select principal,

Klik select principal.
Klik select principal.

Tambahkan NT SERVICE\OracleServiceORCL pada form Select User or Group,

Tambah NT SERVICE\OracleServiceORCL pada User or Group.
Tambah NT SERVICE\OracleServiceORCL pada User or Group.

Klik Check Names dan tombol OK.

Centang Full control pada Basic permissions

Centang Full control pada Basic permissions.
Centang Full control pada Basic permissions.

Klik tombol OK.

Buat ulang SPFILE
CREATE SPFILE FROM MEMORY;
Berhasil membuat SPFILE.
Berhasil membuat SPFILE.

Terlihat bahwa SPFILE berhasil dibuat.

Shutdown database
SHUTDOWN IMMEDIATE;
Shutdown database.
Shutdown database.
Startup database tanpa parameter file (PFILE)

Sekarang coba lakukan STARTUP tanpa menggunakan parameter file (PFILE)

STARTUP;
Startup database tanpa parameter file.
Startup database tanpa parameter file.

Terlihat bahwa STARTUP berhasil walaupun tanpa menggunakan parameter file (PFILE).

Cek ulang parameter spfile
SHOW PARAMETER spfile;
Value spfile sudah tidak kosong.
Value spfile sudah tidak kosong.

Terlihat bahwa value spfile sudah tidak kosong lagi, yang menandakan bahwa SPFILE berhasil dibuat.

Cek status database
SELECT instance_name, status FROM v$instance;
Status database open.
Status database open.

Yaps, sampai di sini permasalahan sudah selesai. Dengan konfigurasi ini, Oracle dapat melakukan startup secara normal setelah database dishutdown maupun setelah komputer direstart.


Kesimpulan

Permasalahan ini terjadi karena Oracle service account tidak memiliki permission untuk membaca (read) dan menulis (write) file parameter database (SPFILE dan PFILE) pada folder Oracle Database. Akibatnya, Oracle gagal membaca maupun membuat file parameter secara otomatis saat proses startup dijalankan.

Sekian, semoga bermanfaat.

CMIIW.