--创建数据库
create database TEST on primary
( name=test_1,filename='d:\datafile\test_1.mdf',size=10MB,filegrowth=10%),
( name=test_2,filename='d:\datafile\test_2.mdf',size=10MB,filegrowth=10% ),
filegroup second
( name=test_3,filename='d:\datafile\test_3.mdf',size=10MB,filegrowth=10%),
( name=test_4,filename='d:\datafile\test_4.mdf',size=10MB,filegrowth=10%)
log on
( name=test_1_log,filename='d:\datafile\test_1.log',size=5MB,filegrowth=10%);
--全备
backup database test to disk='d:\bak\test_1.bak'
backup log test to disk = 'd:\bak\test_1_log.bak' with norecovery
GO
--继续测试
use test
drop table test_4
create table TEST_4 ( fileid int ) on [second]
declare @count int
set @count=1
while (@count<100)
begin
insert into TEST_4 values(@count)
set @count=@count+1
end
--只备份第二个文件组
--
backup database test filegroup='second', file ='test_3' ,file='test_4' to disk='d:\bak\test_1_second.bak' with init
backup log test to disk='d:\bak\test_1_log_.log'
--
delete from TEST_4 where fileid<500
--还原
use master
RESTORE DATABASE test
FILE = 'test_3',
FILE = 'test_4',
FILEGROUP = 'second'
FROM disk ='d:\bak\test_1_second.bak'
WITH norecovery ,replace
--注意在此并不能使数据库第二个文件组处理可使用状态
restore log test from disk='d:\bak\test_1_log_1.log' with recovery
查看数据文件状态
select * from sys.master_files where name like 'test%'
比较纠结的就是当你发恢复一个文件组你必须得不断的滚日志到最近.
关于stopat 的一点说明:
用传统备份即做一个完整备份,再做日志备份,可以很方便的用with recovery,stopat=''来恢复指定时间点的内容
但你用文件组备份时,必须备份尾日志。
这里我做一个案例分析:
我现在手头上有三个备份:
全备: 没有时间限制
文件组备份:2011-04-11 14:55:55.810
当数据库出问题时做了一个日志备份:2011-04-11 15:00:04.470
删数据时间:2011-04-11 14:56:33.107
那么恢复方式有哪几种呢:
一、恢复全备,再恢复日志备,加stopat参数可以回滚到14:56分时的数据
脚本如下:
use master
restore database test from disk=N'd:\bak\test.bak' with replace,norecovery
restore log test from disk=N'd:\bak\test_1.log' with recovery,replace,stopat='2011-04-11 14:56:00.093'
但我们一般情况下没有那么幸运,有全备,并且在这种情况下文件组备份没有什么用处
二、假设只有文件组备份,那么我们必须有以前数据库的完整结构,参见:
http://support.microsoft.com/kb/281122/zh-cn 与其这样,我不如用数据库镜像,可能安全性比这个要高许多(我想到这,我禁不住把微软骂了一通,文件组备份这么弱,有什么用呢?浪费时间了:( ~~~~~ )