![MS SQL差异备份策略](https://linux22.com/image/518771/MS%20SQL%E5%B7%AE%E5%BC%82%E5%A4%87%E4%BB%BD%E7%AD%96%E7%95%A5.png)
我们的一台服务器最近出现故障。服务器无法访问,我们无法从中获取任何数据。我们有一个备份计划,每隔一天进行一次完整备份,然后每 6 小时左右进行一次差异备份。
我使用 Jungle Disk 将数据从服务器传输到外部存储,但这次我们失败了。差异备份完成和 Jungle Disk 将文件复制到云端之间总会有延迟。在这种情况下,我们上次的差异备份是在 1 小时前进行的,因此我们之前的所有差异备份都毫无用处。
有没有什么方法可以设置差异备份,这样我就不必总是拥有最新版本的差异备份,而只需使用我可以访问的许多差异备份恢复备份?
答案1
我知道这是一个老话题,但我在研究 JungleDisk 的另一个问题时遇到了这个问题。
原帖作者遇到的问题是,每次备份的差异都与上次相同,而 JungleDisk 会用新文件覆盖旧的云端备份。这没什么问题,除非上次备份到云端失败了……他的情况就是这样。
但对 OP 的问题的回答是肯定的,在您的维护计划中,使用日期和时间戳重命名每个差异备份。例如,以下计划创建如下文件名:
我的数据库名称_Diff_2012-08-20T01-35-01.BAK
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @fileNameNoExt VARCHAR(256) -- Used to name the backup from the NAME parameter
DECLARE @subDir VARCHAR(256) -- Used to create the subdirectory for the backup
DECLARE @backupSetId as int
DECLARE @noBackupErrorMessage VARCHAR(256)
SET @path = 'C:\Path\To\Your\Backups\'
SELECT @fileDate = REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),126), ':', '-'), '.', '')
-- Exclude the system databases, as well as any others you don't want to back up.
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '\' + @name + '_Diff_' + @fileDate + '.BAK'
SET @fileNameNoExt = @name + '\' + @name + '_Diff_' + @fileDate
SET @subDir = @path + @name
EXECUTE master.dbo.xp_create_subdir @subdir
BACKUP DATABASE @name TO DISK = @fileName WITH DIFFERENTIAL, NOFORMAT, NOINIT, NAME = @fileNameNoExt, SKIP, NOREWIND, NOUNLOAD, STATS = 10
-- Now verify the backup
SET @noBackupErrorMessage = N'Verify failed. Backup information for database ' + @name + ' not found.'
select @backupSetId = position from msdb..backupset where database_name=@name and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=@name )
if @backupSetId is null begin raiserror(@noBackupErrorMessage, 16, 1) end
RESTORE VERIFYONLY FROM DISK = @fileName WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
但是,如果您使用 JungleDisk,您可能会发现备份链已中断,并且无法进行差异备份!
答案2
保护 SQL Server 数据从磁盘开始 - 将数据文件放在专用 RAID 驱动器上(最好是 RAID10),将事务日志文件放在另一个 RAID10 驱动器上,将 TEMPDB 放在其他地方。这样做是为了提高性能,但也是为了可恢复性 - 如果其中一个驱动器发生故障,您还有机会。RAID 应该允许重建,但如果数据驱动器发生故障,您也应该能够从事务日志中获取最新的事务。
接下来是 SQL Server 备份 - 它们应该放在单独的磁盘上,然后从服务器上取出,放到磁带上或异地的另一台服务器上。根据数据库的大小和维护窗口,每天进行一次完整备份可能是合适的 - 或者每周进行一次完整备份。除此之外,还要经常进行事务日志备份(可能每小时一次),并且可能根据数据库的大小进行差异备份。
最后一部分是检查。经常检查您的恢复,实际在其他地方进行恢复。检查备份是否以某种方式移至异地。测试测试测试