Anasayfa | Hakkımda | Kitaplarım | RSS Site içinde
Kategoriler
» SQL Server 2012
» SQL Server 2008
» C#
» MySQL
» Hayata Dair
» Güncel Haber-Duyuru
» Bir Soru Bir Cevap
» Oracle ve Diğer VTYS
» Java

Yanlışlıkla Tablo Silinirse veya Log Dosyası Aşırı Büyüyorsa

02.01.2012 00:00:00
SQL Server kullanırken karşılaşıp e-posta yolu ile gönderilen problemlerden en fazla karşılaştığım iki tanesini, nedenleri ve önlemleri ile paylaşmak istedim. Bunlardan ilki "yanlışlıkla tablo sildim, ne yapmam gerekir?". İkincisi, "SQL Server transaction log dosyam çok büyüdü ne yapmam gerekir?"

1.Yanlışlıkla tablo sildim. (veya Yanlış bir UPDATE cümlesi çalıştırdım.) Nasıl geri alabilirim?

Muhtemel Nedenler: Dalgınlık, Dikkatsizlik, kendine aşırı güven...

Çözüm: Öncelikle veritabanınızda açık transaction olup olmadığına bakın.

SELECT @@TRANCOUNT

İfadesi çalıştırıldığında 0'dan büyük bir sayı geliyorsa, ROLLBACK ifadesini çalıştırarak veri kaybını engelleyebilirsiniz. IMPLICIT TRANSACTION modunda değilseniz, açık Transaction siz açmadı iseniz olmayacaktır.

Açık transaction yok ise, veritabanı yedeklerinizin olup olmadığına bakın. Yedeğiniz yoksa, verilerinizi kaybettiniz demektir. Var ise yedeklerinizden geri dönüş yaparak verilerinizi kurtarabilirsiniz.

Önlem: Tablo silmeyi DDL Trigger'larla engelleyebilirsiniz. Mutlaka bir değişiklik yapmanız gerekiyorsa, oturumunuzu

IMPLICIT_TRANSACTION ON
ifadesini çalıştırarak imalı transaction moduna getirebilirsiniz. Böylelikle siz unutsanız bile SQL Server otomatik bir transaction açtıktan sonra değişiklik ifadelerini çalıştıracaktır. İşinizin hatasız bittiğinden emin olduğunuzda
 COMMIT 
diyerek açılmış Transaction'larınızı sonlandırabilirsiniz veya
 ROLLBACK 
diyerek, hatalı bir şey yaptınızsa en başa dönebilirsiniz. Çok hassas bir veri silme-değiştirme-ayarlama yapacaksanız, öncelikle bir veritabanı yedeğinizin olduğundan emin olmanızda yarar var.

Neleri Bilmem Gerekir: Yedeklemek, Yedekten Dönmek, Yedekleme Modları, Transaction Kavramı


2.SQL Server Transaction Log dosyam çok büyüdü ne yapmam gerekir?

Muhtemel Nedenler: Veritabanı Full Recovery Mode'da çalışmakta ve uzun süredir log yedeği alınmamakta.

Çözüm: Öncelikle, veritabanınız zaman kritik bir veritabanı ise ve yedeklerden herhangi bir geçmiş zaman noktasına dönmeniz gerekiyorsa, Log yedeği almanız tavsiye edilir.

BACKUP LOG dukkan TO DISK='C:\yedekler\dukkan_log.bak'

Ancak, veritabanınız zaman kritik değilse, yedeklerinin herhangi bir anına dönmek gerekmiyorsa

ALTER DATABASE  dukkan SET RECOVERY SIMPLE  
İfadesi ile veritabanını FULL Recovery Mode'dan simple moda'a çekebilirsiniz. Böylelikle artık veritabanı log dosyanız şişmeyecektir.

Ancak bu halde, çok büyük olan log dosyanızı

DBCC SHRINKFILE(dukkanLogFileName,1) 
İle boşaltabilirsiniz.

Daha sonra veritabanınınızın yedeklenmesine karar verirseniz, bir önceki adımda yaptığımız değişikliği

ALTER DATABASE  dukkan SET RECOVERY FULL 
İfadesi ile full veritabanı durumuna çekebiliriz.

DİKKAT: Bir veritabanının bu şekilde FULL mode'dan çıkartılıp, log dosyasının temizlenmesi, bu işlemden önce alınmış log dosyalarına dönüş şansını ortadan kaldırır. Bu nedenle yöntem, kritik veritabanlarında denenmemelidir.

Önlem: Log dosyalarınızın aşırı büyümemesi için, veritabanınızı hassas olmadığı durumlarda SIMPLE recovery modunda çalıştırılması sorunu ortadan kaldıracaktır. Şayet veritabanınız FULL RECOVERY modda çalışmak zorunda ise düzenli log yedeği almanızda yarar var. Logları özellikle şişirecek toplu işlemlerinizde BULK RECOVERY modu ile FULL RECOVERY modu arasında geçişler yapabilirsiniz.

Neleri Bilmem Gerekir: Yedeklemek, Veritabanı Dosyaları, Veritabanı Kurtarma Modları


Konuya müdahil olmak ister misiniz?
Başlık:  
İsim  :  
URL   :
Yorum