SQL实战日记--数据库文件还原问题排查

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z10843087/article/details/78869390

前言

昨天群里有为同学,在测试文件组的备份还原时,遇到了一个问题。


测试的脚本参考的是KK的博客 ,链接地址如下 :http://blog.csdn.net/kk185800961/article/details/52050565

分析

经过测试,首先,KK的脚本在SQL Sever 2008 版本下,运行是正常的没有问题的。但是在SQL SERVER 2014版就提示上面的问题。

消息 8653,级别 16,状态 1,第 102 行
查询处理器无法为表或视图“TAB”生成计划,因为该表驻留在不处于联机状态的文件组中。

从错误提示来看,是文件组不在联机的状态。

SELECT  FG.name ,
        FG.type ,
        FG.type_desc ,
        FG.is_read_only ,
        filegroup_guid ,
        MF.state_desc
FROM    sys.filegroups FG
        INNER JOIN sys.master_files MF ON FG.data_space_id = MF.data_space_id
WHERE   MF.database_id = DB_ID();

可以看到FG3文件组处于RESTORING的状态。,在还原数据库文件为norecovery 模式之后,文件组就会变成这个状态。



解决办法是,对数据再做一个日志备份,然后用recovery模式还原。

备份日志
BACKUP LOG Demo  
   TO DISK = 'D:\MSSQLDATA\backup\Demo_log.bck'
   WITH INIT , COMPRESSION
GO  
--	还原日志
RESTORE LOG [Demo]
	FROM  DISK = N'D:\MSSQLDATA\backup\Demo_log.bck'
	WITH  RECOVERY
GO

此时,文件组状态变成正常的ONLINE



查询表中的语句也正常了。


方法2:

调整KK的脚本的执行顺序。把原来的脚本是执行顺序调整一下。备份文件之后,就还原文件,然后再备份日志,还原日志。这样脚本也能正常运行



总结

总的来说,在SQL Server越往后的版本,对数据库的各种检查更加严格。我们在使用各种技术的时候,一定要先了解对应的背景。操作系统,数据库版本,数据库的架构等信息,否则可能会得出错误的结论,导致问题。   
SQL Server 2008的版本下,
备份文件 --》备份日志--》还原文件norecovery--》还原日志文件recovery   正常
而在SQL Server 2014 版本和2008 版本下
备份文件 --》还原文件norecovery--》备份日志--》还原日志文件recovery   都正常
所以建议都使用下面的方式来还原数据库文件。



展开阅读全文

没有更多推荐了,返回首页