Моя цель проста. Я хочу, чтобы SQL Server сохранял ночную резервную копию БД в течение 5 дней.
Поэтому каждую ночь в какое-то время я хочу, чтобы была сделана новая резервная копия БД и одна удалена, так что у меня на диске будет 5 дней.
Я пытаюсь создать план обслуживания, чтобы справиться с этой работой и сохранить файл (я думаю). У меня есть добавляемые резервные копии, поэтому один файл bak будет содержать текущие 5 дней (не уверен, что это сработает 0, потому что как SQL узнает, что удалить, и удаление одного файла bak удалит все резервные копии).
Как вы можете понять, почему у меня возникают проблемы с выяснением того, как удалить старые резервные копии из БД, чтобы у Y были только 5 самых последних на диске.
Какие-нибудь советы по этому поводу?
Если вы используете планы обслуживания, есть «Задача очистки при обслуживании», которую вы можете добавить в свой план, которая используется для очистки файлов BAK по прошествии стольких дней. Просто поместите эту задачу после «Задачи резервного копирования базы данных» и настройте ее на удаление файлов резервных копий старше 5 дней, и все будет в порядке.
HTH, Дэн
В команде TSQL BACKUP можно установить две опции резервного копирования. Есть EXPIREDATE, чтобы указать дату истечения срока действия резервной копии, и RETAINDAYS, чтобы указать количество дней для хранения резервной копии. Вы должны использовать параметры RETAINDAYS и установить его на 5 дней. Все остальное сделает процесс резервного копирования.
В настройке плана обслуживания вы должны увидеть аналогичные параметры при определении задачи резервного копирования базы данных. Вы можете указать, как долго хранить резервную копию.
В планах обслуживания нет возможности указать количество сохраняемых резервных копий.
Предлагаемые планы обслуживания - хороший путь вперед. Одна альтернатива - использовать запланированное задание, которое вызывает хранимую процедуру, подобную этой;
CREATE PROCEDURE backup_all_databases
@path VARCHAR(255)='c:\backups\'
AS
DECLARE @name VARCHAR(50) -- database name
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @dbIsReadOnly sql_variant -- is database read_only?
DECLARE @dbIsOffline sql_variant -- is database offline?
DECLARE db_cursor CURSOR FOR
SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') AND version > 0 AND version IS NOT NULL
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '.bak' -- + '_' + @fileDate + '.BAK'
SET @dbIsReadOnly = (SELECT DATABASEPROPERTY(@name, 'IsReadOnly')) -- 1 = Read Only
SET @dbIsOffline = (SELECT DATABASEPROPERTY(@name, 'IsOffline')) -- 1 = Offline
IF (@dbIsReadOnly = 0 OR @dbIsReadOnly IS NULL) AND @dbIsOffline =0
BEGIN
BACKUP DATABASE @name TO DISK = @fileName WITH INIT
END
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
GO
Адаптируйте его, добавив метку времени к имени файла резервной копии. И добавьте любые требуемые параметры с истекшим сроком или сроком хранения. Как и предлагает BOBS, вы также можете использовать задачу очистки для удаления старых файлов резервных копий, превышающих 5 дней. Это дает вам отдельные резервные копии на каждый день. Вы можете запускать его ежечасно или x раз в течение дня или один раз в день, что вам нужно.