在SQL 2008R2下,用数据库A完整备份了文件A.bak,现在想还原,在SQL的管理器上可以右键任务还原,然后输入一个新的数据库名ATemp,但是还原的源文件是用的A.bak。现在想用代码实现这个复用的过程。
  原来代码为:
  use master  
   alter database  A
   set offline WITH ROLLBACK IMMEDIATE    restore database ATemp
   from disk = 'E:\\Test\MSSQLBackup.bak'    with
    replace,
    recovery   ALTER DATABASE A
   SET ONLINE WITH ROLLBACK IMMEDIATE   然后报错:
   消息 1834,级别 16,状态 1,第 6 行
无法覆盖文件 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.ASYS2008\MSSQL\DATA\A.mdf'。数据库 'A' 正在使用该文件。
消息 3156,级别 16,状态 4,第 6 行
文件 'A' 无法还原为 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.ASYS2008\MSSQL\DATA\A.mdf'。请使用 WITH MOVE 选项来标识该文件的有效位置。
消息 1834,级别 16,状态 1,第 6 行
    然后使用move语句:
    use master
restore database ATempfrom disk = 'E:\\Test\MSSQLBackup.bak' 
with file = 1,
move 'A.mdf' to 'C:\Program Files\Microsoft SQL Server\N\ATemp.mdf',
move 'A.LDF' to 'C:\Program Files\Microsoft SQL Server\N\ATemp.LDF',
replace
  然后又报错
消息 3234,级别 16,状态 2,第 8 行
逻辑文件 'A.mdf' 不是数据库 'ATemp' 的一部分。请使用 RESTORE FILELISTONLY 来列出逻辑文件名。
消息 3013,级别 16,状态 1,第 8 行
RESTORE DATABASE 正在异常终止。
请问错在哪里了?要怎么实现?谢谢!

解决方案 »

  1.   


    SQL还原 1、验证备份 restore headeronly from bak3 
    restore filelistonly from bak3 with file=1 
    restore labelonly from bak3 
    restore verifyonly from bak3 
     
    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数据库中。
    参考资料
      

  2.   

    move 'A.mdf' to 'C:\Program Files\Microsoft SQL Server\N\ATemp.mdf',红色部分应该改用逻辑名
      

  3.   

    无法覆盖文件 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.ASYS2008\MSSQL\DATA\A.mdf'。数据库 'A' 正在使用该文件。
    消息 3156,级别 16,状态 4,第 6 行
    文件 'A' 无法还原为 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.ASYS2008\MSSQL\DATA\A.mdf'。请使用 WITH MOVE 选项来标识该文件的有效位置。
      

  4.   

    逻辑文件 'A.mdf' 不是数据库 'ATemp' 的一部分
      

  5.   

    SQL备份 
      

  6.   

    谢谢一楼提供的资料。请问szstephenzhou,逻辑名怎么弄?能简单的给点代码不?谢了!
      

  7.   

    请问 szstephenzhou ,逻辑名是不是在管理器中查看源文件,名称一栏,现在是 "A-完整 数据库 备份"  ,我用这个替换了红色标示部分,还是不行,这是什么情况?
      

  8.   

    请问 szstephenzhou ,逻辑名是不是在管理器中查看源文件,名称一栏,现在是 "A-完整 数据库 备份"  ,我用这个替换了红色标示部分,还是不行,这是什么情况?
      

  9.   

    你这样简单点用SQL的管理器上可以右键任务还原,然后设置需要恢复的数据库名以及需要转移的文件名以及其它选项,然后点击上面的转出脚本,这样给出的脚本就是最标准的
      

  10.   

    谢谢 Haiwer!着急着实现,两次回复错你的名字,实在是不好意思!很感谢!