Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Кто как делает бэкапы? Удаление старых резервных копий. xp_delete_file? xp_cmdshell?  [new]
b00ring
Member

Откуда:
Сообщений: 59
Делаю бэкапы таким скриптом:

declare 	
	@path			varchar(max),
	@dateSuff		varchar(6),
	@dbName			varchar(50),
	@desc			varchar(100)

declare	db_cur CURSOR for
	select name
	from sys.databases
	where is_read_only = 0
		and database_id > 6
		and name not like '%test%'
	order by name
	
open db_cur

FETCH NEXT FROM db_cur 
INTO @dbName

WHILE @@FETCH_STATUS = 0
BEGIN
		
	set @dateSuff = convert(varchar(6), GETDATE(), 12)
	set @path = '\\backup\sql\servername\' + @dbName + '\' + @dbName + '_' + @dateSuff + '.bak'
	set @desc = @dbName + ' - Full Backup at ' + @dateSuff + '-' + replace(convert(varchar(8), GETDATE(), 108), ':', '')
			
	BACKUP DATABASE @dbName
			TO DISK = @path 		
			WITH NAME = @desc, 	
			COMPRESSION
	
	FETCH NEXT FROM db_cur 
	INTO @dbName
END

CLOSE db_cur;
DEALLOCATE db_cur;


Потом аналогичный скрипт делает бэкап журнала транзакций несколько раз в день в тот же файл. В итоге имеем файл с бэкапом и возможностью восстановиться на любой момент времени этого дня.
Все бэкапится замечательно, но надо решить задачу удаления старых бэкапов по такой схеме:
храним последние бэкапы за неделю, плюс 2-х недельная полная копия, плюс месячная.

Как удалять старые бэкапы?
Пробовал через cmd, работает, но с перебоями - не поддерживает пути UNC.
Остается PowerShell или WSH.

Кто как автоматизирует этот этап?
24 дек 13, 10:32    [15337764]     Ответить | Цитировать Сообщить модератору
 Re: Кто как делает бэкапы? Удаление старых резервных копий. xp_delete_file? xp_cmdshell?  [new]
komrad
Member

Откуда:
Сообщений: 5703
b00ring
Все бэкапится замечательно, но надо решить задачу удаления старых бэкапов по такой схеме:
храним последние бэкапы за неделю, плюс 2-х недельная полная копия, плюс месячная.

Как удалять старые бэкапы?

Кто как автоматизирует этот этап?


используй для именования ежедневных название дня недели и опцию команды бекап "init" - так решишь проблему ротации ежедневных
то же самое для месяцев datename(weekday,getdate())
ну и для 2-х недельных тоже, но нужно проверять на четность недели - datepart(ww,getdate())

так проще всего организовать ротацию
24 дек 13, 11:05    [15337997]     Ответить | Цитировать Сообщить модератору
 Re: Кто как делает бэкапы? Удаление старых резервных копий. xp_delete_file? xp_cmdshell?  [new]
b00ring
Member

Откуда:
Сообщений: 59
komrad
используй для именования ежедневных название дня недели и опцию команды бекап "init" - так решишь проблему ротации ежедневных
то же самое для месяцев datename(weekday,getdate())
ну и для 2-х недельных тоже, но нужно проверять на четность недели - datepart(ww,getdate())

так проще всего организовать ротацию


То есть имена файлов в недельном бэкапе всегда одинаковые?
Опция INIT я так понимаю их перезаписывает.

А ежечасный бэкап логов транзаций делать без INIT?
24 дек 13, 13:23    [15339285]     Ответить | Цитировать Сообщить модератору
 Re: Кто как делает бэкапы? Удаление старых резервных копий. xp_delete_file? xp_cmdshell?  [new]
komrad
Member

Откуда:
Сообщений: 5703
b00ring
То есть имена файлов в недельном бэкапе всегда одинаковые?
Опция INIT я так понимаю их перезаписывает.

имена файлов надо составлять из названия БД + день недели
т.е. будет примерно так: master_fullbackup_Monday.dmp, msdb_fullbacku_Friday.dmp и т.п.
Да, с этой опцией бекапы (файлы) будут перезаписываться раз в неделю


b00ring
А ежечасный бэкап логов транзаций делать без INIT?

ну да, хотя в приведенном тобой скрипте о бекапах логов не было ни слова
24 дек 13, 14:12    [15339718]     Ответить | Цитировать Сообщить модератору
 Re: Кто как делает бэкапы? Удаление старых резервных копий. xp_delete_file? xp_cmdshell?  [new]
timmek
Member

Откуда:
Сообщений: 9
b00ring,

Делаю вот так, не жалуюсь :)

BEGIN
DECLARE @FileNameStr nvarchar(100)
DECLARE @DelFileNameStr nvarchar(100)
DECLARE @FileNameStrCopy nvarchar(100)
DECLARE @DelFileNameStrCopy nvarchar(100)
DECLARE @CmdDelStr nvarchar(100)
DECLARE @CmdDelStrCopy nvarchar(100)
DECLARE @CmdCopyStr nvarchar(200)
DECLARE @CurDateTimeStr nvarchar(50)
DECLARE @DelDateStr nvarchar(50)

DECLARE @NameDB nvarchar(50)
DECLARE @BackupDir nvarchar(50)
DECLARE @BackupDirCopy nvarchar(50)

-- Имя БД
SET @NameDB = 'DBname'
-- Путь к файлу
SET @BackupDir = 'D:\BackupDB\'
-- Путь к файлу копии (не обязательно локальный диск)
SET @BackupDirCopy = 'Z:\BackupDB\'

-- Генерируем название файла
SET @CurDateTimeStr = replace(convert(nvarchar, GETDATE(), 120), '-', '')
SET @CurDateTimeStr = replace(@CurDateTimeStr, ' ', '_')
SET @CurDateTimeStr = replace(@CurDateTimeStr, ':', 'x')
SET @FileNameStr = @BackupDir + @NameDB + '_backup_' + @CurDateTimeStr + '.bak'
SET @FileNameStrCopy = @BackupDirCopy + @NameDB + '_backup_' + @CurDateTimeStr + '.bak'

-- Генерируем название файла - 7 дней + *,bak
SET @DelDateStr = replace(convert(nvarchar, GETDATE() - 7, 112), '.', ' ')
set @DelFileNameStr = @BackupDir + @NameDB + '_backup_' + @DelDateStr + '*.bak'
set @DelFileNameStrCopy = @BackupDirCopy + @NameDB + '_backup_' + @DelDateStr + '*.bak'

-- Удаляем старые бэкапы
SET @CmdDelStr= 'del ' + @DelFileNameStr
EXEC xp_cmdshell @CmdDelStr

-- Удаляем старые копии бэкапов
SET @CmdDelStrCopy = 'del ' + @DelFileNameStrCopy
EXEC xp_cmdshell @CmdDelStrCopy

-- Делаем бэкап
BACKUP DATABASE @NameDB TO DISK = @FileNameStr WITH NOFORMAT, NOINIT, NAME = @FileNameStr, SKIP, NOREWIND, NOUNLOAD,STATS = 1,COMPRESSION

-- Копируем текущий бэкап на USB/Другое быстросъемное/внешнее хранилище
SET @CmdCopyStr = 'copy ' + @FileNameStr + ' ' + @FileNameStrCopy;
EXEC xp_cmdshell @CmdCopyStr

END
26 дек 13, 12:28    [15349404]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить