2、从备份中还原
-------------------------------------------------------------------------
restore headeronly from bak1
restore database d1 from bak1 with file=2         --从完全备份中恢复
----------------------------------------------------------------------
restore headeronly from bak2              --从差异备份中恢复
restore database d2 from bak2 with file=1,norecovery    
restore database d2 from bak2 with file=5,recovery
----------------------------------------------------------------------
restore headeronly from bak3              --从日志备份中恢复
restore database d3 from bak3 with file=1,norecovery
restore log    d3 from bak3 with file=2,norecovery
restore log    d3 from bak3 with file=3,norecovery
restore log    d3 from bak3 with file=4,norecovery
restore log    d3 from bak3 with file=5,recovery
----------------------------------------------------------------------
restore database d3 from bak3 with file=1,norecovery      --恢复到指定时间
restore log    d3 from bak3 with file=2,norecovery
restore log    d3 from bak3 with file=3,norecovery
restore log    d3 from bak3 with file=4,recovery,stopat='2003-08-15 11:29:00.000'
----------------------------------------------------------------------
restore database d5 filegroup='FG2' from bak5 with file=4,norecovery --还原文件组备份
restore log d5 from bak5 with file=5,norecovery
restore log d5 from bak5 with file=7,recovery
----------------------------------------------------------------------
restore headeronly from bak6                 --还原文件备份
restore database d5 file='d5_data3' from bak6 with file=6,norecovery
restore log d5 from bak6 with file=7,norecovery
restore log d5 from bak6 with file=9,recovery
----------------------------------------------------------------------
restore database d5 from bak6 with replace    --删除现有数据库,从备份中重建数据库
----------------------------------------------------------------------
create database d6            --move to将数据库文件移动到新位置
on primary
(name=d6_data,
filename='E:\Program Files\Microsoft SQL Server\MSSQL\data\d6_Data.MDF',
size=2MB)
log on
(name=d6_log,
filename='E:\Program Files\Microsoft SQL Server\MSSQL\data\d6_log.ldf',
size=2MB)
go
backupdatabase d6 to bak6 with init
drop database d6
restore database d6 from bak6
with move 'd6_data' to 'e:\data\d6\d6_data.mdf',
move 'd6_log'to 'e:\data\d6\d6_log.ldf'
sp_helpdb d6
----------------------------------------------------------------------
3、分离与重连接数据库
--------------------------------------
sp_detach_db 'd6'         
sp_attach_db 'd6','e:\data\d6\d6_data.mdf','e:\data\d6\d6_log.ldf'
--------------------------------------
sp_detach_db d6
go
create database d6
on primary
(filename='e:\data\d6\d6_data.mdf')
for attach
go
----------------------------------------------------------------------
4、恢复损坏的系统数据库
----------------------------------------------------------------------
1)先备份MASTER、MSDB
2)停止SQL服务,将MASTER数据库文件删除或者重命名。这样,SQL服务将不能启动。
3)系统数据库的还原
-----------------------------------------------
(1)如果SQL服务还能启动,则从备份中恢复系统数据库。
(2)如果SQL服务不能启动,则需要重建系统数据库。
使用SQL文件夹TOOLS\BINN目录下的Rebuildm.exe重建master数据库。
(3)创建备份设备,指向以前的备份设备。
(4)以单用户模式启动SQL
cd programe files\microsoft sql server\mssql\binn
sqlservr.exe -c -m
(5)进查询分析器,从备份中恢复master数据库。
restore database master from masterbak
restore database msdb from disk='e:\bak\msdb.bak'
MASTER还原后,SQL中用户数据库的信息也会恢复。
(6)如果MASTER没有备份,则需要用sp_attach_db命令将用户数据库附加到新的MASTER数据库中。

解决方案 »

  1.   

    直接拷贝MDF,LDF文件到另外一个服务器,然后附加.
    附加可使用企业管理器中的菜单,也可用如下的语句.示例
    下面的示例将 pubs 中的两个文件附加到当前服务器。EXEC sp_attach_db @dbname = N'pubs', 
       @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', 
       @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'另:使用DBCC CHECKDB
    检查指定数据库中的所有对象的分配和结构完整性。语法
    DBCC CHECKDB
        ( 'database_name'
                [ , NOINDEX
                    | { REPAIR_ALLOW_DATA_LOSS
                        | REPAIR_FAST
                        | REPAIR_REBUILD
                        } ] 
        )    [ WITH { [ ALL_ERRORMSGS ]
                        [ , [ NO_INFOMSGS ] ]
                        [ , [ TABLOCK ] ]
                        [ , [ ESTIMATEONLY ] ]
                        [ , [ PHYSICAL_ONLY ] ] 
                        } 
            ] 参数
    'database_name'是要对其中的所有对象分配和结构完整性进行检查的数据库。如果未指定,则默认为当前数据库。数据库名称必须符合标识符的规则。有关更多信息,请参见使用标识符。 NOINDEX指定不检查非系统表的非聚集索引。NOINDEX 减少执行总时间,因为它不对用户定义的表的非聚集索引进行检查。NOINDEX 对系统表没有影响,因为 DBCC CHECKDB 总是对所有系统表索引进行检查。REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD指定 DBCC CHECKDB 修复发现的错误。给定的 database_name 必须在单用户模式下以使用修复选项,它可以是下列值之一。值 描述 
    REPAIR_ALLOW_DATA_LOSS 执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。 
    REPAIR_FAST 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。 
    REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。 
    WITH指定有关下列内容的选项:返回错误信息的数量、获得的锁或估计的 tempdb 要求。ALL_ERRORMSGS显示每个对象不受限制的错误数。如果没有指定 ALL_ERRORMSGS,每个对象至多显示 200 个错误信息。按对象 ID 对错误信息进行排序(从 tempdb 中生成的消息除外)。NO_INFOMSGS禁止显示所有信息性消息(严重级别 10)和关于所用空间的报告。 TABLOCK导致 DBCC CHECKDB 获得共享表锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。ESTIMATE ONLY显示估计的 tempdb 空间大小,要运行带有所有其它指定选项的 DBCC CHECKDB 则需要该空间。不执行该检查。PHYSICAL_ONLY仅限于检查页和记录标题物理结构的完整性,以及页对象 ID 和索引 ID 与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性,同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGS,并且不能与任何修复选项一起使用。注释
    DBCC CHECKDB 对索引视图执行物理一致性检查。只用于向后兼容的 NOINDEX 选项也适用于索引视图上的任何辅助索引。DBCC CHECKDB 是最安全的修复语句,因为它对最多的可能出现的各种错误进行标识和修复。如果只报告数据库中有分配错误,请执行带修复选项的 DBCC CHECKALLOC 以对这些错误进行修复。然而,若要确保正确修复所有错误(包括分配错误),请执行带修复选项的 DBCC CHECKDB,而不要执行带修复选项的 DBCC CHECKALLOC。DBCC CHECKDB 对数据库中所有内容的完整性进行验证。如果当前正在执行或最近已执行 DBCC CHECKDB,则不需要运行 DBCC CHECKALLOC 或 DBCC CHECKTABLE。DBCC CHECKDB 执行同样的检查,仿佛是对数据库中的每个表执行 DBCC CHECKALLOC 语句和 DBCC CHECKTABLE 语句。默认情况下,DBCC CHECKDB 不获取表锁。但它获取架构锁,该锁防止对元数据进行更改,但允许更改数据。获取的架构锁将防止用户得到排它表锁,在生成聚集索引、除去任何索引或截断表时需要排它表锁。 DBCC 语句收集信息,然后扫描日志以查找所做的任何其它更改,并在扫描的结尾将两组信息合并在一起以产生数据的一致视图。 如果指定 TABLOCK 选项,DBCC CHECKDB 将获取共享表锁。这样可允许某些类别的错误有更详细的错误信息,并通过避免使用事务日志数据而将所要求的 tempdb 空间大小降为最低。TABLOCK 选项不阻止日志截断并使命令可以更快地运行。DBCC CHECKDB 对数据库中每个表的 text、ntext 和 image 页的链接和大小及数据库中所有页的分配进行检查。对于数据库中每个表,DBCC CHECKDB 检查其: 索引和数据页是否已正确链接。
    索引是否按照正确的顺序排列。
    各指针是否一致。
    每页上的数据是否均合理。
    页面偏移量是否合理。 
    错误表示数据库中的潜在问题,应该立即改正。默认情况下,DBCC CHECKDB 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。使用 sp_configure 系统存储过程限制可用于 DBCC 检查的最大处理器数。有关更多信息,请参见 max degree of parallelism 选项。使用跟踪标记 2528 可禁用并行检查。有关更多信息,请参见跟踪标记。结果集
    不管是否指定任何选项(NO_INFOMSGS 或 NOINDEX 选项除外),如果未指定数据库,DBCC CHECKDB 返回当前数据库的以下结果集(值可能会变化):DBCC results for 'master'.
    DBCC results for 'sysobjects'.
    There are 862 rows in 13 pages for object 'sysobjects'.
    DBCC results for 'sysindexes'.
    There are 80 rows in 3 pages for object 'sysindexes'.
    '...'
    DBCC results for 'spt_provider_types'.
    There are 23 rows in 1 pages for object 'spt_provider_types'.
    CHECKDB found 0 allocation errors and 0 consistency errors in database 'master'.
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.如果指定 NO_INFOMSGS 选项,DBCC CHECKDB 将返回以下结果集(消息):The command(s) completed successfully.如果指定 ESTIMATEONLY 选项,DBCC CHECKDB 将返回以下结果集。Estimated TEMPDB space needed for CHECKALLOC (KB) 
    ------------------------------------------------- 
    13(1 row(s) affected)Estimated TEMPDB space needed for CHECKTABLES (KB) 
    -------------------------------------------------- 
    57(1 row(s) affected)DBCC execution completed. If DBCC printed error messages, contact your system administrator.权限
    DBCC CHECKDB 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。示例
    A. 检查当前数据库和 pubs 数据库
    下例对当前数据库和 pubs 数据库执行 DBCC CHECKDB。-- Check the current database.
    DBCC CHECKDB
    GO
    -- Check the pubs database without nonclustered indexes.
    DBCC CHECKDB ('pubs', NOINDEX)
    GOB. 检查当前数据库,禁止显示信息性消息
    下例检查当前数据库,并禁止显示所有信息性消息。DBCC CHECKDB WITH NO_INFOMSGS
    GO
      

  2.   

    ,好,我也响应一下二楼,这是一个vbs脚本,是我早期的,屡试不爽:
    ' VBScript source code
    'Programmed by Forest,Hichina,2004
    'This program is used to restore SQLServer database automatically.
    'Usage:cscript DbRestore.vbs OldUsrName Bakfilename NewUsrName Password
    'Example:cscript DbRestore.vbs cw01001 cw01001_db_bka cw03002 x2d3d4s4'备份文件就在用户根目录下
    '还需要加入杀死当前进程的过程Set oArgs=wscript.arguments
    CRLF = Chr(13) & Chr(10)  If oArgs.Count <>4 Then
          ReadMe="=============================================================================" & CRLF
          ReadMe=ReadMe & "This program is used to restore SQLServer database automatically." & CRLF
          ReadMe=ReadMe & "Usage:cscript DbRestore.vbs OldUsrName Bakfilename NewUsrName Password" & CRLF
          ReadMe=ReadMe & "Example:cscript DbRestore.vbs cw01001 cw01001_db_bka cw03002 x2d3d4s4" & CRLF
          ReadMe=ReadMe & "=============================================================================" & CRLF
          ReadMe=ReadMe & "Programmed by Forest,Hichina,2004" & CRLF
          
          Wscript.Echo ReadMe
          WScript.Quit(1)     
        Else
          OldUsrName=oArgs.item(0)
          Bakfilename=oArgs.item(1)
          NewUsrName = oArgs.item(2)
          'Password= oArgs.item(3)
        End If
    '服务器用户数据根目录
    BakRoot="e:\RestoreDB"
    'SQLServer安装根目录
    SQLDataRoot="E:\sqldata"DbName=NewUsrName & "_db"
    LogName = DbName & "_log"
    LogPath = "E:\sqllog\" & LogName & ".ldf"
    DataPath = SQLDataRoot & "\"  & DbName & "_Data" & ".mdf"
    BakFile = BakRoot & "\" & Bakfilename
    Login = NewUsrName
    '检查指定的备份文件是否存在
    Set objFso = CreateObject("Scripting.FileSystemObject")
    If Not objFso.FileExists(BakFile) Then
       Wscript.Echo "Error    BakFile: " & BakFile & " not found."
       WScript.Quit(1)
    End If    Dim conn,rs,sqlstr
        dim BackString,renameData,renameLog
        Set conn = CreateObject("ADODB.Connection")
        conn.connectionstring ="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=localhost;Initial Catalog=master" '& DbName
        'conn.connectionstring = "PROVIDER=sqloledb;DRIVER={SQL Server};SERVER=(local);Integrated   Security=SSPI;Initial   Catalog=" & DbName
        conn.Open       GetIDsql= "select   spid=cast(spid   as   varchar(20))   from   master..sysprocesses   where   dbid=db_id('"& NewUsrName &"') "  
           set id=conn.Execute(GetIDsql)
           if not id.eof then
           killSql=" kill "& id(0).Value
           conn.Execute(GetIDsql)
           end if
        
        BackString="RESTORE DATABASE ["& DbName &"] FROM  DISK = N'"& BakFile &"' WITH  FILE = 1, MOVE N'"& OldUsrName &"_db_data ' TO N'"& DataPath &"',  MOVE N'"& OldUsrName &"_db_log' TO N'"& LogPath &"', NOUNLOAD,  REPLACE,  STATS = 10"
        renameData="ALTER DATABASE ["& DbName &"] MODIFY FILE (NAME=N'"& OldUsrName &"_db_Data', NEWNAME=N'"& DbName &"_Data')"
        renameLog="ALTER DATABASE ["& DbName &"] MODIFY FILE (NAME=N'"& OldUsrName &"_db_log', NEWNAME=N'"& DbName &"_log')" 
             
            '回复数据库信息
            conn.Execute(BackString)
           '将文件名改为当前的数据库名称相关
           conn.Execute(renameData)       conn.Execute(renamelog)
    conn.close
           conn.connectionstring ="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=localhost;Initial Catalog=" & DbName
    conn.Open
           
           '取得shema和数据对象信息
            sqlstr="select ob.name,sch.name from sys.all_objects ob ,sys.schemas sch where ob.schema_id=sch.schema_id and ob.is_ms_shipped=0 and sch.name='"& OldUsrName &"' and type  in ('P','U','V')" 
    set rs=conn.Execute(sqlstr)
         
        '循环变更权限 
        while not rs.eof
             sqlstr="ALTER SCHEMA dbo TRANSFER " & rs(1).Value & "." &   rs(0).Value 
            conn.Execute (sqlstr)
           rs.movenext
        wend
        
       conn.Execute("drop schema " & OldUsrName )
       conn.Execute("drop user " & OldUsrName)
       conn.Execute("EXEC dbo.sp_changedbowner @loginame = N'" + NewUsrName + "', @map = false")    
     
        Set rs = nothing
        conn.close
        Set conn = nothing
        
        
       Set objHTTP = CreateObject("Microsoft.XMLHTTP")
       objHTTP.open "POST", "http://" & GetComputerName & ".hichina.com:887/dbadmin.asp", False 
      ' objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
       objHTTP.send "action=restoretrans&db=" & DbName
       res=bytes2BSTR(objHTTP.responsebody)
       if res="200:ok" then 
    wscript.echo "1"
       else
           wscript.echo res
       end if
       Set objHTTP = Nothing    
       
       
       Function GetComputerName
    Set objShell = CreateObject("Wscript.Shell")
    GetComputerName = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
    Set objShell = Nothing
    End Function         
    Function bytes2BSTR(vIn)
      strReturn = ""
      For i = 1 To LenB(vIn)
          ThisCharCode = AscB(MidB(vIn,i,1))
          If ThisCharCode < &H80 Then
              strReturn = strReturn & Chr(ThisCharCode)
          Else
              NextCharCode = AscB(MidB(vIn,i+1,1))
              strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
              i = i + 1
          End If
      Next
      bytes2BSTR = strReturn
    End Function
      

  3.   

    一个比较简单的方法,先在所有任务中选择压缩数据库,然后将.mdf和.ldf文件拷贝到另一个地方,附加就可以了!
    注意把数据库模式改为"简单",自动压缩选上,一般在一千万数据内不会有几十G那么大