以前有人問過我SQL Server backup命令是不是支持單表備份,SQL Server是沒有Backup table命令的。當時我的建議是用SSIS導(dǎo)出到文件系統(tǒng),其他數(shù)據(jù)庫或者用文件組備份。現(xiàn)在想想單純靠文件組備份不一定解決表還原問題。
對于文件組還原要求所有的文件組都要在同一個時間點上,這樣才能保證數(shù)據(jù)庫的連續(xù)性。如果我們發(fā)現(xiàn)文件組中的數(shù)據(jù)被被刪除,那么我們需要首先恢復(fù)文件組備份然后再一次還原日志備份(如果是在線備份的日志備份是在錯誤發(fā)生后產(chǎn)生的),使還原的文件組跟其他文件組保持在同一時間點,這時還原的文件組才能Online.這時候數(shù)據(jù)已經(jīng)沒有了。
即使我們想直接把文件組還原到其他服務(wù)器上也是不可能的,因為數(shù)據(jù)文件的GUID屬性。 所以在這種情況下還是要用到數(shù)據(jù)庫還原。
下面是我自己做的一個測試:
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
--在文件組上創(chuàng)建表并且插入1000條數(shù)據(jù)
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
--刪除數(shù)據(jù)
delete top (10) from test
use master
go
--FileGroup出現(xiàn)故障需要恢復(fù),現(xiàn)在只需要從文件組恢復(fù)
restore database DBA filegroup ='group' from disk ='D:\MSSQL\Group.bak' with recovery
--現(xiàn)在我們做一個日志備份以確保捕獲到該文件脫機時的點
backup log DBA to DISK ='D:\MSSQL\Group_Log_Final.trn'--查詢Group的狀態(tài)為RESTORING
---查看現(xiàn)在文件組的狀態(tài)
use DBA
GO
select state_desc,name from sys.database_files
---顯示Group文件組狀為Restoring,因為還沒有和其他文件組在同一個時間點,我們需要用上面?zhèn)浞莸娜罩具€原并且將文件組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'
--數(shù)據(jù)庫已經(jīng)Online了
state_desc name
------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------
ONLINE Group
(1 row(s) affected)
--查看數(shù)據(jù)位990條不是1000條,所以數(shù)據(jù)不能夠恢復(fù)
use DBA
gO
select COUNT(*) from test;
-----------
990
(1 row(s) affected)
我也是第一次使用文件組備份恢復(fù)如果大家覺得上面的邏輯有錯誤歡迎指正。