Yazar arşivleri: Ömer ACAR

Ömer ACAR hakkında

Trakya Universitesi Bilgisayar Mühendisliği 2006 Maltepe Universitesi 2010 MBA Oracle OCP Oracle DBA&Developer...

SQL Tüm databaseler için Backup-Restore Scripti Oluşturmak

Aşağıdaki scriptle tüm user databaselerini yedek alıp, kopyalacağınız sunucuda istediğiniz dizine restore etmek için script oluşturabilirsiniz. Kaynak sunucuda backup scripti, hedef sunucuda restore scripti çalıştırılmalı, eğer aynı sunucu üzerinde backup restore yapıyorsanız her iki outputda aynı sunucuda çalıştırılır. Prod ortamdan alınan backupları test ortamına restore etmek için işinize yarayabilir. Okumaya devam et

Databaselerin Compatibility level ini değiştirmek

SQL Upgrade sonrası eski compatibility_level ı yeni versiyonun compatible level ına yükseltilir. Aşağıdaki tablodan uyumluluk modlarını görebilirsiniz, upgrade sonrası sp lerin, fonksiyonların vb yeni versiyonda düzgün çalıştığından emin olduktan sonra compatibility_level  ı yeni sürüme yükseltin.

Hangi level ın hangi versiyona denk geldiğini, ve hangi versiyonun hangi düşük versiyonlara kadar destek verdiği aşağıdaki tabloda görebilirsiniz.

ilgili Microsoft Döküman Linki

Okumaya devam et

Mssql AlwaysOn Sistemlerde Job Tanımlamak

Alwayson 2 node lu sistem üzerinde 1 primary replikanız ve 1 secondary(daha fazla da olabilir) replikanız olur, primary replika açık ve yazılabilir durumdadır, eğer bu sistem üzerinde job tanımlamak istersek primary node değişebileceğinden jobı her iki instanceda da oluşturup sql ile primary olup olmadığını kontrol etmeliyiz. Çalıştırmak istediğimiz iş sadece primary de çalışmalı.

Jobı hem primaryde hem de secondaryde oluşturacağız hangi sunucu primary ise orada execute edilecek, secondarylerde sadece job çalışıp bir şey yapmadan tamamlanacaktır, failover yaptığınızda da yeni primary üzerinden çalışmaya devam edecektir. Job ın içeriğine aşağıdaki sql i ekliyoruz, Çalışmasını istediğiniz sqli aşağıdaki begin end arasına tanımlayabilirsiniz.

---- Job içeriğine konulacak içerik...
DECLARE @RoleDesc NVARCHAR(60)

SELECT @RoleDesc = a.role_desc
    FROM sys.dm_hadr_availability_replica_states AS a
    JOIN sys.availability_replicas AS b
        ON b.replica_id = a.replica_id
WHERE b.replica_server_name = @@SERVERNAME

IF @RoleDesc = 'PRIMARY'
BEGIN
    Print 'Aktif Node üzerindesiniz, burası çalışacak.'  ---- Çalışacak işleri bu bloğa yazın..
END
ELSE
    Print 'Pasif node üzerindesiniz içerik çalışmayacak..'

Sp nin son çalışma zamanını bulmak

Bir sp nin en son ne zaman çalıştığını bulmak için aşağıdaki sorgu kullanılabilir. He çalıştığında buradaki tarih güncellenecektir, geçmişe yönelik history tutmaz sadece son çalıştığı zamanı verir.

SELECT o.name, 
ps.last_execution_time 
FROM sys.dm_exec_procedure_stats ps 
INNER JOIN sys.objects o 
ON ps.object_id = o.object_id 
WHERE DB_NAME(ps.database_id) = 'db_adi' 
ORDER BY ps.last_execution_time DESC

SQL Ayın-Haftanın ilk iş gününü bulmak

Ayın ilk iş günü bir çok kontrol noktasında karşımıza çıkar, aşağıdaki fonksiyon ile  ayın ilk iş gününün hangi güne denk geldiğini bularak kontrollerimizde kullanabiliriz. Fonksiyon resmi tatilleri göz önünde bulundurmuyor, resmi tatilleri de dahil etmek istiyorsanız resmi tatil tablosu oluşturup resmi tatilleri bu tabloya girerek fonksiyonda bu tarihleri exclude edebilirsiniz. İhtiyaca göre aynı mantıkla yılın – haftanın ilk iş gününü de bulabilirsiniz.

Ayın İlk iş gününü bulan sql fonksiyon.

---- Ayın ilk iş gününü bulan sql fonksiyon 
CREATE function [dbo].[fnFirstWorkDayOfMonth](@Year int,@Month int)
returns datetime as
begin
declare @FirstDayOfMonth datetime
set @FirstDayOfMonth = convert(datetime, convert(varchar,@Year)+'-'+convert(varchar,@month)+'-01')
IF DATENAME(dw, @FirstDayOfMonth) IN ('Saturday')
set @FirstDayOfMonth = dateadd(day,2,@FirstDayOfMonth)
ELSE IF DATENAME(dw, @FirstDayOfMonth) ='Sunday'
set @FirstDayOfMonth = dateadd(day,1,@FirstDayOfMonth)
ELSE 
set @FirstDayOfMonth = dateadd(day,0,@FirstDayOfMonth)
return @FirstDayOfMonth
end
---- Ayın ilk iş gününü bulan sql fonksiyon

Fonksiyonu aşağıdaki gibi kullanabiliriz;

select [dbo].[fnFirstWorkDayOfMonth](2021,4) as SQL_Ayin_ilk_is_gunu

MSSQL Database Bilgilerini Sorgulamak

Databaselerin online olup olmamaları, ne zaman oluşturulduğu,recovery modelin ne olduğu, db_ownerın kim olduğu vb kritik bilgilere aşağıdaki sorguyla bakabilirsiniz.

select database_id,name,compatibility_level,user_access_desc,suser_sname(owner_sid) ownerrr,
is_read_only,state_desc,recovery_model_desc,collation_name,create_date,is_broker_enabled,
target_recovery_time_in_seconds
from sys.databases 
----where database_id > 4 

Tüm db lerden erişip sorgu çekmek isterseniz.

-- tüm db lerden select çekmek, ayaktamı kontrolü yapmak..
declare @command1 varchar (max)
EXEC sp_MSforeachdb
@command1='use ?; select db_name(),* from sys.database_files;'
print @command1

MSSQL Backup Restore Sorgulama

Aşağıdaki scriptlerle sql databaseleriniz ne zaman backuplanmış, ne zaman restore edilmiş, tüm geçmişe ulaşabilirsiniz. type kolonu  backupın tipini gösteriyor, D full backup, L log backup, I diff backup olduğunu belirtir. Bu sorguları job yaparak backupı alınmayan db leri mailde attırabilirsiniz.

--------Full Backup History -------------------
select top 1000 database_name,user_name,backup_start_date,backup_finish_date,type,* 
from msdb.dbo.backupset where type='D' order by 4 desc


--------Diff Backup History -------------------
select top 1000 database_name,user_name,backup_start_date,backup_finish_date,type,* 
from msdb.dbo.backupset where type='I' order by 4 desc

--------Log Backup History -------------------
select top 1000 database_name,user_name,backup_start_date,backup_finish_date,type,* 
from msdb.dbo.backupset where type='L' order by 4 desc


--------En Son Full Backup Ne Zaman Alinmış------------------
select database_name,max(backup_finish_date) 
from msdb.dbo.backupset 
where type='D' 
group by database_name 
order by 2 desc

--------Database Restore History ------------------
SELECT 
[rs].[destination_database_name], 
[rs].[restore_date], 
[bs].[backup_start_date], 
[bs].[backup_finish_date], 
[bs].[database_name] as [source_database_name], 
[bmf].[physical_device_name] as [backup_file_used_for_restore]
FROM msdb..restorehistory rs
INNER JOIN msdb..backupset bs ON [rs].[backup_set_id] = [bs].[backup_set_id]
INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] 
ORDER BY [rs].[restore_date] DESC


--------------- EN son restore ne zaman yapilmis-------------------------
select ab.name as DBName,
ISNULL(aa.last_restore_date,'19000101') as LastRestoreDate,
ISNULL(aa.GECEN_SURE,-1) as DateDiffFromLastRestore
from ( select *,DATEDIFF(HH,last_restore_date,GETDATE()) as GECEN_SURE from 
(select DB_ID(destination_database_name) as DestDBID,destination_database_name,MAX(restore_date) as last_restore_date
from msdb.dbo.restorehistory
group by destination_database_name) a ) aa
right join sys.databases ab
on aa.DestDBID=ab.database_id order by 3

Tüm SQL Databaselerde object aramak

Bir objenin(tablo,view,sp,fonksiyon vs)  hangi database de olduğunu bulmak için sp_MSforeachdb ile tüm sql databaselerde  arayalım.

sp_MSforeachdb '
USE [?]
select db_name() as dbname,type,crdate,* From ?..sysobjects where name LIKE N''%trigger%'''
-- Type kolonu objenin tipini verir, tablo mu viewmi,sp mi vs?
-- U = Table (user-defined), V = View,P = SQL Stored Procedure, SN = Synonym, F = FOREIGN KEY

Ayrıca sadece seçilen database içinde arama yapmak isterseniz aşağıdaki sorgularda işinize yarayabilir.

----(Sadece seçilen databasede arar)
SELECT sys.objects.name, sys.schemas.name AS schema_name
FROM sys.objects 
INNER JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id

select * from sys.tables
select * from sys.views
select * from sys.procedures