SQL Server 2008的完全备份和差异备份到底有啥暗藏的玄机啊?
我使用SQL Server 2008的维护计划向导创建了一个备份任务,其中包含一个全备份的子任务,半个小时跑一次,备份的数据单独放到一个文件夹,接着又建立了一个差异备份的子任务,10分钟跑一次。备份的数据存到另外一个文件夹,然后没半个小时的全备份都跑的很Happy,大概九百多兆的数据都能备份上!接着我就更新数据库,在其中几张表中插入新数据,想看到差异备份的结果,结果一直都没有看到有差异备份成功啊!
按照SQL SERVER 官方文档的描述“差异备份所基于的是最近一次的完整备份。这称为差异“基准”。差异备份仅包括自建立差异基准后更改的数据。”,感觉配的没啥问题啊!好郁闷!
[解决办法]
1)完全备份
-------------------------------------------
(1)是备份的基准。在做备份时第一次备份都建议使用完全备份。
(2)完全备份会备份数据库的所有数据文件、数据对象和数据。
(3)会备份事务日志中任何未提交的事务。因为已提交的事务已经写入数据文件中。
--------------------------------------------
backup database d1 to bak1 with init --完全备份
backup database d1 to bak1 with noinit
----------------------------------
2)差异备份
---------------------------------------------
(1)基于完全备份。
(2)备份自最近一次完全备份以来的所有数据库改变。
(3)恢复时,只应用最近一次完全备份和最新的差异备份。
-----------------------------------------------
backup database d2 to bak2 with init,name='d2_full' --差异备份,第一次备份时应做完全备份
create table b1(c1 int not null,c2 char(10) not null)
backup database d2 to bak2 with differential,name='d2_diff1'
insert b1 values(1,'a')
backup database d2 to bak2 with differential,name='d2_diff2'
insert b1 values(2,'b')
backup database d2 to bak2 with differential,name='d2_diff3'
insert b1 values(3,'c')
backup database d2 to bak2 with differential,name='d2_diff4'
restore headeronly from bak2
----------------------------------
3)事务日志备份
-------------------------
(1)基于完全备份。
(2)为递增备份,即备份从上一次备份以来到备份时所写的事务日志。
(3)允许恢复到故障时刻或者一个强制时间点。
(4)恢复时,需要应用完全备份和完全备份后的每次日志备份。
-------------------------
backup database d3 to bak3 with init,name='d3_full' --日志备份,第一次备份时应做完全备份
create table b1(c1 int not null,c2 char(10) not null)
backup log d3 to bak3 with
insert b1 values(1,'a')
backup log d3 to bak3 with
insert b1 values(2,'b')
backup log d3 to bak3 with
insert b1 values(3,'c')
backup log d3 to bak3 with
restore headeronly from bak3
----------------------------------
create table b1(c1 int not null,c2 char(10) not null) --Full+Log+Diff
backup log d4 to bak4 with
insert b1 values(1,'a')
backup log d4 to bak4 with
insert b1 values(2,'b')
backup database d4 to bak4 with differential,name='d4_diff1'
insert b1 values(3,'c')
backup log d4 to bak4 with
insert b1 values(4,'d')
backup log d4 to bak4 with
insert b1 values(5,'d')
backup database d4 to bak4 with differential,name='d4_diff2'
restore headeronly from bak4
--------------------------
[解决办法]
理解的没有什么问题,差异备份是基于最近的一次全备. 但是差异备份并不只是备份更改的数据,, 差异备份备份的应该是更改的数据页..这一页有数据更改就把这一页备份下来! 和 快照差不多..如果实例库有一行数据更改,他就会把这一页的数据 写入快照这个稀疏文件中..快照已64kb递增.永远是64的倍数! 所有的差备基于同一个全备.所有的日志备份都基于第一档全备.. 只有第一档全备才会截断日志..不做shrink 动作,不做备份模式切换.日志永远连续. 也就是能根据第一档全备.恢复到任何你想要的时刻!
没有备份出来. 是不是你设置的问题...
--这里是循环备份
DECLARE @a AS INT=1,@max AS INT=5,@string AS VARCHAR(1000)
WHILE @a<@max
BEGIN
INSERT INTO dba.dbo.aa SELECT @a
SET @a=@a+1
SET @string='backup database dba to disk =''D:\LX20111220\dba'+CAST(@a AS VARCHAR)+'.bak'''
EXEC (@string)
WAITFOR DELAY '00:00:15'
INSERT INTO dba.dbo.aa SELECT @a
SET @string='backup database dba to disk =''D:\LX20111220\dba'+CAST(@a AS VARCHAR)+'_diff.bak'''+'WITH differential'
EXEC (@string)
WAITFOR DELAY '00:00:15'
INSERT INTO dba.dbo.aa SELECT @a
SET @string='backup log dba to disk =''D:\LX20111220\dba'+CAST(@a AS VARCHAR)+'.trn'''
EXEC (@string)
END
-- 这里是循环还原
DECLARE @a AS TABLE(id INT IDENTITY(1,1),bkname VARCHAR(50))
INSERT INTO @a EXEC xp_cmdshell ' dir D:\LX20111220\ /od /b'
DECLARE @b AS INT =1,@max AS INT,@bkname AS VARCHAR(50)
SELECT @max=MAX(id) FROM @a
PRINT @max
WHILE @b<@max
BEGIN
SELECT @bkname=bkname FROM @a WHERE id=@b
EXEC ('restore database dba from disk=''D:\LX20111220\'+@bkname+''' with norecovery,replace')
SET @b=@b+1
PRINT @b
END
-- 上面的还原可以得出, log备份不但基于全备,不基于差异备份 一样能够还原上
RESTORE DATABASE dba FROM DISK='D:\LX20111220\dba2.bak'WITH norecovery,REPLACE
RESTORE DATABASE dba FROM DISK='D:\LX20111220\dba2.trn'WITH norecovery,REPLACE
RESTORE DATABASE dba FROM DISK='D:\LX20111220\dba3.bak'WITH norecovery,REPLACE
RESTORE DATABASE dba FROM DISK='D:\LX20111220\dba3.trn'WITH norecovery,REPLACE
--其中中间的哪一档差异备份不用管他,log备份不基于差异备份.至依赖于全备