Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Haziran 2017  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
Keywords

SQL Server 2008 R2 Best Practices Analyzer, instance inizi best practice değerlerine göre kontrol edip size önerilerde bulunan bir tooldur. Bugünkü makelemizde bu tool un kullanımını inceliyor olacağız.

Best practise kavramını biraz açalım. Best practise bahsi geçen teknolojik ürün üzerinde kabul görmüş genel konfigurasyonlardır. Örneğin SQL Server ı ele alacak olursak; Database Data ve Log dosyalarını performans amaçlı farklı fiziksel disklerde bulundurmak best practice dir. Ya da TempDB Data file larını core cpu sayısı kadar yapmak gene bir SQL Server Best Practice dir.

Microsoft SQL Server 2005 Best Practise tool unu release ettikten sonra 2008 Best Practice tool u için çok uzun süre bekledi ve ancak 18.06.2010 tarihinde release edebildi. Çok uzun bir süre 2008 ortamlarımızda hala 2005 best practice tool unu kullanmak zorunda kalırken artık şimdi elimizde 2008 best practice tool u var. Ve bu yazımızda bu tool un detaylarına iniyor olacağız.

[more]

Makalemi 4 başlık altında toplayacağım

  • Kurulum
  • MBCA’ya İlk Bakış
  • MBCA ile Network’teki Bir DB Server’a Bağlanma
  • Tarama Sonucu Bulguları

Kurulum


Öncelikle tool u bilgisayarımıza kuralım. Best Practice Analyzer 2008 R2, Microsoft Baseline Configuration Analyzer (MBCA) 2.0 çatısı altında çalışmaktadır. Dolayısıyla ilk olarak bu tool u bilgisayarımıza kuralım. Download için aşağıdaki MSDN linkini kullanabilirsiniz. Bu linkten sisteminiz için uygun olan tool u indirip kurunuz.

http://www.microsoft.com/downloads/details.aspx?FamilyID=1B6E9026-F505-403E-84C3-A5DEA704EC67&amp;displaylang=en&displaylang=en

Eğer kurulumda “Microsoft Baseline Configuration Analyzer 2.0 is not supported on this SKU.” gibi bir hata alıyorsanız işletim sistemi uyumluluğunu kontrol etmenizde fayda var. Çünkü MBCA sadece aşağıdaki OS larda support edilmektedir.

Supported Operating Systems: Windows 7 Enterprise; Windows 7 Professional; Windows 7 Ultimate; Windows Server 2003; Windows Server 2003 R2 (32-Bit x86); Windows Server 2008; Windows Server 2008 R2; Windows Vista Business; Windows Vista Enterprise; Windows Vista Ultimate

MBCA kurulumunu bitirdikten sonra şimdi Best Practice Analyzer 2008 R2 kurulumuna geçebiliriz. Download için aşağıdaki Microsoft linkini kullanabilirsiniz. Bu linkten sisteminiz için uygun olan tool u indirip kurunuz.

http://www.microsoft.com/downloads/details.aspx?FamilyID=0FD439D7-4BFF-4DF7-A52F-9A1BE8725591&amp;displaylang=en&displaylang=en

Gene Supported Operating Systems kısmını kontrol ederek operating sisteminizin desteklenenler listesinde olduğunu teyit etmenizde fayda var.

Supported Operating Systems: Windows 7; Windows Server 2003; Windows Server 2008; Windows Server 2008 R2; Windows Vista

 

MBCA’ya İlk Bakış


MBCA’yı çalıştıralım. Home ekranında SQL Server 2008 R2 BPA’yı seçelim.

1

Enter Parameters ekranında server ve instance bilgilerini dolduralım. İlk örneğimde kendi makinam üzerinde bulunan DB Engine’i analiz edeceğim.

Daha sonra analiz edilmesini istediğimiz service’lerin yanındaki enable seçeneklerini işaretleyelim.

2

Start Scan yazısına tıkladığımızda MBCA seçtiğimiz DB Server’ı analiz etmeye başlayacak ve ekran görüntüsü bu analiz süresi boyunca aşağıdaki gibi olacaktır.

3

Analiz işlemi tamamlandığında aşağıdaki gibi bir sonuç ortaya çıkacaktır.

4

Ekran detayına inersek;

1 – Select Report Type

Collected Data seçeneği seçilirse tarama sonuçlarını ağaç yapısında görebiliriz.

5

Biz bu makalemizde genelde Results seçeneğini kullanacağız.

2 – Noncompliant – All

All seçeneğinde analiz sonucu best practise değerlerimize uygun olan kayıtlarda gösterilir. Noncompliant seçeneğinde gösterilmez.

6

3 – Export Report

Tarama sonucunu XML file olarak export edebilirsiniz.

4 – Filter

Tarama sonucu çıkan ifadelerde belirli bir ifadeyi aratabilirsiniz. Örneğin aşağıdaki örnekte tempdb ifadesi aratılmıştır.

7

5 – Arrange by

Tarama sonucu çıkan bulguları neye göre dizeceğimizi belirler. Severity, önem derecesini göstermektedir. Genelde bu kritere göre dizim yapmakta fayda vardır. İstersek Category’e görede dizme yapabiliriz.

8

6 – Tarama Sonucu

Tarama sonucu çıkan bulguları bu ekranda görebilir, bu bulguların detayına erişerek Etki(Impact) ve Resolution(Çözüm) bilgilerine ulaşabiliriz.

9

MBCA ile Network’teki Bir DB Server’a Bağlanma


MBCA ile Network üzerindeki bir DB Server’a ayar yapmadan bağlanmaya çalışırsak aşağıdaki gibi bir hata mesajı ile karşılaşmamız mümkün.

10

Hata mesajının detayında da görebileceğiniz gibi MBCA yı kullanan kullanıcın remote makinada local admin olması gerekmektedir. Ayrıca remote makinada powershell’in enable edilmesi gerekmektedir.

Bunun için hem local hemde remote makinalarda powershell’de şu komutların çalıştırılıp powershell’in remote kullanıma açılması gerekmektedir.

1. Enable-PSRemoting –f

2. winrm set winrm/config/winrs `@`{MaxShellsPerUser=`"10`"`}

11

Bu ayarlamalar yapıldıktan sonra analiz işlemi problemsiz gerçekleştirilecektir.

12

Tarama Sonucu Bulguları


Makalemin bu bölümünde tarama sonucu çıkan bazı önemli bulguların detayına inip, bu bulgunun neden geldiğine, neye sebep olabileceğine ve nasıl düzeltilebileceğine bakıyor olacağız.

Engine - Database files and backup files exist on the same volume

13

Best practice olarak disklerde bir sıkıntı olma ihtimalinden dolayı data ve log dosyalarının farklı fiziksel disklerde bulundurulması önerilir. Aynı şekilde alınan backup’larında farklı bir fiziksel diskte bulundurulması best practice’dir. Bu error sonucu bize data ve backup dosyalarının aynı diskte olduğunu göstermekte.

Engine – SQL Server tempdb database not configured optimally

14

Best practice olarak tempdb datafile larının core CPU sayısı kadar yapılması önerilir. Yani 4 CPU lu 8 core lu bir sunucuda tempdb datalarını birbirlerine eşit boyutta 8 adet dosya yapmanızı öneririm.

Engine – Authentication Mode

15

Authentication Mode’un Windows Authentication olması best practice’dir. Lakin hemen hemen her firmada SQL Login’ler ile login olunmaya çalışıldığı için bu bulgu üzerinde çok durmayabiliriz.

Engine – Database consistenct check not current

16

Issue kısmında belirtilen DB’ler için hiç DBCC CHECKDB yapıldığını göstermektedir. DBCC CheckDB DB consistency ve integrity’sini kontrol eden bir sistem komutudur. Best practice olarak periyodik olarak bu kontrolün DB’ler üzerinde yapılması önerilir.

Engine – Backups outdated for databases

17

Bu bulguda uzun zamandır backup alınmayan DB’ler hakkında bilgi verilmektedir. Diskte ve DB’de oluşabilecek problemlerden dolayı her daim iyi bir backup policy üzerinde çalışma yapılması gerekmektedir.

Engine – Databases using simple recovery model

18

Point in time recovery ve disaster anında minimum data kaybı ile sıyrılmak için production DB’lerinde full recovery model kullanılması önerilmektedir. Bu bulguda simple recovery model kullanan DB’ler raporlanmaktadır.

 

ÖZET


Best practise bahsi geçen teknolojik ürün üzerinde kabul görmüş genel konfigurasyonlardır. SQL Server 2008 R2 Best Practices Analyzer ile Database Server’larınızı periyodik olarak kontrol edip, best practice’lere uymayan durumları sorgulayabilirsiniz.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Disaster durumlarından geri dönüşlerde yada herhangi bir ihtiyaç duyulduğunda 2 table ı row bazında karşılaştırma ihtiyacı doğabilir. Böyle bir durum SQL Server DBA için oldukça sıkıcı bir durumdur.

SQL Server 2005 ile beraber gelen TableDiff.exe bu ihtiyaca oldukça yeterli çözüm sağlamaktadır.

Temel syntax ı şu şekildedir;

tablediff 
[ -? ] | 
{
        -sourceserver source_server_name[\instance_name]
        -sourcedatabase source_database
        -sourcetable source_table_name 
    [ -sourceschema source_schema_name ]
    [ -sourcepassword source_password ]
    [ -sourceuser source_login ]
    [ -sourcelocked ]
        -destinationserver destination_server_name[\instance_name]
        -destinationdatabase subscription_database 
        -destinationtable destination_table 
    [ -destinationschema destination_schema_name ]
    [ -destinationpassword destination_password ]
    [ -destinationuser destination_login ]
    [ -destinationlocked ]
    [ -b large_object_bytes ] 
    [ -bf number_of_statements ] 
    [ -c ] 
    [ -dt ] 
    [ -et table_name ] 
    [ -f [ file_name ] ] 
    [ -o output_file_name ] 
    [ -q ] 
    [ -rc number_of_retries ] 
    [ -ri retry_interval ] 
    [ -strict ]
    [ -t connection_timeouts ] 
}

Şimdi denemeler yapmak için bazı table lar create edip içlerini dolduralım.

--database create et
CREATE DATABASE DBDiff

--1.table
CREATE TABLE [dbo].[TableDiff1](
	[id] [int] NOT NULL,
	[Ad] [varchar](50) NULL,
	[SoyAd] [varchar](50) NULL,
 CONSTRAINT [PK_TableDiff1] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

--2.table
CREATE TABLE [dbo].[TableDiff2](
	[id] [int] NOT NULL,
	[Ad] [varchar](50) NULL,
	[SoyAd] [varchar](50) NULL,
 CONSTRAINT [PK_TableDiff2] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

--1.table ı doldur
INSERT INTO TableDiff1(id,Ad,Soyad) VALUES (1,'Turgay','Sahtiyan');
INSERT INTO TableDiff1(id,Ad,Soyad) VALUES (3,'Ahmet','Mehmet');
INSERT INTO TableDiff1(id,Ad,Soyad) VALUES (5,'Veli','Deli');
  
--2.table ı doldur
INSERT INTO TableDiff2(id,Ad,Soyad) VALUES (1,'Turgay','Sahtiyan');
INSERT INTO TableDiff2(id,Ad,Soyad) VALUES (3,'Ahmet','Ahmet');
INSERT INTO TableDiff2(id,Ad,Soyad) VALUES (4,'Murtaza','Kirmizi');

Table ların şu anki durumlarına bakacak olursak;

SELECT * from TableDiff1  
SELECT * from TableDiff2

image

Şimdi aşağıdaki verileri doldurarak ilk karşılaştırmamızı yapalım;

  • sourceserver : Kaynak server ın adı. Instance varsa \ şeklinde instance da eklenmelidir
  • sourcedatabase : Kaynak Veritabanı Adı
  • sourcetable : Kaynak Table
  • destinationserver : Hedef server ın adı.
  • Instance varsa kullanılmalı.
  • destinationdatabase : Hedef Veritabanı Adı
  • destinationtable : Hedef Table ın adı.

Karşılaştırmalar her zaman kaynak bilgiler baz alınarak yapılır. Hedef table kaynak table a benzetilmeye çalışılır.

İlk karşılaştırmamız için aşağıdaki kod bloğunu command prompt ta çalıştıralım.

"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 –destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDiff2

Sonuç:

Microsoft (R) SQL Server Replication Diff Tool
Copyright (c) 2008 Microsoft Corporation

User-specified agent parameter values:
-sourceserver SAHTIYAN_T\SQL10ENT
-sourcedatabase DBDiff
-sourcetable tablediff1
-destinationserver SAHTIYAN_T\SQL10ENT
-destinationdatabase DBDiff
-destinationtable TableDiff2

Table [DBDiff].[dbo].[tablediff1] on SAHTIYAN_T\SQL10ENT and Table [DBDiff].[dbo].[TableDiff2] on SAHTIYAN_T\SQL10ENT have 3 differences.
Err id
Mismatch 3
Dest. Only 4
Src. Only 5
The requested operation took 0,109375 seconds.

3 kayıdın tutmadığı bilgisini aldık ama bunların hangi kayıtlar olduğu hakkında bir fikrimiz yok.

Bu bilgiyide almak için –et parametresini kullanıyoruz. –et parametresi ile ismini verdiğimiz table ı create edip farklı olan kayıtları bu table ın içine atıyoruz. Eğer olan bir table ı kullanıyorsak –et yerine –dt kullanmamız gerekmekte yoksa table olduğu için ve tekrar create etmeye çalışacağı için hata verecektir.

Z:\>"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 -destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDif f2 -et DifferenceTbl

Bu işlem sonucunda DifferenceTbl dolmuş olacaktır.

select * from DifferenceTbl

image

Gelen bu sonuca baktığımızda gene pek anlaşılır bir sonuç olmadığını görüyoruz.Hangi kayıtların tutmadığını bilgisi var ama tutmayan bilgiler nedir bunu göremiyoruz.

Şimdi kullanacağımız bir diğer parametre olan –f parametresi ise bize oldukça detay bilgi verecektir. Bu parametre vasıtasıyla hedef table ı kaynak table a benzetmek için uygulanması gereken sql komutlarını bir dosyanın içinde toplayabiliyoruz.

Z:\>"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver
SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 -destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDiff2 -et DifferenceTbl -f c:\TableDiff.sql

c:\TableDiff.sql dosyasına bakacak olursak;

-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
UPDATE [dbo].[TableDiff2] SET [SoyAd]=N'Mehmet' WHERE [id] = 3
DELETE FROM [dbo].[TableDiff2] WHERE [id] = 4
INSERT INTO [dbo].[TableDiff2] ([Ad],[id],[SoyAd]) VALUES (N'Veli',5,N'Deli')

 

Son olarak –bf parametresine bakalım. Bu parametre ile de sql komutlarına yerleştirdiğimiz dosyanın alabileceği maksimum satır sayısını belirleyebiliyoruz. Mesela bu örnek için bu parametreyi 1 olarak kullanırsak;

Z:\>"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe" –sourceserver
SAHTIYAN_T\SQL10ENT -sourcedatabase DBDiff -sourcetable tablediff1 -destinationserver SAHTIYAN_T\SQL10ENT -destinationdatabase DBDiff -destinationtable TableDiff2 -et DifferenceTbl -f c:\TableDiff.sql -bf 1

3 tane dosya oluşacak ve her dosyanın içinde 1 satır sql komutu bulunacaktır.

TableDiff.0.sql

-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
UPDATE [dbo].[TableDiff2] SET [SoyAd]=N'Mehmet' WHERE [id] = 3

 

TableDiff.1.sql

-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
DELETE FROM [dbo].[TableDiff2] WHERE [id] = 4

 

TableDiff.2.sql

-- Host: SAHTIYAN_T\SQL10ENT
-- Database: [DBDiff]
-- Table: [dbo].[TableDiff2]
INSERT INTO [dbo].[TableDiff2] ([Ad],[id],[SoyAd]) VALUES (N'Veli',5,N'Deli')

 

TableDiff.exe nin kullanımı bu şekilde. Umarım açıklayıcı bir yazı olmuştur.

Kolay gelsin

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan