上次关于SQL文件组的备份和还原似乎意犹未尽,我总觉得好像欠些什么。做了尾日志备份,是为了能将数据库还原到故障发生时的那个点。但如果没有发生故障,而是因为误操作,想还原到前面的一个点呢,当然,同样要先做尾日志备份,否则还原会出错,但是还原的时候不要还原尾日志了。
我建了一个测试数据库test,两个文件组,primary和FG1,FG1为默认文件组,
(1)先在FG1建了一个表grade,然后对两个文件组都做了一个完整备份(基备份)。
(2)然后对表grade插入一些数据,再做了一个事务日志备份。
(3)又在FG1建了一个表mark。
(4)对两个文件组都做了差异备份。
(5)对表mark插入10条记录。
(6)做事务日志备份。
(7)对表再插入10条记录。
(8)做事务日志备份。
现在我想将数据库还原到第(6)步时的状态。
use master
go
restore database test
filegroup='primary'
from myback1,myback2
with file=1,norecovery
go
restore database test
filegroup='FG1'
from myback1,myback2
with file=2,norecovery
go
restore database test
filegroup='primary'
from myback1,myback2
with file=4,norecovery
go
restore database test
filegroup='FG1'
from myback1,myback2
with file=5,norecovery
go
restore log test
from myback1,myback2
with file=6,recovery
go
这一步我测试成功。
有一点要注意的是:不管你要备份哪个文件组,主文件组primary一定要先备份,不然以后在备份其他文件组的差异备份就会报错,提示基备份不存在。因为主文件组包含主数据文件,用于存储数据库的启动信息和元数据,包括系统表和对象。
在上面的测试当中,在完整文件组备份和差异备份之间还有一次事务日志备份,在还原的时候这个事务日志并没有还原。但是,但是如果在那次事务日志备份之后没有对主文件组进行差异备份,而仅仅对文件组FG1进行了差异备份,那么在还原的时候这个日志一定要还原,而且是在完整文件组备份还原后就得还原(按顺序进行),否则在还原后面的事务日志时就会提示你这个日志太晚,不能应用于数据库的错误信息。
还原变成如下:
use master
go
restore database test
filegroup='primary'
from myback1,myback2
with file=1,norecovery
go
restore database test
filegroup='FG1'
from myback1,myback2
with file=2,norecovery
go
restore log test
from myback1,myback2
with file=3,norecovery
go
restore database test
filegroup='FG1'
from myback1,myback2
with file=5,norecovery
go
restore log test
from myback1,myback2
with file=6,recovery
go
所以在还原文件或文件组的时候,还原完最近的差异备份后,事务日志一定要紧接着还原,如果完整备份之后没有再进行差异备份,那么还原完完整备份后,事务日志一定也要欢原。