Startup Inconsistent Database
Sebagai DBA kita kadang dipusingkan dengan masalah yang disebabkan oleh file corrupt. Masalah ini bisa disebabkan oleh database yang mati tiba-tiba karena listrik mati atau masalah di storage (disk). Misalnya database tidak bisa startup dengan error berikut
SQL> startup
ORACLE instance started.
Total System Global Area 1610612736 bytes
Fixed Size 2177912 bytes
Variable Size 396149896 bytes
Database Buffers 1207959552 bytes
Redo Buffers 4325376 bytes
Database mounted.
ORA-01113: file 2 needs media recovery
ORA-01110: data file 2: '/oradata/oracle/ts/undotbs01.dbf'
Biasanya database tidak bisa startup kalau yang perlu di-recovery adalah file UNDO atau SYSTEM. [Dalam contoh di atas adalah file UNDO]. Dalam kasus ini baik yang bermasalah file SYSTEM atau UNDO, perlakuan (work around atau solusi sementara) nya adalah sama.
Lakukan recover database
SQL> recover database;
ORA-00279: change 7516226638 generated at 05/05/2008 12:32:11
needed for thread 1
ORA-00289: suggestion : /oradata/oracle/ts/arc/1_42_653916655.dbf
ORA-00280: change 7516226638 for thread 1 is in sequence #42
Specify log: {ret=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00308: cannot open archived log
‘/oradata/oracle/ts/arc/1_42_653916655.dbf’
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
Open database
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 2 needs media recovery
ORA-01110: data file 2: '/oradata/oracle/ts/undotbs01.dbf'
Mau tidak mau kita butuh archived log dan/atau logfile yang berisi sequence yang dibutuhkan. Bila archived log atau logfile (yang dibutuhkan) tidak tersedia karena corrupt (atau hilang) maka sampai kapanpun database tidak akan bisa dinaikkan.
Berikut ini adalah work around (solusi sementara) untuk menaikkan database. Database nantinya akan up dengan kondisi inconsistent (tidak konsisten). Kalau database berisi data yang sangat urgent, ini mungkin terasa tidak masalah, yang penting database bisa up dan data bisa diselamatkan.
Work Around
- Edit Init file
Remark parameterundo_managementdanundo_tablespace
Tambahkan parameter berikut:
UNDO_MANAGEMENT=MANUAL
_ALLOW_RESETLOGS_CORRUPTION = TRUE
_ALLOW_ERROR_SIMULATION = TRUE
_CORRUPTED_ROLLBACK_SEGMENTS =(_SYSSMU1,_SYSSMU2,_SYSSMU3, ...)
Dapatkan value _CORRUPTED_ROLLBACK_SEGMENTS dari [OS] command berikut
cd system_datafile_directory
strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u - Matikan database, dan nyalakan dengan initfile yang telah diedit tersebut. Pfile HARUS disebutkan secara eksplisit di command startup.
SQL> startup mount
pfile='/data1/oracle/product/10.2.0/dbs/initts.ora';
ORACLE instance started.
Total System Global Area 1610612736 bytes
Fixed Size 2177912 bytes
Variable Size 396149896 bytes
Database Buffers 1207959552 bytes
Redo Buffers 4325376 bytes
Database mounted. - Recover database until cancel
SQL> recover database until cancel;
ORA-00279: change 7516226638 generated at 05/05/2008 12:32:11
needed for thread 1
ORA-00289: suggestion :
/oradata/oracle/ts/arc/1_42_653916655.dbf
ORA-00280: change 7516226638 for thread 1 is in sequence #42Specify log: {ret=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: ‘/oradata/oracle/ts/system01.dbf’
ORA-01112: media recovery not started - Open database
SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.

August 13th, 2008 at 7:19 am
pak rohmad, database server saya sering mati sendiri (belum tau penyebabnya apa), trus saya ingin mendetect nya secara otomatis.Misalkan kita buat script yang akan mendetect db yg mati tiba2 dan kemudian melakukan backup dan menaikkan kembali db tersebut. Saya belum nemu syntax atau cara utk mendetect dan menjalankan script tsb spy automatically run ketika db down. Bisa dijelaskan pak?
terima kasih byk
August 13th, 2008 at 10:01 am
Hallo Pak Nasree.
Saya juga melakukan hal semacam itu, saya bikin shell script yang ngecek database. Kalau database down, shell script tersebut akan mengirim notifikasi (dalam hal ini SMS) ke saya.
Ini contohnya. Saya copy & paste aja ya
#!/usr/bin/ksh # Created by Rohmad Feb 25, 2008 export ORACLE_HOME=/opt/oracle/product/10.2.0.2 export LOG=/opt/oracle/home/rohmad/cekdb.log export LOGHIS=/opt/oracle/home/rohmad/cekdb`date "+%Y%m%d_%H%M%S"`.log export DB=${1} ReciptList="/usr/local/ADMIN/scripts/trigger_resync/recipient.lst" SMSTo=`grep -v "#" $ReciptList | nawk '{print $2}' | tr "\012" "\040" | tr "\040" "\053"` #SMSTo=08176551105 date1=$(date "+%H:%M:%S %d-%m-%Y") MSG=0 $ORACLE_HOME/bin/sqlplus cek_dummy/cek_dummy@${DB} < < EOF > $LOG EOF cd /opt/oracle/home/rohmad MSG=`grep “ORA-01017: invalid username/password; logon denied” cekdb.log|wc -l` if [ $MSG = 1 ] then echo “Database ${DB} is Up” echo $MSG; else echo “Database ${DB} is down at ${date1}” echo $MSG; SMSMessage=”Database ${DB} is down at ${date1}” echo $SMSMessage >> $LOGHIS /usr/local/ADMIN/scripts/trigger_resync/sms.ksh ${SMSTo} ${SMSMessage} fiscript ini saya jalankan di crontab, jalan setiap setengah jam sekali
Kalau anda familiar dengab shell script di UNIX, anda bisa menambahkan step untuk menaikkan database kalau down.