2 Mart 2014 Pazar

Sql Server Implicit Transaction Yapısı

Bazı zamanlar delete , drop, update gibi  önemli sorguları çalıştırırken ufak bir dikkatsizlik bize çok büyük zarar verebilir. 
Bunun önüne geçmek aslında bizim elimizde olan bir şeydir.
Çoğu sql server müdavimlerinin şikayeti ORACLE ne güzel bu işlemi hemen geri alabilirdim ama sql serverda bunu yapamıyorum diye yakınıyor. 
Bu gibi yakınmalara mahal vermemek için sevgili developerlara ve sql server geliştiricilerine tam olarak hitap eden TRANSACTION tipi IMPLICIT TRANSACTION dır.
Bu transaction sql server da default olarak OFF durumdadır. Yukarıda ki gibi önemli sorgularımızı çalıştırırken manuel olarak bu transaction'ı ON duruma getirip çalıştırabilirsiniz. 
Bu şekilde yapmış olduğunuz işlemde bir hata var ise tıpkı oracle da olduğu gibi rollback yapabilecek ve yapmış olduğunuz işlemi geri alabileceksiniz. 
Burada dikkat etmemiz gereken diğer sorgulara ve sisteme zarar vermeden bu işi halletmemiz dir. Bunun için bulk işlemlerden özellikle kaçınmalısınız ve olması gerektiği gibi bu işlemleri küme küme yapmalısınız.

Bu transaction tipi Oracle'ın default transaction yapısıdır, sql server auto commiti default olarak kullanmaktadır, yani aslına baktığımızda bu olay sql server'ın bir handikapı değil bir tercihidir. Bizim sistemlerimizde de hangisi tercih edersek edelim aslında aynı özelliği kullanabileceğimiz hatırlatmak istedim.

Peki Nasıl olacak IMPLICIT TRANSACTION 'ı nasıl aktif hal getirebiliriz.

Set implicit_transactions ON     -- bu şekilde sessionımızda transaction tipimizi değişitirmiş oluyoruz artık otomatik olarak sql server sorgumuzu commit etmeyecek bizden komut bekleyecek demektir. 

Yapmış olduğumu sorgunun eğer doğru olduğunu düşünüyorsak sql server bizden bu query'i commit etmemizi bekleyecektir.

Commit komutu ile sorgumuzu işlemiz oluruz. 

Eğer çalıştırdığımız query de bir hata tespit eder ve geri almak istersek 

Rollback dememiz yeterli olacaktır. 

Tüm sorgularınızı çalıştırıp artık oturumunuzu kapatacak ken mutlaka transaction modu OFF yapmayı unutmayın !

Set implicit_transactions OFF

NOT: bu transaction olayı biraz maaliyetlidir, sakın açık unutmayın siz yinede sorgunuzun altına unutmamak için commit ve rollback komutunu yazın hatırlatmaksı açısından işinize yaracaktır. 
BİLDİĞİNİZ GİBİ AÇIK KALAN TRANSACTIONLAR DİĞER SORGULARI VE SİSTEMİ LOCKLAYACAKTIR.!


23 Şubat 2014 Pazar

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.


Bir database'e ait log file'ı kaybettiğiniz de yada, sql server ilginç olarak elinizdeki database log file'ını tanımıyorsa.

Sql servislerini restart ettiğiniz halde log file oluşmamış ve database ulaşılmaz durumda ise aşağıdaki scriptler işinize yarayacaktır.

 
ALTER DATABASE  DB_name  SET EMERGENCY

select name,state,state_desc from sys.databases
where  name='DB_name'


ALTER DATABASE  DB_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE


DBCC CHECKDB('DB_name',REPAIR_ALLOW_DATA_LOSS)

select name,state,state_desc from sys.databases
where  name='DB_name'


ALTER DATABASE DB_name  SET MULTI_USER

18 Kasım 2013 Pazartesi

Sql Server Database Log Fileları Shrinklemek için Garanti Çözüm

Öncelikle plan dışı artan database log file ları hakkında detaylı bir araştırma yapıp ne kadar artıyor ise o büyüklükte bir storage alanı ayarlamanızı tavsiye ederim.

Ama bazı durumlarda olağan dışı aşırı şişen log file ları küçültmek için önce cache'i boşaltırsanız hem shrink işleminiz daha kısa sürer hemde garanti bir şekilde küçültmüş olursunuz.

DBCC FREESYSTEMCACHE(tempdb) 

Komutu ile ilgili database'in cache'ini temizleyip sonrasında database'in log file'ını shrinklemek en garanti yollardan biridir.

8 Kasım 2013 Cuma

Database Üzerine Restore Edilen Tüm Log Backupların LSN'ini ve Restore Tarihini Listelemek

Bir database'in restore işlemlerine ait geçmişe msdb database'i üzerine bulunan   restorehistory  sistem table'ından  sorgulayarak ulaşabilirsiniz.

Bazı durumlarda tüm restore edilmiş log backupların listesini görmek için ise aşağıdaki scripti kullabilirsiniz.

SELECT b.type, b.first_lsn, b.last_lsn, b.checkpoint_lsn, b.database_backup_lsn,  a.restore_date
FROM msdb..restorehistory a
INNER JOIN msdb..backupset b ON a.backup_set_id = b.backup_set_id
WHERE a.destination_database_name = 'Database_Name'
ORDER BY restore_date DESC

SQL Server Database Restore Durumu ve En Son Restore Edilen Log Bakcup'ın LSN'ini Sorgulamak

Özellikle Log Shipping de ki bri database üzerine en son dönülen log backup'ın LSN'ini bulup ona göre ilerlememiz gereken durumlar olabilir.

Bu durumda aşağıdaki scripti kullanabilirsiniz:


SELECT   *  FROM   sys.database_recovery_status
WHERE    database_id = DB_ID('DATABASE_NAME')



Bir Table'ın Hangi Replication da Olduğunu Nasıl Buluruz?

Sql server Replication  da bazen birden çok table ve ya view'i barındırabilirsiniz, hatta bir den fazla replikasyondan birden fazla tabloyu replike edebilirsiniz.
İşte bu gibi durumlarda bu tip replikasyonların yönetilmesi ve bakımı gittikçe zorlaşır.
Bazı durumlarda bir tablonun hangi replikasyon da olduğunu bilmemiz gerekebilir.
Örneğin tablo artık replike edilmeyecekse ve replikasyondan çıkarılmak isteniyorsa önce o tablonun hangi replikasyonda olduğunu bulup ilgili tabloyu çıkarmak gerekir.


Bu gibi durumlar için aşağıdaki scripti kullanabilirsiniz:

EXEC sp_helpSubscription @article ='table_name?'

Ayrıca aşağıdaki script ile de bulunabilir,


SELECT *
FROM sys.tables
WHERE is_replicated = 1 and name ='table_name?'

Bu sorgudan name ='table_name?' kriterini çıkarır isek Replikayondaki tabloların listesini verir.

SELECT *
FROM sys.tables
WHERE is_replicated = 1

Log Shipping de ki Bir Database'e Kullanıcı ve ya Yetki Tanımlamak

1- Log shipping de ki bir database e kullanıcı eklemek için önce pimary database üzerine eklemek istediğimiz user'ı ekleyip log shipping adımlarının tamamlanıp değişikliklerin secondary sunuculara yansımasını bekleyeceğiz.
Not: duruma göre bu adımları manuel olarak da çalışıtırabiliriz.

2- Primary sunucu üzerinde aşağıdaki sorgu çalıştırılarak userın sid'i alınır;
  
   select name, sid from master..syslogins where name in ('username')

3- Bir önceki adımda elde etmiş olduğumuz sid secondary sunucuda sp_addlogin sp sine parametre olarak verilip, user adı ve parola girilerek eklenir.

   sp_addlogin 'tduman', @passwd='******', @sid=0xDB9C34356448E548A4A2A755D9580C1C , @defdb='defaultdatabase'
4- Login olarak ekleyeceğimiz database de ilgili user daha önce var ise loginler den bu user delete edilip yukarıdaki işlem ile eklenir.

Not: Eğer eklemek istediğimi user primary sunucuda, secondary sunucudan daha farklı yetkilere sahip ise bu yetkiler secondary sunucuya yansıyacaktır.
Bu durumu istemiyor iseniz aşağıda ki sp ile, ilgili user'a secondary sunucu üzerindeki databaseler de hangi yetkiler var ise güncelleyebilirsiniz.

USE secondarysunucu_databaseleri
GO
EXEC sp_change_users_login 'update_one', 'username', 'username'
GO





24 Ekim 2013 Perşembe

Sql Server Replication ANSI_PADDING ON hatası Çözümü

Replikasyon da olan table create edilirken ansi_padding özelliğini off olarak configure edildiğinde (genelde numeric tablolar için bu özellik kapatılır) replikasyon monitorden ansi_padding on hatası olduğunu tespit edilir.
Bu hata nedeni ile tablo replike edilmez.
Hatanın çözümü için replikasyon klasörü (unc) içerisinde ilgili replikasyon snapshot'ı bulup (publication_name.sch) üzerinde ANSI_PADDING OFF  yazan kısmı ANSI_PADDING ON şeklinde revize edersek sorun kendiliğinden düzelecek ve tablo subscrible'a replike edilecektir.

7 Ekim 2013 Pazartesi

Kod bloğundaki tüm temp tableları aynı anda drop etmek

Sql server management stduio üzerine çalışırken temp table ları sürekli create edip drop etmek başımızı ağrıtan sıkıntılardan biri dir.

Buna bir çözüm olarak connectionı koparıp tekrar bağlanmak hepimizin kullandığı bir yöntem olsada bunun daha kısa yolu olmasını istediğimiz kesin.

Buna bir başka çözüm olarak da F11 ile scripti debug modda çalıştırmakta işimize yardımcı olur ve bizi tüm create edilmiş temp table lardan kurtarır.

25 Temmuz 2013 Perşembe

Sql Server 2014 CTP1 incelemesi

Sql server 2014 CTP sürümü yayınlandığında indirip inceleme fırsatım oldu. http://www.microsoft.com/en-us/sqlserver/sql-server-2014.aspx adresinden ulaşabilirsiniz.

İlk sıkıntı makinanızda başka hiçbir sql server sürümünün kurulu olmamasını istiyor.

Diğer özellikleri inceledim, özellikle intelligence konusunda visual studioyu yakalamışlar.

Lock olayını henüz çözülmemiş.
1 saatte 60 milyon kayıt insert update delete işlemlerini tek tabloda yaptım engine biraz daha hızlı geldi.(Bu işleri i5 laptop üzerinde yapıyorum)

Activity monitor vs, hala aynı..