积极答复者
数据库文件组丢失问题

问题
答案
-
删除损坏的文件组,再ONLINE Database很多东西<如结构或步骤过程>是一样的,只是语法有区别
Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年11月6日 7:11
-
将DB中的故障文件 OFFLINE 即可, 参考下面的测试
-- 测试数据库 CREATE DATABASE DB_TEST ON PRIMARY( -- 主文件组 NAME = DB_TEST, FILENAME = 'c:\db_test.mdf' ), FILEGROUP FG1( -- 用户文件组 NAME = DB_TEST_1, FILENAME = 'c:\db_test.ndf' ) LOG ON( -- 日志 NAME = DB_TEST_LOG, FILENAME = 'c:\db_test.ldf' ); GO -- 测试表 - PRIMARY 文件组 CREATE TABLE DB_TEST.dbo.t1( id int ) ON [PRIMARY]; GO -- 测试表 - fg1 文件组 CREATE TABLE DB_TEST.dbo.t2( id int ) ON FG1; GO -- 将 DB 离线 ALTER DATABASE DB_TEST SET OFFLINE WITH ROLLBACK AFTER 0 ; GO -- 删除 FG1 文件组的文件, 模拟该文件破坏 EXEC xp_cmdshell 'del "c:\db_test.ndf"'; GO -- 将 DB 在线线 ALTER DATABASE DB_TEST SET ONLINE WITH ROLLBACK AFTER 0 ; GO -- 离线文件 DB_TEST_1, (因为已经删除) ALTER DATABASE DB_TEST MODIFY FILE( NAME = DB_TEST_1, OFFLINE ); -- 再次将 DB 在线线 ALTER DATABASE DB_TEST SET ONLINE WITH ROLLBACK AFTER 0 ; GO -- 查询测试 SELECT * FROM DB_TEST.dbo.t1 GO SELECT * FROM DB_TEST.dbo.t2 GO -- 删除测试 DROP DATABASE DB_TEST;
- 已建议为答案 JerrynetModerator 2009年11月3日 6:06
- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年11月6日 7:11
全部回复
-
删除损坏的文件组,再ONLINE Database很多东西<如结构或步骤过程>是一样的,只是语法有区别
Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年11月6日 7:11
-
上面说了, 没有任何备份, (模似故障)
损坏的,文件组,里面只有一个表的数据, 打算不要了, 只想要除这个表以外的所有的表.
版本,SQL2005 SP2, WINDOWS 2003 SP2 ,
数据库可以启动,
但是只是无法打开损坏文件组所在的库.
自己也可以模拟故障:
1,停止SQL SERVER,
2,把NDF文件改名,
3,启动SQL SERVER,
接着出现我们要解决的问题,
想打开损坏的数据库,日志提示找不到被改名的物理文件,
反正损坏了,不想这个文件了, 问题是如何打开这个有问题的库. -
将DB中的故障文件 OFFLINE 即可, 参考下面的测试
-- 测试数据库 CREATE DATABASE DB_TEST ON PRIMARY( -- 主文件组 NAME = DB_TEST, FILENAME = 'c:\db_test.mdf' ), FILEGROUP FG1( -- 用户文件组 NAME = DB_TEST_1, FILENAME = 'c:\db_test.ndf' ) LOG ON( -- 日志 NAME = DB_TEST_LOG, FILENAME = 'c:\db_test.ldf' ); GO -- 测试表 - PRIMARY 文件组 CREATE TABLE DB_TEST.dbo.t1( id int ) ON [PRIMARY]; GO -- 测试表 - fg1 文件组 CREATE TABLE DB_TEST.dbo.t2( id int ) ON FG1; GO -- 将 DB 离线 ALTER DATABASE DB_TEST SET OFFLINE WITH ROLLBACK AFTER 0 ; GO -- 删除 FG1 文件组的文件, 模拟该文件破坏 EXEC xp_cmdshell 'del "c:\db_test.ndf"'; GO -- 将 DB 在线线 ALTER DATABASE DB_TEST SET ONLINE WITH ROLLBACK AFTER 0 ; GO -- 离线文件 DB_TEST_1, (因为已经删除) ALTER DATABASE DB_TEST MODIFY FILE( NAME = DB_TEST_1, OFFLINE ); -- 再次将 DB 在线线 ALTER DATABASE DB_TEST SET ONLINE WITH ROLLBACK AFTER 0 ; GO -- 查询测试 SELECT * FROM DB_TEST.dbo.t1 GO SELECT * FROM DB_TEST.dbo.t2 GO -- 删除测试 DROP DATABASE DB_TEST;
- 已建议为答案 JerrynetModerator 2009年11月3日 6:06
- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年11月6日 7:11