您的位置:首页 > 数据库

SQL Server数据库文件恢复技术

2011-03-16 10:54 363 查看
        SQL Server数据库备份有两种方式,一种是使用backup database将数据库文件备份,另一种就是直接拷贝数据库文件mdf和日志文件ldf的方式。下面将主要讨论一下后者的备份与恢复。

 

1、正常的备份、恢复方式  

        正常方式下备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。  

        卸下数据库的命令:Sp_detach_db   数据库名  

        连接数据库的命令:Sp_attach_db或者sp_attach_single_file_db  

        s_attach_db   [@dbname   =]   ′dbname′,   [@filename1   =]   ′filename_n′   [,...16]  

        sp_attach_single_file_db   [@dbname   =]   ′dbname′,   [@physname   =]   ′physical_name′  

        使用此方法可以正确恢复SQL Sever7.0和SQL Server 2000的数据库文件,要点是备份的时候一定要将mdf和ldf两个文件都备份下来,mdf文件是数据库数据文件,ldf是数据库日志文件。  

例子:  

假设数据库为test,其数据文件为test_data.mdf,日志文件为test_log.ldf。下面我们讨论一下如何备份、恢复该数据库。  

卸下数据库:sp_detach_db   'test '  

连接数据库:sp_attach_db   'test ', 'C:/Program   Files/Microsoft   SQL   Server/MSSQL/Data/test_data.mdf ', 'C:/Program   Files/Microsoft   SQL   Server/MSSQL/Data/test_log.ldf '  

sp_attach_single_file_db   'test ', 'C:/Program   Files/Microsoft   SQL   Server/MSSQL/Data/test_data.mdf '  

2、只有mdf文件的恢复技术   

        如果mdf文件是当前数据库产生的,那么也许使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,但是会出现类似下面的提示信息:   

        设备激活错误。物理文件名 'C:/Program Files/Microsoft SQL Server/MSSQL/data/test_Log.LDF '   可能有误。  

        已创建名为 'C:/Program Files/Microsoft SQL Server/MSSQL/Data/test_log.LDF '   的新日志文件。  

 

        如果数据库文件是从其他计算机上复制过来的,那么上述办法就行不通了。你也许会得到类似下面的错误信息:

        服务器:   消息   1813,级别   16,状态   2,行   1  

        未能打开新数据库   'test '。CREATE   DATABASE   将终止。  

        设备激活错误。物理文件名   'd:/test_log.LDF '   可能有误。  

 

        解决步骤如下:

        A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在企业管理器里面建立。  

        B.停掉数据库服务器。  

        C.将刚生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。  

        D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。  

        E.设置数据库允许直接操作系统表。此操作可以在企业管理器里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。   

             use   master   

             go  

             sp_configure   'allow   updates ',1  

             go  

             reconfigure   with   override  

             go  

        F.设置test为紧急修复模式  

             update   sysdatabases   set   status=-32768   where   dbid=DB_ID( 'test ')   

             此时该数据库处于“只读/置疑/脱机/紧急模式”可以看到数据库里面的系统表  

        G.下面执行真正的恢复操作,重建数据库日志文件   

             dbcc   rebuild_log( 'test ', 'C:/Program   Files/Microsoft   SQL   Server/MSSQL/Data/test_log.ldf ')  

 

             执行过程中,如果遇到下列提示信息:  

             服务器:   消息   5030,级别   16,状态   1,行   1  

             未能排它地锁定数据库以执行该操作。   

             DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。  

             说明您的其他程序正在使用该数据库,如果刚才您在F步骤中打开了test库的系统表,那么退出企业管理器就可以了。  

            

             正确执行完成的提示应该类似于:  

             警告:   数据库   'test '   的日志已重建。已失去事务的一致性。应运行   DBCC   CHECKDB   以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。此时打开在企业管理器里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。  

        H.验证数据库一致性(可省略)  

             dbcc   checkdb( 'test ')  

             一般执行结果如下:  

             CHECKDB   发现了   0   个分配错误和   0   个一致性错误(在数据库   'test '   中)。  

             DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。  

        I.设置数据库为正常状态   

            sp_dboption   'test ', 'dbo   use   only ', 'false '   

            如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。  

        J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在企业管理器里面恢复,也可以使用如下语句完成   

            sp_configure   'allow   updates ',0   

            go  

            reconfigure   with   override  

            go

 

        另外,还有可能遇到这样的报错信息:无法打开数据库。因为该数据库的版本(611)晚于当前服务器版本(539)。这个错误原因可能是因为数据库版本出现问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息