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