SQL 2012 Hosting Indonesia –Jaringan Hosting.Com :: Cara Membuat Cron Job untuk backup SQL Database

Pada postingan kali ini kami akan membahas mengenai cara membuat Cron Job untuk keperluan backup SQL Database. Cron jobs digunakan sebagai scheduling task untuk tugas tugas yang berjalan di dalam server. Biasanya cron jobs digunakan untuk otomatisasi pemeliharaan system dan administrasi. Akan tetapi cron jobs juga relevan jika digunakan untuk keperluan pengembangan aplikasi web. Ada beberapa situasi ketika aplikasi web membutuhkan berbagai task untuk berkerja secara periodik. Cron job/scheduled task merupakan tugas otomatis dalam system yang bisa di atur untuk menjalankan sebanyak apapun pada jarak tertentu. Cron/scheduled task memungkinkan anda untuk menjadwalkan perintah ataupun script untuk berjalan pada waktu tertentu di suatu hari , ataupun di hari tertentu pada suatu minggu, ataupun pada waktu tertentu dalam hari dan bulan yang lebih spesifik. Cron job juga memungkinkan untuk mengatur lebih rinci sampai ke menit ataupun lebih jauh ke acara tahunan.

SQL Server 2012 Hosting Indonesia - Jaringan Hosting

Berikut ini langkah sederhana bagaimana membangun Cron Job untuk backup SQL Database

  • Step 1 buat folder penyimpanan file backup di dalam FTP application

Buka ftp application dan connect ke account yang databasenya ingin anda back up. Buat folder diluar dari webcontent misalnya “backups”.

  • Step 2 Atur folder permissions dalam FTP Application

Klik kanan folder dan tambahkan semua write permission. Jika ftp software anda tidak mampu melakukan hal ini cobalah gunakan FTP client free seperti FileZilla.

  • Step 3 Buat sebuh prosedur penyimpanan yang melakukan backup dengan nama file sebagai input parameternya

Connect ke database menggunakan client dan jalankan query berikut. Prosedur ini dinamakan FullBackup sebagai contoh

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[FullBackup] @FileName  nvarchar(256)
AS
BEGIN

SET NOCOUNT ON;

BACKUP DATABASE [123456_YourDatabase] TO  DISK = @FileName WITH NOFORMAT, NOINIT,  NAME = N’Full Database Backup’, SKIP, NOREWIND, NOUNLOAD,  STATS = 10

END

  • Step 4 buat halaman web yang mengeksekusi prosedur penyimpanan

Anda dapat menggunakan php ataupun asp.net. untuk yang sederhana seperti ini anda dapat menggunakan classic asp. Pada hal ini tidakl ada file dll yang ditangani dan juga tidak dibutuhkan restart aplikasi. Sekarang buatlah halaman asp baru backupdb.asp. isi dari filenya akan mengikuti, jika telah selesai, upload file ini ke folder di dalam content area.

Script in akan meng-generate filename berdasarkan data yang ada. Jika backup pada hari tersebut sudah ada, maka prosedur tersebut akan manambah hitungan sampai filename terbaru ditemukan.

Script ini akan meng-generatte 1 file tiap eksekusi. modifikasi sesuai kebutuhan jika anda ingin menambah sebuah file. edit lokasi dan connection string agar dapat bekerja.

<%@LANGUAGE=”VBSCRIPT” CODEPAGE=”65001″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Untitled Document</title>
</head>

<body>

<%
dim thismonth, thisday, thisyear, location, filelename, ver, extention, abolutespath

thismonth= datepart(“m”, now())
thisday=datepart(“d”, now())
thisyear=datepart(“yyyy”,now())

location=”fs1-n03stor1wc1dfw8382492382489www.yoursite.combackups”
filename=”dbBackup-” & thismonth & “-” & thisday & “-” & thisyear & “_”
ver=1
extention=”.bak”

absolutepath=location & filename & ver & extention

set fso = Server.CreateObject(“Scripting.FileSystemObject”)

while (fso.FileExists(absolutepath)=True)
ver=ver+1
absolutepath=location & filename & ver & extention
wend

Set cn = Server.CreateObject(“ADODB.Connection”)
cn.connectionString= “Provider=SQLNCLI;Server=mssql05-01.wc1;Database=123456_YourDatabase;Uid=123456_YourUsername; Pwd=Yourpassword;”
cn.open

Set cmd = Server.CreateObject(“ADODB.Command”)
Set cmd.ActiveConnection = cn
cmd.CommandText = “FullBackup”
cmd.CommandType = 4 ‘adCmdStoredProc

cmd.Parameters.Refresh
cmd.Parameters(1) = absolutepath

cmd.Execute

cn.close

%>

Execution complete:  Filename=<%= filename & ver & extention%>

</body>
</html>

  • Step 5. Jadwalkan cron job untuk memanggil halaman web

Akses control panel dan masuk ke tab fitur di dalam situs, dengan database. Pilih http sebagai Bahasa. Masukan url kedalam asp script dan email anda, dan jadwalkan tugas untuk berjalan setiap hari pada off hour.

 

SQL Server 2012 Hosting :: Memindahkan SQL Agent Jobs Across Menggunakan Powershell

6428.SQL12_v_rgb

Migrasi pekerjaan dari satu server ke lainnya dapat dengan mudah dilakukan dengan PowerShell. Mari kita telusuri script dibawah ini.

[System.Reflection.Assembly]::LoadWithPartialName( ‘Microsoft.SqlServer.SMO’) | out-null
[System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.SqlServer.SMOExtended’) | out-null
[System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.SqlServer.SQLWMIManagement’) | out-null
#get the source server object
$ssrv = new-object (‘Microsoft.SqlServer.Management.Smo.Server’) $sourceserver
#get the destination server object
$dsrv = new-object(‘Microsoft.SqlServer.Management.Smo.Server’) $destinationserver

Variabel $sourceserver menentukan contoh sumber server di mana sebagai variabel $destinationserver menentukan server.Tujuan langkah selanjutnya adalah membuat objek scripting ke script SQL Agent jobs.

# get the scripter object and set relevant properties
$scripter = new-object (‘Microsoft.SqlServer.Management.Smo.Scripter’) $ssrv
$scripter.Options.ScriptDrops = $False
$scripter.Options.WithDependencies = $False
$scripter.Options.IncludeHeaders = $True
$scripter.Options.AppendToFile = $True

Setelah itu angkah berikutnya adalah untuk iterate melalui semua job pada server source.

foreach ($job in $ssrv.JobServer.Jobs) {
$jobname = $job.Name
# change the owner to sa in case job owner at source instance
# doesn’t exists at destination server.
if ($job.Owner -ne ‘sa’) {
$job.OwnerLoginName = ‘sa’
}
#script job only if it doesn’t exists at desitnation server.
$djobs=$dsrv.JobServer.Jobs | Where-Object {$_.name -eq $job.name}

Script di atas beriterasi pada semua job dalam server source, menetapkan pemilik job untuk sa jika tidak sa. Hal ini dilakukan untuk menghindari kesalahan dalam kasus pemilik (login) di server source tidak ada di server tujuan. Untuk menyelaraskan. Mungkin kemungkinan bahwa beberapa job hidup berdampingan di kedua source dan tujuan SQL misalnya untuk bermigrasi pada job yang tidak ada saya saring pada list bersamaan dalam objek $djobs. Langkah berikutnya adalah untuk mengcreate dan script keluar job dari script di atas.

if(!$djobs)
{
# specify the script location
$scripter.Options.FileName = “D:\Ahmad\SQLServerGeeks\Blogs\Powershell\jobs.sql”
$sc=$scripter.Script($job)
#execute the job query on destination server.
$dsrv.ConnectionContext.ExecuteNonQuery($sc[0])

Cek script di atas jika objek $djobs kosong dan jika ya, maka ia menetapkan lokasi skrip dan mendapatkan job script ke objek stringcollection $sc. Job script /query kemudian dieksekusi pada server tujuan menggunakan metode ExecuteNonQuery.

 

SQL Server 2008 Hosting :: Parameter Sniffing Resolution

Pada artikel saya kali ini saya akan berbicara tentang cara-cara untuk menyelesaikan Parameter Sniffing pada SQL Server 2008. Metode untuk menyelesaikan masalah Parameter Sniffing tercantum di bawah ini:

  1. Menggunakan local variable dengan prosedur.
  2. Menggunakan recompile option saat create prosedur.
  3. Menggunakan Query OPTIME FOR.

Mari kita telusuri satu per satu.

Menggunakan Local Variable dengan Prosedur.

DROP TABLE fruit
GO
CREATE TABLE fruit (Sno int identity,frtname varchar(20),frttype int)
GO
— Insert dummy data
INSERT INTO fruit Values(‘Apple’,rand()*1000)
GO 10000
INSERT INTO fruit Values(‘Mango’,rand()*1000)
GO 10
CREATE unique clustered index ix_sno on fruit(sno)
GO
CREATE INDEX ix_frtname on fruit(frtname) include(frttype)
GO

Script di atas adalah script yang mengisi TABLE FRUIT dengan nilai-nilai(value).

CREATE Proc usp_fetchfruits
@frtname varchar(20)
AS
BEGIN
SELECT * FROM fruit WHERE frtname=@frtname
END
GO
— procedure with local variables
CREATE Proc usp_fetchfruits_localvar
@frtname varchar(20)
AS
BEGIN
DECLARE @fruitname varchar(20)
SET @fruitname=@frtname
SELECT * FROM fruit WHERE frtname=@fruitname
END
GO

Query di atas mengcreate dua prosedur usp_fetchfruits dan usp_fetchfruits_localvar. Prosedur usp_fetchfruits_localvar menggunakan local variable.. Sekarang Mari kita bandingkan rencana pelaksanaan prosedur di atas.

1Snapshot diatas membandingkan rencana eksekusi dari dua prosedur. Perbedaan jumlah optimizer estimasi dan actual number pada baris kedua karena optimizer tidak tahu nilai parameter sebenarnya harus dilewatkan kemana, sehingga optimizer menciptakan rencana generik berdasarkan statistik yang tersedia. Table fruit memiliki total 10010 baris dan jumlah optimizer estimasi baris adalah 5005 yang persis setengah dari jumlah total.

Metode ini tidak menyelesaikan masalah performa tapi mungkin tidak begitu efektif jika jumlah baris sebenarnya adalah cara yang lebih besar daripada rata-rata baris yang diperkirakan.

Menggunakan Recompile Option saat membuat prosedur.
masalah Parameter Sniffing terjadi karena rencana cache dari eksekusi pertama digunakan dalam future procedure execution(eksekusi prosedur yang akan dating). Jika prosedur ini sedang disusun dan rencana disiapkan lagi untuk setiap eksekusi dari Parameter Sniffing maka akan diselesaikan. Inilah yang disebut dengan Recompile ketika digunakan dalam definisi prosedur. Recompile prosedur ini untuk membuat rencana baru setiap kali prosedur dijalankan.

CREATE Proc usp_fetchfruits_withrecompile
@frtname varchar(20)
WITH RECOMPILE
AS
BEGIN
SELECT * FROM fruit WHERE frtname=@frtname
END

2Snapshot diatas, baik dalam eksekusi rencana optimizer yang estimasi maupun catatan actual number yang sama karena rencana yang telah di recompile untuk setiap nilai parameter bukan rencana cache yang digunakan pada eksekusi kedua.

Masalah dengan metode ini adalah bahwa resource digunakan untuk recompile prosedur setiap kalinya. Rencana ini bahkan merecompile untuk nilai-nilai parameter yang mungkin mendapat manfaat dari rencana cache.

Query OPTIMIZE FOR
Dengan menggunakan query OPTIMIZE FOR kita dapat memiliki sebuah query SQL Server optimize berdasarkan nilai parameter tertentu.

CREATE Proc usp_fetchfruits_optimizefor
@frtname varchar(20)
AS
BEGIN
SELECT * FROM fruit WHERE frtname=@frtname
OPTION (OPTIMIZE FOR (@frtname = ‘Mango’))
END

Pada prosedur di atas, tidak memperdulikan nilai parameter yang mensupply select query yang akan dioptimalkan pada nilai “Mango”.

3Snapshot diatas membandingkan rencana eksekusi untuk nilai parameter “Apple” dan “Mango”. Dalam kedua rencana tersebut nilai-nilai estimasi tetap 10000 yang merupakan jumlah total untuk parameter “Apple”.

SQL Server 2008 memperluas query OPTIMIZE FOR sehingga dapat mengoptimalkan query untuk nilai yang tidak diketahui. Ini agak mirip dengan metode menggunakan variabel lokal.

CREATE Proc usp_fetchfruits_optimizeforunknown
@frtname varchar(20)
AS
BEGIN
SELECT * FROM fruit WHERE frtname=@frtname
OPTION (OPTIMIZE FOR UNKNOWN)
END

Prosedur di atas menggunakan query OPTIMIZE FOR UNKNOWN untuk menyingkirkan masalah parameter sniffing.

4Snapshot diatas membandingkan eksekusi untuk nilai parameter Apple dan Mango. Optimizer memperkirakan jumlah rata-rata baris yang dikembalikan seperti ketika menggunakan variabel lokal.

Cara lain adalah dengan membuat prosedur yang tersimpan ganda dan memanggil mereka didasarkan pada nilai parameter. Misalnya, Dalam hal ini kita dapat membuat 2 prosedur yang berbeda satu untuk parameter nilai mangga dan satu untuk nilai parameter Apple dan memanggil mereka berdasarkan nilai parameter yang disediakan.

Kesimpulan
Pada artikel ini saya berbicara tentang cara-cara untuk meningkatkan kinerja pada saat menghadapi masalah PARAMETER SNIFFING.