CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

关于数据库完全备份的一点疑问,请指教。

楼主wangxl430(卡拉)2005-06-01 22:58:40 在 MS-SQL Server / 应用实例 提问

按照完全备份的说明:  
  完全数据库备份生成到数据库备份完成时刻数据库的一致影像。  
  SQL   Server在备份开始的时候记下日志序列号(LSN)。然后复制构成数据库的页。由于这是一个动态备份,因此可以在备份的同时改变数据。那么,怎样得到数据库的一致影像呢?很简单,当备份完所有页时,SQL   Server再次纪录LSN。然后它备份所纪录的第一个LSN和最后一个LSN之间的日志部分。然后将这个日志段添加到备份中。当恢复备份时,恢复页组,并采用这个日志段。当然,备份期间的改变越多,这个日志段就越大。这会影响备份和恢复的时间,因此一般在数据库活动比较少的时间进行备份。  
   
  疑问如下:  
  由于复制过程是动态进行的,为什么要采用从开始到最后所有的日志呢?会不会出现这样的情况:有些数据改变已经写入日志(并且假设事务已经提交),但未写数据库。有些数据改变已经写入日志(假设事务已经提交),同时也完全写入数据库了。例如从10:00备份到10:20,备份出来的数据有的页是10:00的状态,有的是10:05的状态,有的是10:10分的状态。而不是某一时刻(10:00)的状态。却为什么要采用从10:00到10:20全部的日志呢?难道对于某些页不重复吗?  
  以上疑问是基于对事务日志备份的理解:  
  事务日志备份是在存在某一时刻的完全备份的基础上,再采用从该时刻以后的事务日志。难道这和上面的说法不矛盾吗?  
  我们不考虑采用事务日志之前的完全备份是如何进行的,反正他是“某一时刻”数据库的状态,不是  
  “某一段时刻”的连续状态,在这两种情况下,都用“采用该段时间的”日志的做法,效果相同吗?  
  类似于下面的情况:  
  1、有10:00的完全备份,采用10:00-10:20的日志,恢复到10:20的状态。  
  2、有10:00-10:20动态的一个备份,也采用10:00-10:20的日志,也恢复到10:20的状态。  
   
  是否存在什么问题呢?  
  可能我描述得不是很清楚,我是新手,请原谅。  
  我学习过恢复时的原理,直到事务是怎么前滚、回滚的,知道检查点的作用。其他的不知道哪些和这里相关。  
   
  谢谢各位!  
  问题点数:50、回复次数:17Top

1 楼duanduan1122(俺村俺帅!!!)回复于 2005-06-01 23:46:49 得分 0

markTop

2 楼yesyesyes()回复于 2005-06-02 08:12:36 得分 0

恢复到完全备份结束的那一时刻的状态Top

3 楼qjt(秋虫)回复于 2005-06-02 11:31:34 得分 0

"事务日志备份是在存在某一时刻的完全备份的基础上,再采用从该时刻以后的事务日志。"  
  这句话有误。每次事务日志备份时,备份的是上次事务日志备份后到现在的日志记录。进行数据库备份(完全或差异)时,并未截断事务日志中不活动部分。详细内容可见SQL   Server联机帮助中的'备份,   事务日志'那里举了例子。  
  我不知道你的  
  “2、有10:00-10:20动态的一个备份,也采用10:00-10:20的日志,也恢复到10:20的状态。”  
  中动态备份是否指的是‘事务日志备份’。要想用事务日志进行时点恢复,应首先还原一个完整数据库备份,然后再还原从完整数据库备份后到时点恢复时连续的日志备份。  
   
  Top

4 楼wangxl430(卡拉)回复于 2005-06-02 22:03:10 得分 0

我的意思是这样的,举个例子,会不会出现这样的情况:  
  假设有500个页面,10:00从第一个页面开始备份。  
  有一个事务(10:10开始),他有一个修改语句,将某记录的a字段更改为1000,假设a字段原值为500。  
  假设该记录存储在数据库的第100个页面,当备份到该页面时如果时间为10:05,数据尚未  
  修改,也就是备份中a字段=500。  
  假设真个备份在10:20才结束。  
  在备份结束之前,上面那个事务将a字段改为1000了,并且正常提交。在日志和数据库都  
  正常写入了(某个检查点过程在事务提交后出现)。那么体现在日志中,该事务是非活动事务。  
  但是根据上面完全备份的说明,还会备份从10:00-10:20的所有日志,在恢复的时候应用日志  
  那么类似上面那个事务怎么处理呢?  
  从日志上看,他已经正常提交,并且是在检查点之前提交,应该不作任何处理。但实际上备份数  
  据中却是这个事务执行之前的数据。  
  不会出错吗?  
  在这里,完全备份究竟是怎样的一种机制,看了些资料,都说得很笼统,不太明白。  
  谢谢。  
  Top

5 楼yesyesyes()回复于 2005-06-03 07:57:20 得分 5

备份中包含那个已提交但尚未备份的事务日志(是附加在后面的)  
  还原到最后时,系统会检查这部分日志,自动前滚当时已提交成功的操作  
  所以和备份结束时的状态是一致的Top

6 楼duanduan1122(俺村俺帅!!!)回复于 2005-06-03 08:51:03 得分 0

应该是这样的:  
  1。备份全库的时候,假如是10:10到10:20  
  2。同时sql   server也会备份从10:10到10:20的日志  
  3。当还原的时候,全库首先还原  
  4。接着马上把10:10---10:20的日志也还原一遍  
  5。这样就保留了备份时候的数据的变化  
  6。这是sql   server最大的优点:动态备份Top

7 楼duanduan1122(俺村俺帅!!!)回复于 2005-06-03 08:58:22 得分 0

查到一点:  
  当数据库正在使用时,SQL   Server   使用一个联机备份过程来对数据库进行备份。下面的列表包括在数据库或事务日志备份时无法进行的操作:    
  1。  
  在备份操作时不允许进行文件管理操作,如带有   ADD   FILE   或   REMOVE   FILE   选项的   ALTER   DATABASE   语句,以及   INSERT、UPDATE   或   DELETE   语句。  
  2。  
  收缩数据库或文件。这包括自动收缩操作。    
  假如在这些操作正在进行时启动备份,备份将终止。假如正在进行备份时,试图进行这些操作,则操作会失败。  
  Top

8 楼duanduan1122(俺村俺帅!!!)回复于 2005-06-03 09:02:58 得分 10

1。这是从sql   server帮助丛书中的资料,应该没有问题的。  
  2。自己可以做一个试验。Top

9 楼qjt(秋虫)回复于 2005-06-03 12:00:43 得分 30

10:00开始备份,到10:20结束  
  那么10:00之前的数据库状态是完整记录了。  
  10:00到10:20数据库的修改被记录在了日志记录中,所以在完全备份时还要备份10:00到10:20的日志记录。  
  在恢复数据库时,先恢复数据库备份,可以确保的是10:00以前的数据库状态是被完全恢复了。再根据10:00到10:20的日志记录,对数据库REDO,那么数据库就可以完整恢复到10:20时的状态。  
  Top

10 楼wangxl430(卡拉)回复于 2005-06-04 21:12:19 得分 0

请问duanduan1122(我要做老大):  
  在备份操作时不允许....以及   INSERT、UPDATE   或   DELETE   语句。  
  这个是在哪里查到的?我的疑问正是这样的,如果不能进行insert、update、delete的话,  
  也就没问题了。但这也称不上动态备份了吧?  
   
  还有就是您所说的恢复时的处理方法,我是明白的。我的疑问是由于备份是一个过程,可能导致  
  两种情况,一种是上面我所说的,备份的是10:05的某页数据,但在10:10该页又发生了改变。备份中的数据是旧的。还原的时候应该前滚这个事务。另一种情况是10:10份改变了某页,在10:15备份到了该页,数据已经是最新的。还原的时候应该忽略这个事务。如果这两种情况事务的完成和提交都在最后的检查点之前的话,怎么处理呢?怎样判断事务的前滚?忽略?如果和“事务日志备份”采用同样的原理,应用整个日志的话,恐怕不行了吧?我的疑问就在这里。  
   
  谢谢!  
  Top

11 楼wangxl430(卡拉)回复于 2005-06-04 21:23:26 得分 0

对qjt(秋虫):  
   
  在恢复数据库时,先恢复数据库备份,可以确保的是10:00以前的数据库状态是被完全恢复了。  
   
  我就是对这个问题有看法,为什么恢复到的是10:00的数据库状态呢?  
  备份不是一个动态的过程吗?比如你备份开始的时候,第100页有一个数据是2000,当你备份到第100页时(例如花了10分钟),第5分钟有一个事务将第100页的那个2000改为5000了,那么备份中该数据就是5000,而不是开始时的2000,也就是和第一页是不同步的,可以说所有页都是不同步的。  
  不知我说得对不对。  
  这就是我有疑问的地方,既然是动态的备份过程,怎么又是可以先恢复到备份开始时的状态呢?  
  Top

12 楼yifan600(一剑飘雪)回复于 2005-06-05 10:13:39 得分 5

我觉的楼主兄弟有点太钻牛角尖了,任何备份软件或过程都不可能做到尽善尽美,如果在备份时还可以进行插入,删除,修改操作的话,怎么能0保证你的数据库中数据的完整性?Top

13 楼wangxl430(卡拉)回复于 2005-06-05 11:09:26 得分 0

楼上的兄弟,不是我钻牛角尖。  
  因为我看到各种书都说SQL   SERVER在备份的时候可以插入、删除、修改。  
  而且联机丛书也只说了不能进行以下操作:  
   
  在   Microsoft®   SQL   Server™   中,可以在数据库联机或在正在使用时执行备份操作。但是,在数据库备份操作中,不允许进行下列操作:    
   
  1、创建或删除数据库文件。  
  2、在数据库(自动或手工)或数据库文件上执行收缩操作时截断文件。如果备份正在运行,则此操作将失败。可以在备份完成后执行截断操作。有关更多信息,请参见收缩数据库。    
   
  如果在上述某个操作正在进行时开始备份,则备份将等待该操作完成,直到会话超时所设置的时间限制到期。如果在备份操作执行过程中试图执行上面任一操作,该操作将失败,而备份操作继续进行。  
   
  所以我才这样问的,如果确认不能插入、删除、修改的话,就没问题了。  
   
  您能找到相关的资料出处吗?  
   
  谢谢!  
   
  Top

14 楼qjt(秋虫)回复于 2005-06-05 12:04:08 得分 0

刚查了《SQL   Server高级管理与开发》电子工业出版社   159页中提到:  
      “SQL   Server备份是动态的,也就是说,当用户使用数据库时,备份也能进行,然而最好是在数据库没有进行大量修改时进行备份,因为备份过程可以使系统变慢”。  
          那么我理解,在数据库进行备份时,允许对数据库进行修改(包括insert、delete、update)。  
   
  “备份不是一个动态的过程吗?比如你备份开始的时候,第100页有一个数据是2000,当你备份到第100页时(例如花了10分钟),第5分钟有一个事务将第100页的那个2000改为5000了,那么备份中该数据就是5000,而不是开始时的2000,也就是和第一页是不同步的,可以说所有页都是不同步的。  
  不知我说得对不对。”  
        数据库备份完成时,第100页备份的是5000。但没有和第1页同不同步的说法。  
        在10:00时备份第1页,在10:10   第1页又被修改。因此存在10:20的数据库和他的备份存在不一致。但是数据库也同时备份了10:00到10:20的日志记录。  
        因此,在恢复数据库时先恢复数据库备份,但这时恢复的数据库还不是10:20的数据库,然后又将10:00到10:20的日志记录重新执行(前滚)。这样就把数据库恢复到了10:20的状态。  
     
      不知说清楚没有!!!  
  Top

15 楼wangxl430(卡拉)回复于 2005-06-05 16:56:17 得分 0

我对整个备份过程的原理是理解的,也就是qjt(秋虫)所说的,我也相信完全备份是备份完成时的状态,并且是通过备份过程中的日志来实现的。这个是大的原理。  
  我的疑问来自于备份过程的处理,也就是细节。  
  qjt(秋虫)朋友,帮我看看这种情况可不可能出现:  
  假设备份一共1000页,备份到100页时,第200页的某数据被事务T增加了500,并且T在备份到该页之前已经提交。那么在备份到第200页时,第200页的数据已经是T提交以后的。完成1000页后,添加备份过程中的日志记录。  
  在恢复时怎样处理呢?首先恢复数据,然后(注意这个然后)应用备份过程的日志。  
  那么在恢复数据阶段,第200页的数据已经是加了500的(也就是T完成后的)。  
  在应用日志阶段,难道还要前滚T吗?尽管T是已经提交的事务,但却不能前滚。  
  您所说的恢复过程是对所有已提交事务前滚。确实是这样吗?  
   
  如果不可能出现这样的情况,那么必然有其他机制在里面,我考虑的两种  
  1、备份数据(数据,不包括日志)不是单纯的拷贝,恢复时的第一阶段(恢复数据)也不是copy。  
  2、锁机制:在备份过程中,只允许修改、删除、插入已经备份过的数据页。这样就可以保证恢复的  
  时候前滚备份过程中的日志就可以了。  
   
  再次感谢各位朋友。  
   
  Top

16 楼qjt(秋虫)回复于 2005-06-05 17:22:24 得分 0

是的,在恢复时先恢复完全数据库备份,接着REDO在数据库备份期间提交的日志记录,即10:00到10:20期间的提交的日志记录。  
          日志记录格式是<T2,Xj,100,600>,意思是事务T2(举个例),对数据项Xj(第200页上的被修改的数据项)进行写操作,写操作前数据项Xj的值是100,写后值是600(加了500)。  
        在恢复数据库备份数据时,第200页的数据Xj已经是加了500的(即600)。然后在REDO(前滚)10:00到10:20期间的提交的日志记录时,再次把数据项Xj的值写为600,虽然在前滚之前它的值就是600。Top

17 楼wangxl430(卡拉)回复于 2005-06-05 21:12:48 得分 0

终于清楚了,谢谢qjt(秋虫)!  
   
  原来是我对日志的格式不清造成的困惑。不知道日志的格式,在这里瞎想,结果越想越糊涂。  
  看了您给出的答案,顿时豁然开朗。  
   
  再次感谢!Top

相关问题

  • 数据库备份?
  • 数据库备份
  • 数据库备份?
  • 数据库备份???
  • 备份数据库
  • 数据库备份
  • 数据库备份
  • 数据库备份
  • 数据库维护计划只能做完全备份吗?
  • □□□如何实现完全的数据库备份(100分)?

关键词

  • 数据库
  • 数据
  • 修改
  • 字段
  • 语句
  • 执行
  • 备份
  • 日志
  • 事务
  • 恢复

得分解答快速导航

  • 帖主:wangxl430
  • yesyesyes
  • duanduan1122
  • qjt
  • yifan600

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo