Selamlar Arkadaşlar,
Bir backup alanı düşünün ki 5 GB dosya boyutundan daha büyük dosya boyutunu kabul etmiyor.
Bu durumda eğer DB niz in backup ı 5GB geçiyorsa bu backup dosyasını bölmeniz gerekecektir. Bunu aşağıdaki şekilde yapabilirsiniz;
Lakin buradaki sorun dosya isimlerini el ile veriyor olmanız ve bunları tarihe göre arşivleyemiyor olmanızdır.
Bunu çözmek için aşağıdaki SQL scripti size yardımcı olacaktır. Bu script aşağıdaki dizin yapısında günlük çalıştırılarak tarih bazında dizin oluşturup, backup larınızı bu dizinlerde saklamanıza yardımcı olacaktır.
Backup Dizini
|
|_ DB1
| |_YYYYAAGG
| |_YYYYAAGG
|_DB2
|_YYYYAAGG
|_YYYYAAGG
Burada bulunan DB1 ve DB2 dizinlerinin el ile önceden DB adı olarak açılması gerekiyor. YYYYAAGG dizinleri ise script tarafından otomatikman açılacaktır.
Scripti çalıştırdığınızda backup dizini altına gidecek, ilgili DB nin klasörüne girecek, o günün tarihi ile bir dizin oluşturacak ve bu dizinin içerisine YYYYAAGG_1.bak, YYYYAAGG_2.bak şeklinde artan dosyalarla backup ınızı alacaktır.
Not: MSSQL 2008 10.50.4000 versiyonunda test edilmiştir. MSSQL 2012 de çalıştırmak isterseniz 31. satırdaki
SET @result = @result+’, ‘+CHAR(13)+@disk
ifadesini
SET @result = CONCAT(@result,’, ‘,CHAR(13),@disk)
ifadesi ile değiştirmeniz gerekecektir.
DECLARE @delimitedArray VARCHAR(MAX) = ‘DB1;DB2;DB3;DB4;’ –Backup Alınacak DB İsimleri
DECLARE @delimiter CHAR = ‘;’
DECLARE @DataPath nvarchar(500) =”;
DECLARE @Date nvarchar(500)=”;
DECLARE @DirTree TABLE (subdirectory nvarchar(500), depth INT)
DECLARE @i int=”;
DECLARE @Path nvarchar(500)=”;
DECLARE @disk varchar(500)=”;
DECLARE @result varchar(4000)=”;
DECLARE @Path@i nvarchar(500)=”;
DECLARE @sonuc varchar(4000)=”;
DECLARE @DB nvarchar(20)=”;
DECLARE @query varchar(4000)=”;WHILE LEN(@delimitedArray) > 0
BEGIN
SET @DB = LTRIM(SUBSTRING(@delimitedArray, 1, CHARINDEX(@delimiter, @delimitedArray) – 1));
SET @delimitedArray = SUBSTRING(@delimitedArray, CHARINDEX(@delimiter, @delimitedArray) + 1, LEN(@delimitedArray))
SET @Date = CONVERT (nvarchar(8),GETDATE(),112)
SET @DataPath = ‘\\yourserver\backuplocation\’ + @db + ‘\’ + @Date –Backup alınacak Dizin Tanımlaması
INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @DataPath
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DataPath)
EXEC master.dbo.xp_create_subdir @DataPath
DELETE FROM @DirTree
SET @i=1
While @i<11 –Backup ı kaça bölmek istiyorsanız bir fazlasını buraya yazınız. Örnek te backup dosyası 10 bölünecektir.
begin
SET @Path@i =’DISK=N”’ + @DataPath +’\’ + Convert(varchar,@Date)+ ‘_’ +Convert(varchar,@i) + ‘.bak”’
SET @disk = CONVERT (varchar(500),@Path@i)
SET @result = @result+’, ‘+CHAR(13)+@disk
SET @i=@i+1
end
SET @sonuc = CONVERT (nvarchar(4000),SUBSTRING(@RESULT,2,LEN(@result)))
SET @query = ‘BACKUP DATABASE ‘ + @DB + ‘ TO ‘ + @sonuc + ‘ WITH NOFORMAT, COPY_ONLY, NOINIT, NAME = N”’+ @DB +’_backup_’+@Date+”’, SKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 10 ‘
EXECUTE (@query)
SET @sonuc = ”;
SET @query = ”;
SET @result= ”;
SET @Path@i = ”;
END
İyi günler dilerim…