Minggu, 19 Juni 2011

Arsitektur Database dan Tuning

Resume pertemuan 11
M. Septian Maulana
09.41010.0170

Arsitektur Database
Kata database dalam frasa “arsitektur database Oracle” seharusnya adalah Database Management System (DBMS). Untuk penyederhanaan penyebutan, Database Management System memang sering cukup disebut database saja.
Secara umum komponen DBMS Oracle terdiri atas memory, proses, dan file-file. Lebih jauh lagi, komponen-komponen tersebut dikelompokkan sebagai berikut:
  1. Instance
    - Memory yang disebut sebagai System Global Area (SGA), terdiri atas: Shared Pool (Libary Cache and Data Dictionary Cache), Database Buffer Cache, Redolog Buffer Cache, Java Pool, Large Pool.
    - Back ground process: PMON, SMON, DBWR, LGWR, CKPT, dan lain-lain
  2. Database
    - Datafile
    - Control file
    - Redo log file
  3. Komponen lain
    - process: Server Process, user process
    - memory: Program Global Area (PGA)
    - File: Archived log, parameter, dan password file

Perbedaan Instance dengan Database

Kebanyakan kita mungkin tidak tahu persis perbedaan instance dan database. Banyak yang mengira bahwa instance itu ya database. Bagi yang lebih kritis lagi lantas bertanya-tanya, kalau gitu apa gunanya Oracle memakai istilah instance dan database?
Kalau kita membuat database dengan DBCA, by default nama instance dan nama database itu memang sama. Apakah nama database yang saat ini kita maintain itu sama dengan nama instance?
  • Untuk mengecek nama instance, pastinya semua DBA Oracle sudah tahu. Value dari ORACLE_SID adalah nama dari instance juga.
  • Untuk mengecek nama database, gunakan command select VALUE from v$parameter where NAME=’db_name’
Lebih jelasnya, ada baiknya kita lihat Arsitektur Database Oracle di sinihttp://rohmad.net/2008/04/17/arsitektur-database-oracle/
Instance adalah struktur proses dan memory yang menjalankan sistem database (DBMS, database management system). Sedangkan database adalah sekumpulan file yang menyimpan data (yang terdiri atas datafile, controlfile, dan redo log file).
Istilah Database Oracle yang sering kita pakai itu merujuk pada database management system (DBMS) Oracle. Ngucapin database management system mungkin terlalu panjang. Ngucapin DBMS mungkin kok tidak enak. Jadi gampang-gampangan, sebut saja database.

Administrasi Control File

Selain datafile dan log dfile, control file merupakan salah satu file utama database Oracle. Secara global ada baiknya kita lihat lagi arsitektur database Oracle. Informasi yang disimpan di contol file di antaranya adalah nama database, lokasi datafile dan logfile, nomor SCN, dan lain-lain.
View-view dictionary yang datanya diambil dari control file di antaranya adalah: v$DATABASE, v$DATAFILE, v$TEMPFILE, v$LOGFILE, V$LOG, dan lain-lain. Control file dibaca Oracle ketika instance sedang mount. Oleh karena itu, view-view tersebut bisa di-query meskipun database dalam keadaan mount (belum open).
Lokasi 
Lokasi control file ditunjukkan oleh parameter control_files. Silahkan temukan parameter control_files ini di instance parameter (init file atau spfile). Atau gunakan SQL command berikut:

SQL> show parameter control_files
SQL> -- atau
SQL> select name from v$controlfile;
SQL> -- atau
SQL> select NAME,VALUE from  v$parameter
where NAME ='control_files';

Melihat isi control file
Untuk melihat informasi apa saja yang disimpan di control file, gunakan SQL command berikut:

SQL> select * from V$CONTROLFILE_RECORD_SECTION order by type;

Untuk melihat definisi control file, backup control file ke file text. Gunakan perintah ini:

SQL> alter database backup controlfile to trace;

Perintah di atas akan membuat trace file yang disimpam di direktori user_dump_dest. Gunakan perintah SQL “show parameter user_dump_dest” untuk melihat lokasi direktori tersebut. Format file adalah NAMAISNTANCE_ora_OSID.trc. Di contoh saya ini, trace file yang di-generate adalah ts_ora_22363.trc.
Isi trace file ini adalah script untuk re-create control file. Ada dua bagian, yaitu recreate dengan opsi NORESETLOGS atau RESETLOGS. Berikut ini adalah content control file (dengan opsi NORESETLOGS)

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "TS" NORESETLOGS FORCE LOGGING ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 4 '/oradata/oracle/ts/redo04.log'  SIZE 5M,
GROUP 5 '/oradata/oracle/ts/redo05.log'  SIZE 5M,
GROUP 6 '/oradata/oracle/ts/redo06.log'  SIZE 5M
DATAFILE
'/oradata/oracle/ts/system01.dbf',
'/oradata/oracle/ts/undotbs01.dbf',
'/oradata/oracle/ts/sysaux01.dbf',
'/oradata/oracle/ts/users01.dbf2',
'/oradata/oracle/ts/test01.dbf',
'/oradata/oracle/ts/test02.dbf'
CHARACTER SET WE8MSWIN1252
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/oracle/ts/temp01.dbf2'
SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

Bagain kedua, yaitu recreate dengan opsi RESETLOGS, intinya sama saja. Hanya berbeda pada poin-poin berikut:

CREATE CONTROLFILE REUSE DATABASE "TS" RESETLOGS FORCE LOGGING ARCHIVELOG
RECOVER DATABASE USING BACKUP CONTROLFILE
ALTER DATABASE OPEN RESETLOGS;

Menambah, multiplexing (mirroring) control file
Ketika membuat database dengan dbca, by default Oracle akan membuat 3 control file. Isi ketiga control file tersebut adalah sama. Sebenarnya, 1 control file saja cukup. Kita dianjurkan untuk membuat lebih dari 1 untuk jaga-jaga (multiplex/mirror), kalau-kalau salah satu control file corrupt kita masih punya yang lainnya. Oleh karena itu, idealnya masing-masing control file ditaruh di file system (drive) yang berbeda.
Multiplexing dilakukan dengan menambah control file. Misalkan kita sudah punya 3 control file berikut:

/oradata/oracle/ts/control01.ctl
/oradata/oracle/ts/control02.ctl
/oradata/oracle/ts/control03.ctl

Saya ingin menambah 1 control file lagi dan saya taruh di directory /data1/oracle. Berikut ini step-stepnya:
  1. Shutdown database

SQL> shutdown immediate

  1. Copy control file. Bisa yang mana saja, toh isinyanya sama semua

3.           cd /data1/oracle/
cp -rp /oradata/oracle/ts/control03.ctl control04.ctl

  1. Edit parameter control_files di instance parameter file (initfile atau spfile).
    Kalau pakai init file, edit file $ORACLE_HOME/dbs/initts.ora (dalam contoh ini, nama instance adalah ts). Tambahkan control file yang baru tersebut ke definisi control_files:

5.           control_files='/oradata/oracle/ts/control01.ctl',
6.           '/oradata/oracle/ts/control02.ctl',
7.           '/oradata/oracle/ts/control03.ctl',
'/data1/oracle/control04.ctl'

Kalau pakai spfile, kita tidak bisa mengedit spfile pakai text edior, mau tidak mau ya harus startup instance (cukup startup nomount saja):

SQL> startup nomount
SQL> alter system set control_files=
'/oradata/oracle/ts/control01.ctl',
'/oradata/oracle/ts/control02.ctl',
'/oradata/oracle/ts/control03.ctl',
'/data1/oracle/control04.ctl'
scope=spfile;
SQL> shutdown immediate

  1. Startup database. Check bahwa sekarang control file sudah bertambah

9.           SQL> startup
10.       SQL> select name from v$controlfile;
11.
12.       NAME
13.       --------------------------------------
14.       /oradata/oracle/ts/control01.ctl
15.       /oradata/oracle/ts/control02.ctl
16.       /oradata/oracle/ts/control03.ctl
/data1/oracle/control04.ctl

Me-rename (memindahkan) control file
Step-stepnya hampir sama dengan menambah control file. Misalkan kita akan memindahkan control file /data1/oracle/control04.ctl ke directory /data2/oracle/
  1. shutdown database
  2. pindahkan (rename) control file

3.           cd /data2/oracle/
mv /data1/oracle/control04.ctl /data2/oracle/

  1. Edit instance parameter file (initfile atau spfile). Ganti control file yang lama (/data1/oracle/control04.ctl) menjadi yang baru (/data2/oracle/control04.ctl):

5.           control_files='/oradata/oracle/ts/control01.ctl',
6.           '/oradata/oracle/ts/control02.ctl',
7.           '/oradata/oracle/ts/control03.ctl',
'/data2/oracle/control04.ctl'

  1. startup database
Mengurangi (delete/drop) control file
Step-stepnya juga hampir sama saja dengan menambah control file, intinya adalah membuang (take out) control file (yang akan dibuang) dari parameter control_files. Misalkan saya ingin menghapus control file /data2/oracle/control04.ctl.
  1. shutdown database
  2. Take out /data2/oracle/control04.ctl dari parameter control_files.

3.           control_files='/oradata/oracle/ts/control01.ctl',
4.           '/oradata/oracle/ts/control02.ctl',
'/oradata/oracle/ts/control03.ctl'

  1. startup database

Memindahkan atau Me-rename Datafile

Kadang kita perlu memindahkan datafile dari satu tempat (disk/file system/directory/drive) ke tempat yang lainnya. Atau kadang juga kita perlu me-rename datafile karena ada salah ketik waktu membuatnya. Baik memindahkan file dari satu tempat ke tempat lain, maupun merename datafile di tempat yang sama, intinya adalah sama saja.
Misalkan kita ingin memindahkan/me-rename datafile dari ‘/oradata/oracle/ts/users01.dbf’ ke ‘/oradata/oracle/ts/users02.dbf’
Pada database yang NOARCHIVELOG:
  1. Shutdown database

2.           SQL> shutdown immediate

  1. Pindahkan/move/rename datafile. Di Windows bisa pakai Windows explorer. Di unix gunakan command ini:

4.           mv /oradata/oracle/ts/users01.dbf /oradata/oracle/ts/users02.dbf

  1. Startup mount database

6.           SQL> startup mount

  1. Rename datafile di level database

8.           SQL> alter database rename file '/oradata/oracle/ts/users01.dbf'
9.           to '/oradata/oracle/ts/users02.dbf';

  1. Setelah itu, open database

11.       SQL> alter database open;

Pada database yang ARCHIVELOG:
  1. Tidak perlu shutdown database. Cukup offline-kan datafile yang bersangkutan

SQL> alter database datafile '/oradata/oracle/ts/users01.dbf' offline;

  1. Pindahkan/move/rename datafile. Di Windows bisa pakai Windows explorer. Di unix gunakan command ini:

mv /oradata/oracle/ts/users01.dbf /oradata/oracle/ts/users02.dbf

  1. Rename datafile di level database

4.           SQL> alter database rename file '/oradata/oracle/ts/users01.dbf'
5.           to '/oradata/oracle/ts/users02.dbf';

  1. Setelah itu, recover datafile yang telah di-rename tersebut

SQL> recover datafile '/oradata/oracle/ts/users02.dbf';

  1. Terakhir, online-kan datafile yang telah di-rename tersebut

alter database datafile '/oradata/oracle/ts/users01.dbf' online;

Pada metode pertama di atas (untuk database NOARCHIVELOG), mau tidak mau database tersebut tidak bisa diakses karena harus di-shutdown dulu (ada downtime).
Sementara pada metode kedua (untuk database ARCHIVELOG) database masih bisa diakses (baik query maupun transaksi), kecuali data (bytes) yang secara intrinsik disimpan di datafile tersebut tidak bisa diakses. Misalkan datafile diatas adalah milik tablespace USERS, dan tablespace USERS punya dua datafiles; maka data yang secara intriksik ada di datafile lain (bukan yang di-offline-kan tersebut) masih bisa diakses.

High Water Mark

Beberapa waktu yang lalu saya membahas tentang bagimana cara mengurangi size dari datafile (tablespace). Datafile tidak bisa dikurangi sampai batas High Water Mark (HWM).
Misalkan kita punya tablespace USERS yang punya datafile 3G. Namun bila kita lihat di OEM, TOAD, atau melalui view dba_free_space, ternyata datafile tersebut mempunyai free space cukup banyak yaitu 2G, itu artinya yang kepakai hanya 1G. Namun datafile tersebut tidak bisa diresize menjadi 1G, bahkan 2G saja tidak bisa.
SQL> alter database
datafile '/oradata/oracle/ts/users01.dbf' resize 2048M;
ORA-03297: file contains used data beyond requested RESIZE value
Dulunya, tablespace USERS mungkin (pasti) pernah kepakai sampai 3G. Bisa kepakai oleh table, index, ataupun temp segment. Namun sekarang sudah banyak yang dihapus sehingga yang terpakai hanya 1G. Nah ini yang penting, DULUNYA pernah dipakai. Oracle membuat aturan bahwa datafile tidak bisa di-resize menjadi ukuran maksimal yang DULUNYA pernah dipakai. Ukuran maksimal yang DULUNYA pernah dipakai ini disebut sebagai HIGH WATER MARK (HWM).
Begini analoginya. Misalkan di kampung kita ada tanggul kali yang tingginya 4 meter. Sejak adanya tanggul itu, paling tinggi air mencapai 3,5 meter (inilah yang disebut sebagai HIGH WATER MARK, batas air paling tinggi yang pernah dicapai), setengah meter lagi mencapai batas atas tanggul.
Namun sejak 10 tahun terakhir ini air paling tinggi hanya mencapai 2 meter. Karena itulah warga sekitar menyarankan agar tanggul diturunkan menjadi 2 meter saja. Tanggul yang tinggi 4 meter itu bikin pemandangan tidak sedap. Tapi… oleh pemerintah daerah tanggul tidak boleh diturunkan sampai 3,5 meter (apalagi di bawah itu). Kalau mau menurunkan ya paling tidak sampai 3,6 meter lah. Katanya, ‘pamali’ kalau menurunkan tanggul di bawah ketinggian air maksimal yang pernah dicapai.
Kira-kira begitulah pengertian HIGH WATER MARK.
Mari kita lihat lebih dalam. Datafile berisi block-block data. Bayangkan dinding yang terbuat dari tumpukan 100 batu bata. Pada awalnya block-block ini disusun secara berurutan. Pada suatu hari kita menghapus data (delete), analoginya kita mau mengambil 5 batu bata. OO… ternyata data (batu bata) yang kita cari itu ada di tumpukan paling bawah. Berikutnya kita ingin menghapus data lagi (sebanyak 4 batu bata). Dan sekarang batu bata yang ini ada di tumpukan tengah. Demikianlah seterusnya hingga akhirnya yang tersisa ada 40 batu bata.
Sekarang, tumpukan 40 batu bata itu tidak beraturan dan memamakan ruang sebesar tumpukan 100 batu bata. Namun kita tidak bisa ngapa-ngapain karena sudah begitu adanya. Kalo diutak-atik malah bisa rubuh tumpukan batu bata itu. Jadi space sebesar tumpukan 100 batu bata itulah yang disebut sebagai HIGH WATER MARK, batas tertinggi yang pernah dipakai.
Gimana cara memaksa untuk menurunkan size datafile sampai di bawah HIGH WATER MARK?
Caranya, rubuhkan dan susun ulang tumpukan batu bata itu. Di database, rubuhkan dan susun ulang block-block data itu. Begini caranya:
  1. Export content (data-data) tablespace yang bersangkutan
  2. Buat tablespace baru yang punya size lebih kecil
  3. Import data yang telah di-export tersebut ke tablespace baru
  4. Drop tablespace lama
Namun untuk tablespace SYSTEM kita tidak bisa melakukan hal di atas. Satu-satunya cara bagi tablespace SYSTEM adalah:
  1. Export full database
  2. Buat database baru yang ukuran tablespace SYSTEM-nya lebih kecil
  3. Import full data yang telah di-export tersebut
  4. Drop database lama

Teori dan Administrasi init file (pfile dan spfile)

Konfigurasi instance disimpan di file bertipe text yang dikenal dengan init file (initial file) atau pfile (parameter file). Mulai versi 9i Oracle memperkenalkan pfile bertype binary yang disebut spfile.
Di Unix family, init file ada di directory $ORACLE_HOME/dbs. Sedangkan di Windows ada di folder %ORACLE_HOME%\database.
Format nama file:
  1. Pfile: initNAMAINSTANCE.ora
    Di Unix, nama instance adalah case sensitive, instance dataku berbeda dengan DATAKU. Pfile untuk instance dataku adalah initdataku.ora. Dan Pfile untuk instance DATAKU adalah initDATAKU.ora
Sedangkan di Windows, nama init file tidak case sensitive, instance dataku ya sama saja dengan DATAKU. Kalau kita membuat database dengan dbca, initfile yang terbentuk adalah INITdataku.ORA. Kalau file ini diganti dengan initDATAKU.ora yang tidak apa-apa, Windows gitu lho!
  1. Spfile: spfileNAMAINSTANCE.ora
    Sama seperti pfile, case sensitive di Unix dan tidak case sensitive di Windows.
Cara membuat initfile:
  1. pfile
    Dibuat secara manual pakai text editor , contoh: notepad di Windows dan vi di Unix. Bisa juga dibuat berdasarkan content spfile yang sudah ada.
    SQL> create pfile from spfile;
  2. spfile
    Spfile tidak bisa dibuat dengan text editor sebagimana membuat pfile. Tentu saja, file binary tidak bisa dibuat (diedit) dengan text editor. Spfile hanya bisa dibuat dengan cara berikut ini (content-nya diambil dari pfile yang sudah ada):
SQL> create spfile from pfile;
By default, kalau ada spfile maka ketika startup Oracle akan membaca parameter dari spfile. Kalau tidak ada spfile, Oracle membaca pfile. Kalau tidak ada kedua-duanya, instance tidak bisa di-startup. SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file
‘/mnt01/oracle/10.2.0.3/dbs/initDATAKU.ora’
Mengedit Init file (mengubah parameter instance)
Parameter instance ada dua tipe yaitu dynamic dan static. Parameter dynamic bisa diubah ketika instance sedang jalan sedangkan parameter static tidak bisa, artinya perubahan parameter static harus dilakukan di initfile dan instance harus di-restart.
Contoh parameter dinamik adalah pga_aggregate_target. Berikut ini cara untuk mengubahnya:
  1. Kalau instance sedang mati
    Naikkan instance dulu, kemudian lakukan perubahan pakai SQLPlus
SQL> startup
SQL> alter system set pga_aggregate_target=100m;
Perintah alter system di atas langsung mengubah parameter di instance (memory) yang berjalan.
    1. Kalau kita pakai spfile, perintah ini langsung mengupdate juga spfile. Sehingga ke depannya kalau kita merestart instance, Oracle membaca pga_aggregate_target=100m dari spfile.
    2. Kalau kita pakai pfile, pga_aggregate_target=100m tidak di-update ke pfile sehingga ke depannya kalau kita merestart instance, pga_aggregate_target kembali ke nilai semula. Agar perubahan bersifat permanen, edit juga parameter pga_aggregate_target di pfile
  1. Kalau instance sedang jalan
    Langsung lakukan perubahan di SQLPLus
    SQL> alter system set pga_aggregate_target=100m; Sama seperti penjelasan sebelumnya, kalau pakai spfile maka spfile juga diupdate secara otomatis. Kalau pakai pfile, agar perubahan bersifat permanen maka pfile harus diedit secara manual pakai text editor.
Contoh parameter statik adalah db_writer_processes, control_files, sessions, dsb. Berikut ini cara untuk mengubah parameter db_writer_processes yang bersifat statik itu:
  1. Kalau instance sedang mati
    Kalau pakai pfile, edit pfile pakai text editor, kemudian startup instance.
Edit pfile
SQL> startup
Spfile tidak bisa diedit pakai text editor, kalau tetep dipaksa edit pakai text edior maka spfile akan corrupt sehingga tidak dikenali oleh Oracle. Spfile hanya bisa diubah dengan SQLplus ketika instance naik. Jadi naikkan dulu instance, pakai nomount biar cepet toh kita tidak perlu instance mount atau open, yang penting startup dulu. Kemudian alter system set db_writer_processes=2 scope=spfile. Perintah ini akan mengedit spfile saja, sementara parameter di instance sendiri masih belum berubah. Setelah itu, baru startup
SQL> startup nomount
SQL> alter system set db_writer_processes=2 scope=spfile;
SQL> shutdown immediate
SQL> startup
  1. Kalau instance sedang jalan
Kalau pakai pfile, database matiin dulu, edit pfile, kemudian restart instance
SQL> shutdown immediate
Edit pfile
SQL> startup
Kalau pakai spfile, alter system dengan scope=spfile, kemudian restart
SQL> alter system set db_writer_processes=2 scope=spfile;
SQL> shutdown immediate
SQL> startup
Catatan
  1. Perintah alter system set pga_aggregate_target=100m by default kalau pakai spfile, maka
    alter system set pga_aggregate_target=100m scope=both
    Dan kalau pakai pfile. maka
    alter system set pga_aggregate_target=100m scope=memory
  2. Kita tidak bisa menjalankan alter system set db_writer_processes=2 karena ini adalah parameter static. Kalau masih dipaksa akan muncul error:
SQL> alter system set db_writer_processes=2;
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
Parameter static hanya bisa diubah di scope=spfile
SQL> alter system set db_writer_processes=2 scope=spfile;
System altered.
  1. Kalau dilihat pakai text editor, spfile berisi sama seperti pfile, hanya ada entry yang “aneh-aneh” (yang bukan merupakan parameter instance) di baris pertama.
  2. Contoh kasus.
Instance saya hanya punya spfile (spfileDATAKU.ora) dan tidak punya pfile (initDATAKU.ora)> Suatu ketika saya ingin mengubah parameter static (misalnya control_files). Karena ketidak tahuan, parameter control_files saya edit di spfileDATAKU.ora pakai text editor (notepad).
Karena spfile adalah file binary, maka spfile menjadi rusak karena diedit pakai text editor, sebagian akibatnya Oracle tidak bisa membacanya. Karena spfile tidak bisa dibaca, maka Oracle mencari pfile. Karena saya tidak punya pfile sementara spfile-nya corrupt, ya akhirnya saya tidak bisa startup instance
SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file
‘/mnt01/oracle/10.2.0.3/dbs/initDATAKU.ora’
Waduh… gimana ini?!! Solusinya, buat pfile initDATAKU.ora yang isinya sama persis dengan spfileDATAKU.ora, dengan catatan: jangan ikut sertakan entry spfileDATAKU.ora yang aneh-aneh di baris pertama itu.
Untuk melihat isi spfile spfileDATAKU.ora, di unix gunakan perintah more. Di Windows, gunakan wordpad; kalau pakai notepad biasanya tampilannya amburadul.

Startup dan shutdown instance

Administrasi (aktivitas) yang bisa kita lakukan pada instance adalah startupshutdown, danalter. Secara umum proses startup adalah sebagai berikut:
  1. Database mati (shutdown)
    Background process belum naik. Memori belum dialokasikan
  2. nomount
    Backgroung process dinaikkan. Memory dialokasikan
  3. mount
    Instance membaca control file. Control file berisi konfigurasi database. Instance belum membaca data file.
  4. open
    Instance sudah membaca data file (header). Database siap diakses
Command (perintah) startup :
startup
startup open
startup nomount
startup mount
startup force
Command “startup” saja tanpa argument, by default adalah “startup open”
Command “startup force” adalah sama saja dengan “shutdown abort” kemudian “startup”
Command shutdown :
shutdown normal
shutdown transactional
shutdown immediate
shutdown abort
Berikut ini perbandingan proses shutdown normal (N), transactional (T), immediate (I), dan abort (A):

Oracle Flashback Technology (Recycle bin)

Salah satu feature Oracle 10g (ke atas) yang jadi andalan saya adalah Oracle Flashback Technology. Dengan Oracle Flashback, kita bisa me-restore (recovery) data dengan sangat mudah.
Sebagai contoh, ketika kita secara tidak sengaja menghapus sebagian record di file Excel, untuk mengembalikannya, kita cukup klik tombol UNDO. Kita klik UNDO sekian kali untuk kembali ke kondisi data yang kita inginkan. Ketika kita tidak sengaka menghapus (drop/delete) file, untuk mengembalikan file tersebut kita cukup me-restore-nya dari recycle bin.
Nah, sederhanya, Oracle Flashback Technology menyediakan feature seperi UNDO dan RECYCLE BIN di Windows. Enak, bukan?
Macam-macam Oracle flashback:
1. Oracle Flashback Query. 
Berguna untuk melihat (query) isi tabel di masa lalu. Misalkan siang ini kita baru saja men-delete atau update record. Karena terkanjur commit, kita tidak bisa melakukan rollback. Dengan Oracle Flashback Query, kita bisa melihat record (isi tabel) tadi pagi sebelum kita delete atau update. Berikut ini contoh command-nya (Catatan: nama tabel yang saya pakai untuk contoh di artikel ini adalah TB):

SQL> SELECT * FROM TB AS OF TIMESTAMP
     TO_TIMESTAMP('2009-06-03 06:08:03', 'yyyy-mm-dd hh24:mi:ss');
SQL> SELECT * FROM TB AS OF TIMESTAMP
     TO_TIMESTAMP('2009-06-03 06:08:03', 'yyyy-mm-dd hh24:mi:ss') where nomor=3;

Keterbatasan:
  1. Karena feature ini memanfaatkan UNDO segment di UNDO tablespace, maka size dari UNDO tablespace sangat mempengaruhi sampai berapa lama masa lalu yang bisa dikembalikan lagi. Semakin besar UNDO tablespace maka semakin besar (lama) masa lalu yang bisa dikembalikan.Bila data yang diquery sudah tidak ada lagi di UNDO tablespace maka akan muncul error berikut:

ORA-08180: no snapshot found based on specified time

  1. Batas yang bisa query adalah setelah operasi DDL (data definition language) terakhir. Contoh DDL adalah mengubah definisi tabel (alter table, add column, alter column, truncate, dll). Bila data yang di-query ada pada waktu sebelum DDL terakhir (last DDL) maka akan muncul error berikut:

ORA-01466: unable to read data - table definition has changed

2. Oracle Flashback Table.
Berguna untuk mengembalikan kondisi (isi) tabel seperti kondisi di masa lalu. Seperti contoh di atas, kita bisa mengembalikan tabel TB sebagimana tadi pagi sebelum kita melakukan delete atau update record. Berikut ini perintahnya:

SQL> FLASHBACK TABLE TB TO TIMESTAMP
     TO_TIMESTAMP('2009-06-03 06:08:03', 'yyyy-mm-dd hh24:mi:ss');

Syaratnya: “ROW MOVEMENT” harus di-enable. Berikut ini command-nya:

SQL> ALTER TABLE TB ENABLE ROW MOVEMENT;

Kalau tidak di-enable, bila menjalankan command FLASHBACK TABLE akan muncul error message berikut:

ORA-08189: cannot flashback the table because row movement is not enabled

Keterbatasan: sama dengan Oracle Flashback Query.
User yang tidak punya ROLE DBA, agar bisa melakukan flashback harus mempunyai privilege FLASHBACK ANY TABLE. Contoh memberi privilege ke user EMP:

SQL> grant FLASHBACK ANY TABLE to EMP;

3. Oracle Flashback Drop. 
Berguna untuk mengembalikan tabel yang telah di-drop. Kalau di Windows adalah restore file dari recycle bin. Command untuk melihat isi dari recycle bin:

SQL> select * from dba_recyclebin;
SQL> select * from user_recyclebin;
SQL> select * from recyclebin;

Restore tabel:

SQL> FLASHBACK TABLE TB TO BEFORE DROP;

Kita juga bisa me-restore dan mengubah nama tabel tersebut:

SQL> FLASHBACK TABLE TB TO BEFORE DROP RENAME TO TB_OLD;

Keterbatasan:
Setelah (misalkan) tabel TB di-drop, secara physic data masih ada di tablespace, tidak dihapus, hanya diberi tanda (flag) bahwa space yang dipakai oleh tabel tersebut sewaktu-waktu bisa dihapus dan dipakai untuk yang lain. Ketika space kosong di tablespace sudah habis, sementara dibutuhkan space lagi untuk data yang baru masuk, maka space dari tabel TB tersebut akan dibersikan dan siap dipakai untuk data baru. Jadi, sampai berapa lama tabel akan disimpan di recycle bin? Ya tergantung ketersediaan free space di tablespace yang bersangkutan.
Catatan:
Berkaitan dengan truncate, dalam beberapa hal saya menghindari truncate dan lebih memilih drop table. Karena truncate adalah DDL maka kita tidak bisa mengembalikan data (table) pada kondisi sebelum truncate. Sementara itu drop table bisa di-restore kembali oleh Oracle Flashback Drop.
4. Oracle Flashback Database.
Merupakan alternatif lain dari database Point-In-Time Recovery.



TUNING DATABASE
Berikut ini pertanyaan-pertanyaan seputar tuning:
  1. Bagian mana yang perlu dituning. Siapa yang melakukan?
  2. Dari sisi aplikasi, apanya yang perlu dituning?
  3. Bagian database yang mana yang perlu dituning?
  4. Darimana kita bisa belajar banyak tentang tuning?

BAGIAN MANA YANG PERLU DITUNING? OLEH SIAPA?

  1. Aplikasi, oleh application designer dan developer
  2. Database, oleh database administrator (DBA)
  3. System Operasi (OS), oleh system administrator (sysadmin)

TUNING APLIKASI

Tuning aplikasi memberikan kontribusi tersebar terhadap performa sistem secara keseluruhan. Termasuk bagian-bagian tuning aplikasi adalah:
  1. Normalisasi yang tepat
  2. Pemakaian index
  3. Pemakaian hint dalam query SQL atau PL/SQL
  4. Pemanfaatan sharing cursor
  5. dan lain-lain

BAGIAN DATABASE YANG MANA YANG PERLU DITUNING?

  1. Memory -> PGA dan SGA SGA (shared pool, large pool, buffer cache, redo log buffer, sort area size)
  2. I/O -> distributing I/O, striping, multiple DBWn processes, DBWn I/O slaves.
  3. CPU -> CPU utilization.
  4. Network
  5. Space management -> extent allocation dan Oracle block efficiency.
  6. Redo log dan checkpoint -> redo log file configuration, redo entries, dan checkpoint.
  7. Rollback segment -> sizing rollback segments. Mulai versi 9i, banyakbagian yang dibuat automatic
  8. dan lain-lain

Leave a Reply