关于数据库完全备份的一点疑问,请指教。
按照完全备份的说明:
完全数据库备份生成到数据库备份完成时刻数据库的一致影像。
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




