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ı..

5 Mart 2013 Salı

Database de Kullanılmayan Stored Procedureleri Listelemek

Databaselerimiz plansız yapılan bir çok  stored procedure ile doludur.

Kullanılmayan sp leri bulmak için

SELECT p.*
 FROM sys.procedures AS p
 LEFT JOIN sys.dm_exec_procedure_stats AS s ON s.[object_id] = p.[object_id]
 WHERE s.object_id IS NULL

sorgusunu kullanabilirsiniz.
 

Stored Procedure lerde Kullanımayan Tabloları Bulmak

Günümüz ICT masraflarının en büyük gider kalemlerinden biri IO sıkıntılarını gidermek adına yaptıkları yatırımlardır.
Storage alanında teknolojinin henüz yeterli seviyeye ulaşmaması nedeniyle diskleri ne kadar verimli kullanırsak okadar az maliyet oluşturacağını biliriz.
Planlanmadan oluşturulan yazılım projelerinin oluşturmuş olduğu databaseler üzerinde çalışıyorsanız, içerisinde kaybolmak an meselesidir. kesinlikle kullanılmayan temp tabloların olduğunu bilirsiniz ama kritik bir uygulamaya dokunacağından tedirgin olabilirsiniz.
Bu durumda yapılacak işlerden biride sp lerin içerisinde kullanılmayan tabloları bulmak ve gereçekten ihtiyaç duyulmuyor olduğundan emin olduktan sonra silmektir.

Stored procedure lerde kullanılmamış tabloları aşağıdaki sorugu ile bulabilirsiniz.

select t.name, sys.objects.name foundin, sys.objects.type_desc from sys.objects t
left outer join   sys.sql_modules
inner join sys.objects on sys.objects.object_id = sys.sql_modules.object_id on sys.sql_modules.definition like '%' + t.name + '%'
where t.type = 'U' and sys.objects.name is null
order by t.name, type_desc, foundin

Not:Tablo sayınıza ve sp adedinize göre sorgunun tamamlanması uzayacaktır.