The Intro
Sebelumnya kita sudah mencoba membackup schema oracle menggunakan exp. Kita bisa memanfaatkannya untuk membuat sebuah sistem penjadwalan yang secara otomatis membackup schema tersebut pada waktu yang telah ditentukan. Tool yang digunakan selain Shell dan exp juga crontab. Crontab merupakan aplikasi penjadwalan di mesin Unix dan Linux. Crontab bekerja sebagai daemon atau service cron yang setiap waktu akan mengecek apakah ada job atau tugas yang harus dilakukan pada waktu itu. Crontab menyimpan entri untuk setiap penjadwalan seperti ini:
* * * * * /home/alam/someScript.sh
Kolom pertama menunjukan menit dimana entri tersebut akan dijalankan. Kolom kedua untuk jam, kolom ketiga untuk tanggal, kolom keempat untuk bulan, kolom kelima untuk untuk hari, dan kolom terakhir menunjukan perintah apa yang akan dijalankan. Dari contoh diatas berarti setiap menit, setiap hari, setiap bulan cron akan menjalankan script tersebut.
Pertama-tama kita buat dulu script sederhana, train-backup.sh yang berfungsi untuk membackup schema tersebut. Script tersebut akan membackup schema-nya di directory yang sudah ditentukan dengan nama file yang berbeda berdasarkan kapan schema tersebut dibackup.
The Script
#!/bin/sh
#script to backup oracle schema based on time when it saved
#initializing variables
export PATH=$PATH:/app/oracle/product/10.2/bin
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/10.2
export ORACLE_SID=neuron
export BASEDIR=$HOME/train-backup
export DTM=`date +%Y%m%d-%H%M%S`
export UNAME=train
export PASSWD=train
export FILENAME=train
# command section
cd $BASEDIR
exp $UNAME/$PASSWD file=$FILENAME-$DTM.dmp
exit
Jangan lupa beri execute permission dengan:
alam@NeuronServer:~> chmod +x train-backup.sh
Script-nya cukup sederhana kan? Yang perlu dilakukan hanyalah inisialisasi variabel:
export PATH=$PATH:/app/oracle/product/10.2/bin
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/10.2
export ORACLE_SID=neuron
export BASEDIR=$HOME/train-backup
export DTM=`date +%Y%m%d-%H%M%S`
export UNAME=train
export PASSWD=train
export FILENAME=train
dan perintah backup itu sendiri:
cd $BASEDIR
exp $UNAME/$PASSWD file=$FILENAME-$DTM.dmp
Untuk sedikit memahami dasar dari shell scripting silakan lihat kembali postingan sebelumnya.
Yang mungkin perlu diperhatikan adalah variabel DTM yang akan menyimpan format waktu untuk digunakan di nama filenya. Variabel DTM menyimpan hasil output dari perintah date yang akan menampilkan waktu saat itu dengan format YYYYMMDD-HH:MI:SS. Untuk lebih jelasnya coba jalankan perintah date tersebut di command line:
alam@NeuronServer:~> date +%Y%m%d-%H%M%S
20090105-201620
Variabel ini akan kita tambahkan di nama file backup schema-nya untuk membedakan satu file dengan yang lain.
The Cron
Sekarang kita masuk ke bagian cron-nya sendiri. Kita tentukan kapan saja backup akan dilakukan. Misal kita ingin backup dilakukan setiap jam 12 malam setiap hari Senin dan Jum’at. Entri crontab-nya seperti ini:
* 00 * * 1,5 /home/alam/train-backup.sh
Untuk memasukkan entri diatas gunakan perintah crontab -e. Editor vi akan terbuka. Untuk masuk ke mode insert tekan tombol i. Ketikkan atau paste entri yang tadi kita buat. Untuk menyimpannya tekan tombol Esc, dilanjutkan dengan tombol :, dilanjutkan dengan tombol x, yang berarti menyimpan sekaligus keluar dari vi.
Untuk melihat apakah penjadwalan tersebut sudah masuk gunakan perintah crontab -l:
alam@NeuronServer:~> crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.XXXXLhlmgJ installed on Mon Jan 5 20:28:21 2009)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
* 00 * * 1,5 /home/alam/train-backup.sh
The… End?
Selesai! Untuk melihat berhasil atau tidaknya kita lihat lagi besok apakah file backup schema-nya sudah ada atau tidak.
The Update
Coba kita lihat hasilnya:
alam@NeuronServer:~> ll train-backup
total 0
Lho kok tidak ada? Ayo kita cek script-nya dengan cara dijalankan langsung:
alam@NeuronServer:~> ./train-backup.sh
./train-backup.sh: line 16: exp: command not found
Hm? PATH-nya kan sudah masuk mestinya? Coba kita export dan tes lagi satu-satu variabelnya:
alam@NeuronServer:~> export ORACLE_BASE=/app/oracle
alam@NeuronServer:~> cd $ORACLE_BASE
alam@NeuronServer:/app/oracle> export ORACLE_HOME=/app/oracle/product/10.2
alam@NeuronServer:/app/oracle> cd $ORACLE_HOME
-bash: cd: /app/oracle/product/10.2: Permission denied
Ini dia masalahnya. User alam tidak punya permission untuk masuk ke direktori /app/oracle/product:
alam@NeuronServer:/app/oracle> ll /app/oracle/
total 20
drwxr-x--- 3 oracle oinstall 4096 2008-11-22 17:08 admin
drwxr-x--- 3 oracle oinstall 4096 2008-11-22 17:09 flash_recovery_area
drwxr-x--- 3 oracle oinstall 4096 2008-11-22 17:08 oradata
drwxrwx--- 6 oracle oinstall 4096 2008-11-22 17:07 oraInventory
drwxrwx--- 3 oracle oinstall 4096 2008-11-22 00:07 product
Jadi bagaimana solusinya? Kita jalankan script tersebut sebagai user yang punya permission untuk mengakses direktori tersebut, yaitu oracle:
oracle@NeuronServer:~> mkdir train-backup
oracle@NeuronServer:~> /home/alam/train-backup.sh
Export: Release 10.2.0.1.0 - Production on Tue Jan 6 14:59:42 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user TRAIN
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user TRAIN
About to export TRAIN's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export TRAIN's tables via Conventional Path ...
. . exporting table TRAIN 2 rows exported
EXP-00091: Exporting questionable statistics.
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully with warnings.
oracle@NeuronServer:~> ll train-backup
total 16
-rw-r--r-- 1 oracle oinstall 16384 2009-01-06 14:59 train-20090106-145942.dmp
Jadi masukkan cron job-nya yang tadi untuk user oracle dengan crontab -e juga.
Dan crontab yang di user alam dihapus saja:
alam@NeuronServer:~> crontab -r
alam@NeuronServer:~> crontab -l
no crontab for alam
Sekarang sudah pasti berhasil.
Semoga bermanfaat and have a lot of fun!
Linux, Oracle
backup, crontab, exp, Linux, Oracle, script