使用SSMS 2017恢复SQL Server备份后新库缺失数据表求助
解决SSMS恢复数据库后数据表丢失的问题
嘿,我之前也碰到过一模一样的情况,用SSMS恢复备份后存储过程、视图都好好的,但数据表凭空消失了——大概率是恢复过程里的细节没处理到位,咱们一步步排查解决:
第一步:先确认是不是真的没有表(排除权限坑)
有时候不是表没了,而是当前登录的用户压根没权限查看表。先切换到sysadmin权限的账号(比如sa),执行下面的SQL验证:
USE db2; GO -- 查询所有用户表的基础信息 SELECT name AS table_name, schema_id FROM sys.tables; -- 更直观的,查看所有架构下的表 SELECT s.name AS schema_name, t.name AS table_name FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id;
如果这里能查到表,那就是权限问题,给你的登录账号补上对应架构的权限就行,比如:
USE db2; GO -- 给用户赋予dbo架构下的读写权限,表在其他架构就把dbo换成对应名称 GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO [你的登录用户名];
第二步:排查恢复操作的核心问题(最常见原因)
如果上面的查询确实看不到表,那基本是恢复时只捞了PRIMARY文件组(系统对象存在的文件组),而用户表所在的其他文件组被漏掉了。
先摸清备份里的所有内容
执行这个SQL,查看备份文件里包含的所有文件、文件组信息:
RESTORE FILELISTONLY FROM DISK = 'D:\你的备份路径\db1.bak'; -- 替换成你的bak文件实际路径
结果里会列出每个文件的LogicalName(逻辑名)、PhysicalName(原物理路径)、FileGroupName(所属文件组)。如果发现有多个FileGroupName,说明原数据库有多个文件组,恢复时必须全部包含。
用T-SQL重新执行恢复(避开SSMS向导的误操作)
SSMS的图形界面有时候容易忽略选项,直接用SQL语句更稳妥,把下面的代码改成你的实际路径和逻辑名:
RESTORE DATABASE db2 FROM DISK = 'D:\你的备份路径\db1.bak' WITH -- 把原数据文件的逻辑名映射到新库的物理路径 MOVE 'db1' TO 'D:\SQL数据路径\db2.mdf', -- 把原日志文件的逻辑名映射到新库的物理路径 MOVE 'db1_log' TO 'D:\SQL日志路径\db2_log.ldf', -- 如果原库有其他文件组的文件,一定要加上对应的MOVE语句 -- MOVE 'db1_FileGroup2' TO 'D:\SQL数据路径\db2_FileGroup2.ndf', REPLACE, -- 覆盖已存在的db2(如果之前创建过空库) RECOVERY; -- 恢复后数据库直接处于可用状态
注意:MOVE后面的逻辑名必须和RESTORE FILELISTONLY查询出来的完全一致,不能写错。
第三步:如果坚持用SSMS向导,这些细节别漏
要是还是习惯图形界面恢复,一定要盯紧这几个选项:
- 切换到「选项」标签页,确认「恢复状态」选的是「RESTORE WITH RECOVERY」(默认选项,恢复后数据库直接可用)
- 切换到「文件组」标签页,确保所有文件组都被勾选(别只勾PRIMARY)
- 在「还原为」列,正确修改每个文件的物理路径,确保目标路径存在,且SQL Server服务账号有写入权限
按照这个流程走,丢失的数据表应该就能找回来了。
内容的提问来源于stack exchange,提问作者rudeboy
相关产品推荐
相关产品推荐

