在论坛看到有人遇到 NDF 文件丢失并且没有备份,所以无法成功附加数据库。在网上也看到过很多回答是如果没有 NDF 就无法附加成功。 其实我自己测试下来即使没有 NDF 也是可以成功附加的。但是有条件,丢失的 NDF 文件不属于 Primary file group 并且 SQL Ser
在论坛看到有人遇到 NDF 文件丢失并且没有备份,所以无法成功附加数据库。在网上也看到过很多回答是如果没有 NDF 就无法附加成功。
其实我自己测试下来即使没有 NDF 也是可以成功附加的。但是有条件,丢失的 NDF 文件不属于 Primary file group 并且 SQL Server 为企业版
下面是我做的测试:
1. -- 创建数据库
CREATE DATABASE [test1] CONTAINMENT = NONE ON PRIMARY
( NAME = N'test1' , FILENAME = N'C:\data\test1.mdf' , SIZE = 5120 KB , MAXSIZE = UNLIMITED , FILEGROWTH = 1024 KB ),
FILEGROUP [New]
( NAME = N'new' , FILENAME = N'C:\data\new.ndf' , SIZE = 5120 KB , MAXSIZE = UNLIMITED , FILEGROWTH = 1024 KB )
LOG ON
( NAME = N'test1_log' , FILENAME = N'C:\data\test1_log.ldf' , SIZE = 1024 KB , MAXSIZE = 2048 GB , FILEGROWTH = 10 %)
GO
2. -- 在 primary file group 上创建两张表
create table test ( name varchar ( 10 )) ON [PRIMARY]
create table test2 ( name varchar ( 10 )) ON [PRIMARY]
-- 在 NDF 上面创建一张表
create table test1 ( name varchar ( 10 )) on new
3. -- 插入 10 条数据
insert into test values ( 'kevin' )
insert into test1 values ( 'kevin' )
insert into test2 values ( 'kevin' )
4. --Detach 数据库
USE [master]
GO
EXEC master . dbo . sp_detach_db @dbname = N'test1'
GO
5. 将 MDF , NDF , LDF 文件复制到其他文件夹
6. 按照第一步的脚步创建一个同名的数据库
-- 将数据库 Offline
use master
go
alter database test1 set offline
7. 将第 5 步备份的 MDF 和 LDF 文件覆盖现在的数据库 MDF 和 LDF
8. 将出问题的 NDF 文件 Offline
alter database test1 modify FILE ( name = new , offline )
9. 将数据库 Online
alter database test1 set online
现在可以看到三张表都是存在的
但是访问 test1 表的时候会出现下面的错误:
Msg 8653,Level 16, State 1, Line 1
The queryprocessor is unable to produce a plan for the table or view 'test1' because thetable resides in a filegroup which is not online.
因为表所在的 Filegroup 是离线的,所以无法访问。
查看更多关于丢失或损坏NDF文件如何附加数据库的详细内容...