SQL Server

SQL Server Veri Tabanı Yöneticileri İçin Tavsiyeler

Veri tabanında bazı komutlar vardır ki her veri tabanı yöneticisi için yeri geldiğinde hayat kurtarabiliyor. Bu makalemizde bu komutlardan bazılarını beraber görmeye çalışacağız. Sözü çok uzatmadan Sistem Bilgileri başlığı ile başlayalım.

Sistem Bilgileri

Aktif Çalışan SQL Server Versiyonu Bulma

SELECT @@VERSION
xp_msver

Sunucu Özelliklerini Bulma

SELECT	SERVERPROPERTY('productversion') AS 'Product Version'
		,SERVERPROPERTY ('productlevel') AS 'Service Pack'
		,SERVERPROPERTY ('edition') AS 'Edition'
		,@@SERVERNAME As [@@SERVERNAME]
		,CAST(SERVERPROPERTY('MACHINENAME') AS VARCHAR(128)) + COALESCE('' +
CAST(SERVERPROPERTY('INSTANCENAME') AS VARCHAR(128)), '') As 'Instance Name'

SQL Server’ın Üzerinde Çalıştığı Port Bilgisini Bulma

SQL Server varsayılan olarak 1433 portunu kullanıyor olsa da dba tarafından bu port değiştirilebiliyor. Aynı şekilde sunucuda birden fazla SQL Instance yüklü ise ikinci yüklenen instance için farklı bir port ayarlaması yapılır.

sp_readerrorlog 0, 1, N'Server is listening on'

SQL Server Agent Servisinin Üzerinde Çalıştığı Hesabı Bulma

Agent servisi SQL Server’da otomatikleştirilmiş işlemleri yürüten servistir ve çalışırken üzerinde çalıştığı hesabın yetkilerini kullanır. Bu sebeple özellikle dosya okuma, yazma işlemi yapan görevlerin hatasız çalışması için bu hesaba ait yetkilerin iyi ayarlanması gerekmektedir. Aşağıdaki kodlar yardımı ile bu bilgiye kolaylıkla ulaşabiliriz.

  • SQL 2005 ve 2008 İçin
DECLARE @ServiceAccount NVARCHAR(128);
EXEC master.dbo.xp_regread
    'HKEY_LOCAL_MACHINE',
    'SYSTEM\CurrentControlSet\services\SQLSERVERAGENT',
    'ObjectName', 
    @ServiceAccount OUTPUT;
SELECT @ServiceAccount;
  • SQL 2012 ve Sonrası İçin
SELECT 
	servicename AS 'Service Name'
	,service_account
	,startup_type_desc AS 'Startup Type'
	,status_desc as 'Status'
	,last_startup_time as 'Last Startup Time'
FROM sys.dm_server_services;

2012 ve sonrası versiyonlarda ilgili sorgu çalıştırıldığında Agent servisinin yanında SQL ile ilgili bütün servislerin bilgileri gelmektedir.

Sisteme Tanımlı Bütün DMV’leri Görme

DMV’ler (Dynamic Management Views) sisteme dair bilgileri almak da son derece yararlı yapılardır.

SELECT * FROM sys.all_objects 
WHERE [name] LIKE '%DM_%' AND [type] IN ('V', 'TF', 'IF')
	AND [schema_id] = 4;  --The sys schema has schema_id =4;

Donanım Bilgisi Öğrenme

İşlemci Sayısını Bulma

  • SQL Server 2005 / 2008 İçin
SELECT cpu_count AS 'Logical CPUs'
	,hyperthread_ratio AS 'Hyperthread Ratio'
	,cpu_count/hyperthread_ratio AS '# of Physical CPU'
	,physical_memory_in_bytes/1048576 AS 'Physical Memory (MB)'
	--SQL 2008 also has sqlserver_start_time field shown below
 FROM sys.dm_os_sys_info;
  • SQL Server 2012 ve Sonrası İçin
SELECT cpu_count AS 'Logical CPUs'
	,hyperthread_ratio AS 'Hyperthread Ratio'
	,cpu_count/hyperthread_ratio AS '# of Physical CPU'
	,physical_memory_kb/1024 AS 'Physical Memory (MB)'
	,sqlserver_start_time AS 'SQL Server Start Time'  
FROM sys.dm_os_sys_info;

RAM Bilgisi Alma

SELECT * FROM sys.dm_os_sys_memory;

Boş Disk Alanı Bulma

Aşağıdaki stored procedure ile sunucu üzerinde bulunan hard disklerde ki boş alan bilgisini MB cinsinden verir.

EXEC master..xp_fixeddrives;

Veri Tabanı Bilgileri

Veri Tabanı Compatibility Level Öğrenme

SELECT name, compatibility_level 
	,version_name = 
	CASE compatibility_level
		WHEN 65  THEN 'SQL Server 6.5'
		WHEN 70  THEN 'SQL Server 7.0'
		WHEN 80  THEN 'SQL Server 2000'
		WHEN 90  THEN 'SQL Server 2005'
		WHEN 100 THEN 'SQL Server 2008/R2'
		WHEN 110 THEN 'SQL Server 2012'
		WHEN 120 THEN 'SQL Server 2014'
		WHEN 130 THEN 'SQL Server 2016'
		WHEN 140 THEN 'SQL Server 2017'
		WHEN 150 THEN 'SQL Server 2019'
	END
FROM sys.databases

Compatibility Level Değiştirme

USE [master]
GO
ALTER DATABASE VeriTabani_Ad SET COMPATIBILITY_LEVEL = XXX;

Veri Tabanlarını dbid ve Dosyaları ile Göstermek

SELECT name AS 'Database',dbid,crdate AS 'Create Date',filename as 'Data Filename' 
FROM sys.sysdatabases;

Veri Tabanı Adından db_id Değerini Bulma

SELECT db_id('veriTabani_ad') AS 'Database ID';

Veri Tabanı Sahiplerini Bulma

SELECT	name AS 'Database', suser_sname(owner_sid) AS 'Database Owner'
FROM sys.databases;

Veri Tabanı Dosya Bilgilerini Alma

SELECT
    DB.name AS 'Database',
    MF.Name AS 'Logical File Name',
    MF.physical_name AS 'Physical File',
    MF.state_desc AS 'Status',
    CAST((MF.size*8)/1024 AS VARCHAR(26)) + ' MB' AS 'File Size (MB)',
    CAST(MF.size*8 AS VARCHAR(32)) + ' Bytes' as 'File Size (Bytes)'
FROM 
    sys.master_files MF
    INNER JOIN sys.databases DB ON DB.database_id = MF.database_id
ORDER BY
    DB.name;

Kullanıcı Stored Procedurleri ve Fonksiyonları Bul

EXECUTE [dbo].[sp_stored_procedures] @sp_owner ='dbo';

Stored Procedure ve Fonksiyon Bilgilerini Alma

-- sp bilgileri
SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' ;
--fonksiyon bilgileri
SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'FUNCTION' and ROUTINE_SCHEMA = N'dbo' ;

Tablo Listesini Alma

SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME;

Veri Tabanı Boş Alanı Bulma

EXEC sp_spaceused;

Transaction Log Dosyalarının Boyutu Gösterme

DBCC SQLPERF(LOGSPACE);

Yedekleme Stratejisi

Yedekleme stratejileri sistemde bir hata oluşması durumunda ne kadar geriden gelinerek sistemi tekrar hayata döndüreceğimizi belirleyen karardır.

Veri Tabanlarının Yedekleme Modellerini Görme

SELECT name AS [Database Name],recovery_model_desc AS [Recovery Model]
FROM sys.databases;
GO

Full Backup Alma Ve Yedekleme Dosyasını Doğrulama

Aşağıdaki kod ile veri tabanının full yedeği alınabilir. Yedeklemenin başarılı olabilmesi için SQL Server servisinin üzerinde çalıştığı kullanıcının yedekleme hedefi klasör üzerinde yazma yetkisine sahip olması gerekmektedir.

BACKUP DATABASE Veri_Tabani
TO DISK= 'e:\\MSSQL\Backup\MYDATABASE_backup_20130919.bak'
WITH STATS = 10;

Alınan yedek dosyasının da tekrar kullanımda hata almaması adına yedeklemeden sonra aşağıdaki kodla doğrulaması yapılmalıdır.

RESTORE VERIFYONLY FROM DISK= 'e:\\MSSQL\Backup\MYDATABASE_backup_20130919.bak';

Yedekleme dosyası aynı olduğunda bir önceki yedekleme dosyasına yeni bir dönme noktası ekleyerek dosyaya ekleme yapar. Bunun yerine aşağıdaki kod ile her yedek alındığında yedek dosyasının adı, yedek alınan tarih ve saate göre verilebilir.

DECLARE @fileName varchar(50)
SELECT @fileName= 'e:\db_FULL_' + REPLACE(REPLACE(REPLACE((CONVERT(nvarchar,GETDATE(),120)),'-',''),' ','_'),':','') + '.bak'
BACKUP DATABASE movies TO DISK=@fileName WITH NOFORMAT, NOINIT, SKIP, STATS=10;

Full Recovery Model ve T-Log Yedeklemesi

Veri tabanı log bilgisi “FULL Recovery” modda ayarlandıysa yapılan her işlemin logu kayıtlı kalır ve T-LOG yedeklemesi alınmadığı sürece ilgili log dosyası büyümeye devam eder. Bu büyümenin önüne geçmek için sistemin yoğunluğuna göre uygun zaman aralıkları ile log bilgilerinin yedeklenmesi gerekmektedir. Aşağıdaki kod ile T-LOG bilgileri yedeklenerek temizlenebilir.

BACKUP LOG Movies TO 's:\dddddd';

Bu noktada sistem yöneticisinin kontrol altında tutması gereken nokta, hangi veri tabanlarının FULL Recovery modda çalıştığıdır. Aşağıdaki kod ile sistemde FULL Recovery modda çalışan veri tabanları listelenebilir.

SELECT D.[name] AS [database_name], D.[recovery_model_desc] 
FROM sys.databases D LEFT JOIN  
   ( 
   SELECT BS.[database_name],  
       MAX(BS.[backup_finish_date]) AS [last_log_backup_date] 
   FROM msdb.dbo.backupset BS  
   WHERE BS.type = 'L' 
   GROUP BY BS.[database_name] 
   ) BS1 ON D.[name] = BS1.[database_name] 
WHERE D.[recovery_model_desc] <> 'SIMPLE' 
   AND BS1.[last_log_backup_date] IS NULL 
ORDER BY D.[name];

Bu kodları nerede kullanabilirim önerileri:

  • Diskte kalan boş alanı sorgulayan kodu bir göreve bağlayıp kritik seviyenin altına düştüğünde sistem yöneticisi olarak kendimize mail ile bilgilendirme yapabiliriz.
  • Veri tabanı dosya boyutlarını sorgulayan kod ile veri tabanındaki ani büyümeler mail ile haber verilebilir.

İlgili Makaleler

2 Yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu