以前有人问过我SQL Server backup命令是不是支持单表备份,SQL Server是没有Backup table命令的。当时我的建议是用SSIS导出到文件系统,其他数据库或者用文件组备份。现在想想单纯靠文件组备份不一定解决表还原问题。
对于文件组还原要求所有的文件组都要在同一个时间点上,这样才能保证数据库的连续性。如果我们发现文件组中的数据被被删除,那么我们需要首先恢复文件组备份然后再一次还原日志备份(如果是在线备份的日志备份是在错误发生后产生的),使还原的文件组跟其他文件组保持在同一时间点,这时还原的文件组才能Online.这时候数据已经没有了。
即使我们想直接把文件组还原到其他服务器上也是不可能的,因为数据文件的GUID属性。 所以在这种情况下还是要用到数据库还原。
下面是我自己做的一个测试:
USE [master]
GO
create database DBA
go
ALTER DATABASE [DBA] ADD FILEGROUP [Group]
GO
ALTER DATABASE [DBA] ADD FILE ( NAME = N'Group',
FILENAME = N'D:\MSSQL\Group.ndf' ,
SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [Group]
GO
--在文件组上创建表并且插入1000条数据
use DBA
go
create table test (name varchar(10)) on [group]
go
insert into test values ('allen')
go 1000
use master
go
--对文件组Group做全备份
BACKUP DATABASE DBA FILEGROUP ='GROUP' TO DISK ='D:\MSSQL\Group.bak'
use DBA
go
--删除数据
delete top (10) from test
use master
go
--FileGroup出现故障需要恢复,现在只需要从文件组恢复
restore database DBA filegroup ='group' from disk ='D:\MSSQL\Group.bak' with recovery
--现在我们做一个日志备份以确保捕获到该文件脱机时的点
backup log DBA to DISK ='D:\MSSQL\Group_Log_Final.trn'--查询Group的状态为RESTORING
---查看现在文件组的状态
use DBA
GO
select state_desc,name from sys.database_files
---显示Group文件组状为Restoring,因为还没有和其他文件组在同一个时间点,我们需要用上面备份的日志还原并且将文件组Online
use master
go
restore log DBA From DISK ='D:\MSSQL\Group_Log_Final.trn' with recovery
use DBA
GO
select state_desc,name from sys.database_files where name ='Group'
--数据库已经Online了
state_desc name
------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------
ONLINE Group
(1 row(s) affected)
--查看数据位990条不是1000条,所以数据不能够恢复
use DBA
gO
select COUNT(*) from test;
-----------
990
(1 row(s) affected)
我也是第一次使用文件组备份恢复如果大家觉得上面的逻辑有错误欢迎指正。