Wednesday, November 5, 2008

Testing Development Using Database Snapshot

Sekitar bulan maret-april 2008 kemaren waktu gw masih kerja di JATIS, gw ada tugas penting untuk project UGETS di UFINANCE. waktu itu ada permintaan untuk melakukan tuning aplikasi pada End Of Day Batch, karena dirasa End Of Day-nya berjalan sangat lambat. Berhubung gw diproject itu sebagai Database Specialist dan juga End Of Day Developer, udah pasti tugas itu kena pada gw... hehehe (tapi ada team dibelakang layar yang bantuin - Thank's to Arief and "Suhu" Welly for your help-.

Waktu udah berjalan, dan tuning query untuk End Of Day Batch sudah dilakukan, tibalah saatnya untuk melakukan SIT (System Integration Testing). Untuk lebih memastikan query yang dituning tersebut sesuai dengan data yang sebenarnya, maka gw putusin untuk menggunakan data yang sebenernya. Waktu itu database UGETS sebesar 90GBan... tapi permasalahannya adalah waktu restorenya... butuh 3 sampe 4 jam. Waaaaaakkks, lama banget, udah gitu kalo salah musti direstore ulang 3 sampe 4 jam.. bisa-bisa seharian ngak ada hasilnya. Masalah yang kedua adalah Spacenya terlalu kecil, jika mo restore, maka DB yang akan diresotre harus ditaro di servernya, kemudian baru direstore. But i only got 160GB.... ngak cukup banget....

Think and read, akhirnya gw dapet ilmu canggih dari MSDN.. hihihi... gw sih ngak tau itu biasa bagi orang lain atau malah bisa dibilang cupu, tapi bagi gw, gw udah bisa "bernapas" lagi saat itu. apakah ilmu canggih itu... yap.. it's a database snapshot. Apa sih sebenernya database snapshot itu ? Database snapshot merupakan fitur baru yang ada pada SQL Server 2005, dimana database yang dicreate yang hanya bisa untuk dibaca. tidak bisa diinsert maupun diupdate. Saat pertama kali database snapshot dibuat, filegroupnya tidak akan ada datanya karena datanya masih disimpen pada Source DB. selama data tidak berubah maka jika kita membaca database snapshot maka SQL Server akan tetap membaca pada Source DBnya. Kemudian jika kita melakukan update data, maka SQL Server akan mengirimkan file ke filegroup Database Snapshot berupa data sebelum diubah. Ini dinamakan dengan Sparse file. Jika kita kemudian melakukan query ke database snapshot yang datanya telah diupdate, maka SQL Server akan membaca dari database snapshot pada sparse file tersebut.

Kemudian gw nyoba untuk mengimplementasikan database snapshot tersebut.

Here's the Script for creating database snapshot:
USE [master]
GO

CREATE DATABASE [UGETS_TEST_SNAPSHOT_2] ON
( NAME = N'SYSTEM_DATA_01',

FILENAME = N'F:\Snapshot\SYSTEM_DATA_011.ss' ),
( NAME = N'SYSTEM_DATA_02',

FILENAME = N'F:\Snapshot\SYSTEM_DATA_021.ss' ),
( NAME = N'SYSTEM_DATA_03',

FILENAME = N'F:\Snapshot\SYSTEM_DATA_031.ss' ),
( NAME = N'SYSTEM_DATA_04',

FILENAME = N'F:\Snapshot\SYSTEM_DATA_041.ss' ),
( NAME = N'R05G01_01',

FILENAME = N'F:\Snapshot\R05G01_011.ss' ),
( NAME = N'R05G01_02',

FILENAME = N'F:\Snapshot\R05G01_021.ss' ),
( NAME = N'R05G01_03',

FILENAME = N'F:\Snapshot\R05G01_031.ss' ),
( NAME = N'R05G01_04',

FILENAME = N'F:\Snapshot\R05G01_041.ss' ),
( NAME = N'R05G01idx_01',

FILENAME = N'F:\Snapshot\R05G01idx_011.ss' ),
( NAME = N'R05G01idx_02',

FILENAME = N'F:\Snapshot\R05G01idx_021.ss' ),
( NAME = N'R05G02_01',

FILENAME = N'F:\Snapshot\R05G02_011.ss' ),
( NAME = N'R05G02_02',

FILENAME = N'F:\Snapshot\R05G02_021.ss' ),
( NAME = N'R05G02_03',

FILENAME = N'F:\Snapshot\R05G02_031.ss' ),
( NAME = N'R05G02_04',

FILENAME = N'F:\Snapshot\R05G02_041.ss' ),
( NAME = N'R05G02idx_01',

FILENAME = N'F:\Snapshot\R05G02idx_011.ss' ),
( NAME = N'R05G02idx_02',

FILENAME = N'F:\Snapshot\R05G02idx_021.ss' ),
( NAME = N'R10G01_01',

FILENAME = N'F:\Snapshot\R10G01_011.ss' ),
( NAME = N'R10G01_02',

FILENAME = N'F:\Snapshot\R10G01_021.ss' ),
( NAME = N'R10G01_03',

FILENAME = N'F:\Snapshot\R10G01_031.ss' ),
( NAME = N'R10G01_04',

FILENAME = N'F:\Snapshot\R10G01_041.ss' ),
( NAME = N'R10G01idx_01',

FILENAME = N'F:\Snapshot\R10G01idx_011.ss' ),
( NAME = N'R10G01idx_02',

FILENAME = N'F:\Snapshot\R10G01idx_021.ss' ),
( NAME = N'R10G01idx_03',

FILENAME = N'F:\Snapshot\R10G01idx_031.ss' ),
( NAME = N'R10G01idx_04',

FILENAME = N'F:\Snapshot\R10G01idx_041.ss' )
AS SNAPSHOT OF [UGETS_TEST]

Berapa banyak filegroup yang harus kita buat ? mudah saja, kita membuat filegroup tersebut sebanyak filegroup pada Source DB. Hanya saja kita tidak perlu untuk membuat filegroup log pada database snapshot. Dan hasilnya, gw hanya perlu melakukan restore 7-10 menit doang ... hehehe... bagaimana cara melakukan restorenya ? Pada database snapshot, kita bisa melakukan restore database dengan menggunakan revert.

Berikut adalah syntaxnya :

RESTORE DATABASE UGETS_TEST FROM
DATABASE_SNAPSHOT = 'UGETS_TEST_SNAPSHOT_2'


Database snapshot mungkin bisa sangat berguna untuk database development, karena kita bisa mengganti-ganti environtment tanpa harus melakukan restore database terlebih dahulu. tetapi untuk production, mungkin harus sedikit berhati2 dalam pemakaian, karena akan mengurangi performance dari database. karena database snapshot akan dibuat pada server yang sama, artinya akan mengurangi I/O pada Server. Apa lagi jika banyak user yang mengaksesnya.

No comments: