Kamis, 03 Mei 2018

Menggunakan Flashback dan Database Point-in-Time Recovery di Oracle

Pada kali ini akan membahas bagaimana cara menginvestigasi dari perubahan database yang tidak diinginkan dengan menerapkan strategi recovery berbasis flashback technology dan database backup.

Gambar 1. Flashback operation


Tujuan dari Flashback dan Database Point-in-Time-Recovery

  • User error atau terjadi data corruption. Semisalnya DBA secara tidak sengaja mengubah dari suatu table, atau menghapus dari object yang masih diperlukan
  • Kegagalan upgrade dari database atau script
  • Memulihkan database secara lengkap karena kegagalan media, dimana anda tidak memiliki semua redo logs dan incremental backup yang belum terupdate/

Physical Flashback Fitur sangat berguna di Backup dan Recovery

Flashback lebih efisien daripada penerapan media recovery. Dimana dia tidak perlu untuk memulihkan datafiles dan hanya membutuhkan sedikit penerapan dari redo log.

Pertama, mari kita pelajari restore point. Restore point ini digunakan untuk menjaga keutuhan dari database dari fixed time. Jadi kita dapat melakukan pengembalian keadaan sebelumnya secara langsung.
Ref : docs.oracle

1. Flashback dari update table
Untuk menggunakan restore point, pastikan anda memasukkan privilage SELECT ANY DICTIONARY dan FLASHBACK ANY TABLE ke dalam user hr.

Gambar 2. Hak akses user HR


Pertama, buatlah restore point dahulu:

SQL> CREATE RESTORE POINT good_data;

Restore point created.

Selanjutnya cek tabel anda yang mau dirubah

SQL> select salary from employees where employee_id=108;

    SALARY
----------
     12008

Setelah itu, lakukan perubahan pada tabel anda

SQL> update employees set salary = salary*10 where employee_id=108;

1 row updated.

Selanjutnya cek kembali perubahan dan simpan perubahannya

SQL> select salary from employees where employee_id=108;

    SALARY
----------
    120080

SQL> commit;

Commit complete.

Lalu, gunakan command flashback yang ada dibawah ini dan anda akan mengalami error seperti ini

SQL> FLASHBACK TABLE employees TO RESTORE POINT good_data;
FLASHBACK TABLE employees TO RESTORE POINT good_data
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

Oleh karena itu, solusinya mengenable kan row movement


SQL> ALTER TABLE employees ENABLE ROW MOVEMENT;

Table altered.

SQL> FLASHBACK TABLE employees TO RESTORE POINT good_data;

Flashback complete.

Lalu, cek kembali hasilnya

SQL>  select salary from employees where employee_id=108;

    SALARY
----------
     12008

2. Flashback dari drop table

Pertama, buatlah sebuah table terlebih dahulu

SQL> CREATE TABLE EMPLOYEE_DEMO(
  2  employee_id number (10) not null,
  3  employee_name varchar2(50) not null);

Table created.

Selanjutnya, buatlah restore point terlebih dahulu

SQL> CREATE RESTORE POINT good_data2;

Restore point created.

Dan lakukan drop table

SQL> DROP TABLE employee_demo;

Table dropped.

Lalu lakukan pengecekan hasil buangan dengan show recylebin

SQL> SHOW RECYCLEBIN;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMPLOYEE_DEMO    BIN$XhHTmdxBE9XgU7coCgrA3A==$0 TABLE        2017-11-16:10:00:46
SQL> SELECT object_name AS recyle_name, original_name, type
  2  FROM recyclebin;

Setelah itu, gunakan flashback command kembali

SQL> FLASHBACK TABLE HR.EMPLOYEE_DEMO TO BEFORE DROP;

Flashback complete.

Dan selesai, anda dapat melihat bahwa recycle bin menjadi kosong kembali dan table anda sudah ada.

Untuk multiple table, anda juga dapat melakukan flashack secara bertahap dan mengganti nama tablenya. Semisal

CREATE TABLE temp_employees ( ...columns ); # temp_employees version 1
DROP TABLE temp_employees;

CREATE TABLE temp_employees ( ...columns ); # temp_employees version 2
DROP TABLE temp_employees;

CREATE TABLE temp_employees ( ...columns ); # temp_employees version 3
DROP TABLE temp_employees;

Selanjutnya anda dapat melakukan pengecekan di recycle bin

SQL> SHOW RECYCLEBIN;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMPLOYEE_DEMO    BIN$XhHTmdxKE9XgU7coCgrA3A==$0 TABLE        2017-11-16:10:20:54
EMPLOYEE_DEMO    BIN$XhHTmdxHE9XgU7coCgrA3A==$0 TABLE        2017-11-16:10:19:22
EMPLOYEE_DEMO    BIN$XhHTmdxEE9XgU7coCgrA3A==$0 TABLE        2017-11-16:10:19:01

Lalu lakukan flashback dengan mengganti namanya
SQL> FLASHBACK TABLE employee_demo TO BEFORE DROP
  2  RENAME TO employee_demo_ver3;

Flashback complete.

SQL> FLASHBACK TABLE employee_demo TO BEFORE DROP
  2  RENAME TO employee_demo_ver2;

Flashback complete.

SQL> FLASHBACK TABLE employee_demo TO BEFORE DROP
  2  RENAME TO employee_demo_ver1;

Flashback complete.


Performing a Flashback Database Operation

Dimana kita melakukan flashback di suatu titik agar database kembali seperti semula. Dimana titik yang sebagai incarnasi tersebut kita sebut sebagai SCN.
Pertama, kita melihat scn yang sedang aktif

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    2963467
Selanjutnya buatlah scn baru dengan enable flashback database. Caranya adalah


Pertama, ubah database ke mode mount dan jangan buka database dahulu
RMAN> shutdown immediate

database closed
database dismounted
Oracle instance shut down

RMAN> startup mount;

connected to target database (not started)
Oracle instance started
database mounted

Total System Global Area     784334848 bytes

Fixed Size                     2929304 bytes
Variable Size                545262952 bytes
Database Buffers             230686720 bytes
Redo Buffers                   5455872 bytes

Selanjutnya, silahkan set berapa jangka waktu melakukan penyimpanan

ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=4320; # 3 days

Lalu ubah database flashback menjadi ON

ALTER DATABASE FLASHBACK ON;

Selanjutnya masuk ke dalam sql plus dan buatlah restore point seperti berikut

SQL> create restore point before_upgrade guarantee flashback database;

Restore point created.

Dengan begitu selesai.


Setelah membuat enable flashback dan membuat restore point baru, sekarang lanjutkan dengan mengecek konfigurasi scn


SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME
  2  FROM   V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FL
-------------------- ---------
             2970148 16-NOV-17

SQL> SELECT CURRENT_SCN
  2  FROM   V$DATABASE;

CURRENT_SCN
-----------
    2971876

SQL> SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
  2  GUARANTEE_FLASHBACK_DATABASE
  3  FROM   V$RESTORE_POINT
  4  WHERE  GUARANTEE_FLASHBACK_DATABASE='YES';

NAME
--------------------------------------------------------------------------------
       SCN
----------
TIME
---------------------------------------------------------------------------
DATABASE_INCARNATION# GUA
--------------------- ---
BEFORE_UPGRADE
   2971821
16-NOV-17 11.00.24.000000000 AM
                    2 YES

Selanjutnya masukklah ke rman dan masuklah ke  mode mount dan lakukan flashback terhadap restore point yang kita buat sebelumnya

RMAN>  flashback database to restore point before_upgrade;

Starting flashback at 16-NOV-17
using channel ORA_DISK_1


starting media recovery
media recovery complete, elapsed time: 00:00:01

Finished flashback at 16-NOV-17
Berikut ini linknya : docs.oracle

Anda juga dapat mendapatkan hasil yang sama dengan menggunakan rman, seperti dibawah ini
Pertama pulihkan database

RMAN> recover database;

Starting recover at 16-NOV-17
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=22 device type=DISK

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 16-NOV-17

Selanjutnya, gunakan flashback ke scn
RMAN> flashback database to scn 2971876;

Starting flashback at 16-NOV-17
using channel ORA_DISK_1


starting media recovery
media recovery complete, elapsed time: 00:00:01

Finished flashback at 16-NOV-17

--------------- Selesai ---------------