昨天问了大家完整,差异,日志备份的问题,然后以下代码是roy网友给的解答代码,就这个代码我有了以下疑问。
希望能得到大家的帮助解答。谢谢
为了查看方便,但凡有SQL格式的都是解答的代码。然后跟着红字部分是我的疑问。
(附:昨天的帖子:http://topic.csdn.net/u/20111031/16/748a6b63-d45f-4413-bb7c-e224d98976b9.html)
--创建测试
CREATE DATABASE db
GO--正常备份
BACKUP DATABASE db TO DISK='c:\1.bak' WITH FORMAT
BACKUP LOG db TO DISK='c:\2.bak' WITH FORMAT
BACKUP LOG db TO DISK='c:\3.bak' WITH FORMAT
BACKUP DATABASE db TO DISK='c:\4.bak' WITH FORMAT
BACKUP DATABASE db TO DISK='c:\5.bak' WITH FORMAT,DIFFERENTIAL
BACKUP LOG db TO DISK='c:\6.bak' WITH FORMAT
BACKUP LOG db TO DISK='c:\7.bak' WITH FORMAT  --我自己加了这个代码GO
Q0:这里面有个WITH FORMAT,查看了SQL的F1,只说是什么媒体头,还是不明白。请问FORMAT的意义和用途--下面是用于日志备份和差异备份还原中易犯的错误--1. 恢复时使用错误的日志顺序
IF DB_ID('db') IS NOT NULL DROP DATABASE db
RESTORE DATABASE db FROM DISK='c:\1.bak' WITH NORECOVERY
RESTORE LOG db FROM DISK='c:\3.bak'
/*--收到信息
服务器: 消息 4305,级别 16,状态 1,行 5
此备份集中的日志开始于 LSN 6000000002800001,该 LSN 太晚,无法应用到数据库。包含 LSN 6000000002500001 的较早的日志备份可以还原。
--*/
GO
Q1:这个3.BAK也不是差异备份,如果按照昨天的帖子里说的可以覆盖之前的log备份,那为何会出现这个错误呢?那岂不是还得把log备份全留着,然后回复的时候从老到新的顺序回复
Q2:如果以上面的backup代码为准,那么需要回复到这个数据库最新!的数据,请问我以下的恢复代码中的顺序和参数对吗?如果不对,那应该怎么写才是正确的
RESTORE DATABASE db FROM DISK='c:\4.bak' WITH NORECOVERY
RESTORE DATABASE db FROM DISK='c:\5.bak' WITH NORECOVERY
RESTORE LOG db FROM DISK='c:\6.bak' WITH NORECOVERY
RESTORE LOG db FROM DISK='c:\7.bak'
Q3:继续Q2,如果在恢复操作中因为不小心,只回复了database,忘记恢复log操作了
RESTORE DATABASE db FROM DISK='c:\4.bak' WITH NORECOVERY
RESTORE DATABASE db FROM DISK='c:\5.bak' 
然后这个时候应该如何补救6和7?是重新drop掉db,重新执行Q2的全部步骤?
Q4:昨天在进行这些测试的时候,总提示db正在使用,什么无排他权,所以我总之把绿色小箭头停止了再启动,很不方便,请问有什么比较方便的代码吗?问题有点多了,我还是抱着希望有高人,热心人,路人来热心解答的,不胜感激!

解决方案 »

  1.   

    这个最好是去看MSDNhttp://social.msdn.microsoft.com/Search/zh-cn?query=%E6%97%A5%E5%BF%97%E5%A4%87%E4%BB%BD
      

  2.   

    =roy媒体集,媒体标头的概念,如果想搞的清楚点,最好自己先找资料了解下备份文件结构,清楚概念,否则很难说清楚。
      

  3.   

    Q1:log备份不会包含上一个log备份的内容,所以恢复时,需要依次还原log备份
    Q2:恢复到最新:
    RESTORE DATABASE db FROM DISK='c:\4.bak' WITH NORECOVERY
    RESTORE LOG db FROM DISK='c:\6.bak' WITH NORECOVERY
    RESTORE LOG db FROM DISK='c:\7.bak'
    Q3:恢复到最新时,Restore 5.bak是没有必要的
    Q4:总提示db正在使用,什么无排他权,是因为你已经recovery了,此时,如果你想重新做还原测试,可以先删除该数据库。
      

  4.   

    通常,我们做全备时,后缀命一般为.bak,做差异备份时为.dif,做日志备份时为.trn
    这样容易区分,在操作时也容易判断。
      

  5.   

    回#7,
    我测试了下,的确是5是没必要的了。
    那可否这么说,如果策略是只做完整备份+log备份,那么都可以不用进行差异备份了?
      

  6.   

    建议你参考一下SQL SERVER 2005自带的帮助文档中“管理数据库引擎 > 备份和还原数据库 > ”中的内容,详细的介绍了各种模式下的备份,以及还原等概念与操作;
      

  7.   

    Q1:Format 等同於選中 init/skip,在差異備份時不加,備份內容等於完整備份
      

  8.   


    如果你能保证每个log都不丢失,也不怕麻烦逐个恢复,也可以不备差异。
    差异是最后一个全备之后的全部数据变化,它是可以覆盖之前log备份的,所以还原时,可以采用全备+差异+log备的方法。比如你的备份依次为:
    1.bak 2.trn 3.trn 4.dif 5.trn 6.trn
    你可以用1.bak+2.trn+3.trn+5.trn+6.trn
    也可以用1.bak+4.dif+5.trn+6.trn 当你有太多的trn时,用dif来还原时还是有一定写法上的优势的。而且它还能做为trn损坏的一个备份。
      

  9.   

    交叉還原 
    參照:13樓perfectaction方法理解