none
数据库文件组丢失问题 RRS feed

  • 问题

  • 一个数据库里有多个文件组, 其中一个组的文件被删了(这个组就只有一个表的数据),或者是说文件组所在的磁盘坏了,
    现不想要这个表了,只要能启动这个数据库,能用其它的表, 怎么做,只要能使用其它的表都行, 谢谢,
    而且没有任何的备份.


     能否像ORACLE里的 让tablespaces, online OFF,再删除那张表和表空间呢?
    2009年11月2日 6:56

答案

  • 删除损坏的文件组,再ONLINE Database
    很多东西<如结构或步骤过程>是一样的,只是语法有区别

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2009年11月2日 9:53
  • 将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;
    
    2009年11月3日 5:03

全部回复

  • 如果是2005或以上的数据库,可以只恢复主文件组就使数据库online了,你可以在备份的时候只备份好的文件组,或者恢复的时候不恢复坏的文件组。
    2009年11月2日 7:28
    版主
  • 根本无法还原,连还原都是不可用的.

    2009年11月2日 7:51
  • 你现在是什么情况?sqlserver无法启动了?
    有dba的职位吗
    2009年11月2日 8:30
    版主
  • 现在是什么样的状态?有没有以前可用的备份?数据库什么版本?
    2009年11月2日 8:51
    版主
  • 上面说了, 没有任何备份, (模似故障)
    损坏的,文件组,里面只有一个表的数据, 打算不要了, 只想要除这个表以外的所有的表.

    版本,SQL2005 SP2, WINDOWS 2003 SP2 ,
    数据库可以启动,
    但是只是无法打开损坏文件组所在的库.

    自己也可以模拟故障:
    1,停止SQL SERVER,
    2,把NDF文件改名,
    3,启动SQL SERVER,
    接着出现我们要解决的问题,
    想打开损坏的数据库,日志提示找不到被改名的物理文件,

    反正损坏了,不想这个文件了, 问题是如何打开这个有问题的库.

    2009年11月2日 9:01
  • 删除损坏的文件组,再ONLINE Database
    很多东西<如结构或步骤过程>是一样的,只是语法有区别

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2009年11月2日 9:53
  • 上面说了, 没有任何备份, (模似故障)
    损坏的,文件组,里面只有一个表的数据, 打算不要了, 只想要除这个表以外的所有的表.

    版本,SQL2005 SP2, WINDOWS 2003 SP2 ,
    数据库可以启动,
    但是只是无法打开损坏文件组所在的库.

    自己也可以模拟故障:
    1,停止SQL SERVER,
    2,把NDF文件改名,
    3,启动SQL SERVER,
    接着出现我们要解决的问题,
    想打开损坏的数据库,日志提示找不到被改名的物理文件,

    反正损坏了,不想这个文件了, 问题是如何打开这个有问题的库.

    Are you talking about file or file group? Can't do anything if primary file group is bad.
    2009年11月2日 18:04
  • 将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;
    
    2009年11月3日 5:03
  • 从示例可以看到, 第一次 ONLINE 会失败, 故障文件 OFFLINE 后, 第二次 ONLINE 成功
    并且能够成功访问 ONLINE 文件组中的表
    2009年11月3日 5:04