IT分销/经销数据库recovery

来讨论一个recovery的问题

一般我们都知道,当数据库在线的时候所作的OS级别的文件系统备份是不能够用来恢复数据库的,现在俺的问题就是:WHY?

理论上来讲,如果文件系统级别的备份能够前滚到某一个特定时间点保证文件系统级别的一致性,当activate数据库的时候crash recovery不是理论上也应该能够recover么?
从文件系统的备份恢复到某一时间点与操作系统断电产生的crash有什么本质的不同,从而使得文件系统备份不能被用来恢复数据库呢?

看看大家有谁能一语道破天机:lol
参与25

25同行回答

zllhczllhc项目经理王强
学习一下!显示全部
学习一下!收起
互联网服务 · 2010-04-07
浏览785
mdkiimdkii软件开发工程师bocn
我的想法是这样的:对于数据库来讲,写操作最终应该是通过write()这样的系统调用进行的,在数据库的一次完整性的写,应该是有多个write()操作,而对操作系统来讲,它每收到一次write系统调用的请求,它就会向存储发送一次写命令,而存储也就会执行一次写操作(这里假设没有使用raw device,...显示全部
我的想法是这样的:

对于数据库来讲,写操作最终应该是通过write()这样的系统调用进行的,在数据库的一次
完整性的写,应该是有多个write()操作,而对操作系统来讲,它每收到一次write系统调用的请求,
它就会向存储发送一次写命令,而存储也就会执行一次写操作(这里假设没有使用raw device,如果用file,可能
先写在file cache里,然后再定期sync到disk上),
所以说数据库的写完整性是只能由数据库来保证,存储是不会保证的,
假设一次数据库写操作需要调用10次write() 系统调用,当调用到第五次时,
server crash了,我认为前五次的写操作应该已经apply到disk上了,存储
应该不会知道这只是数据库一次写请求的一部分。
但是存储能保证这5次写请求能够按照原顺序写入,这个应该没有问题。

当然,很有可能数据库不是简单通过write()来实现的,我记得在unix里有聚集写(writev)这样的系统调用,
可以一次写多个非连续缓存。

数据库是个非常复杂的系统,可能还有其他一些技术能保证写完整性,仅凭我的这点水平,
其实还远不足以解释这么深入的问题,这块还需要wang给我们多多指点,
让我们能够更深入的了解数据库的底层机制。收起
银行 · 2009-10-10
浏览758
wangzhonnewwangzhonnew软件工程师IBM Canada Ltd.
are you talking about this part "这个不同于server crash。在server crash得时候,如果一个写请求已经完整地发送到SAN,那么SAN肯定会把完整的数据写进去。如果请求发送到一半数据库server就down了,那么这个tcpip得连接就会中断而SAN也不会去写那个发送到一半的请求。所以...显示全部
are you talking about this part "这个不同于server crash。在server crash得时候,如果一个写请求已经完整地发送到SAN,那么SAN肯定会把完整的数据写进去。如果请求发送到一半数据库server就down了,那么这个tcpip得连接就会中断而SAN也不会去写那个发送到一半的请求。所以对于server crash来说,crash recovery是可以保证数据库页级别的一致性的……但是如果SAN断电了,那就自求多福吧……"?

can you elaborate more of your point? i can't fully understand what exact point you were talking about收起
IT分销/经销 · 2009-09-30
浏览777
mdkiimdkii软件开发工程师bocn
原帖由 wangzhonnew 于 2008-11-14 23:58 发表 ...... cmon guys, there's even haven't been an answer to the question :lol anyway let me post MY answer here, other people may have different opinion and any comments are welcome根据俺的理解,point- ... 老帖...显示全部
原帖由 wangzhonnew 于 2008-11-14 23:58 发表


...... cmon guys, there's even haven't been an answer to the question :lol

anyway let me post MY answer here, other people may have different opinion and any comments are welcome

根据俺的理解,point- ...

老帖被翻出来了,
不过感觉王的第二点理解有点不对啊,照这么说,如果是数据库建在local disk上就不能crash recovery了?
存储好像是不会保证数据库的写完整性的,只能保证写顺序是正确的。。。收起
银行 · 2009-09-27
浏览725
foryulingforyuling系统架构师skyon
好帖收起
互联网服务 · 2009-09-27
浏览739
恩,有见解显示全部
恩,有见解收起
2009-09-27
浏览685
weizeyanweizeyan系统架构师neusoft
我觉得是在对数据库一致性的控制上。显示全部
我觉得是在对数据库一致性的控制上。收起
硬件生产 · 2008-11-22
浏览686
jayciededejayciedede技术经理安图特(北京)科技有限公司
高手的理解,学习了显示全部
高手的理解,学习了收起
互联网服务 · 2008-11-15
浏览738
wangzhonnewwangzhonnew软件工程师IBM Canada Ltd.
...... cmon guys, there's even haven't been an answer to the question :lol anyway let me post MY answer here, other people may have different opinion and any comments are welcome根据俺的理解,point-in-time得FS image有一个很大的问题,也就是它可以在文件系...显示全部
...... cmon guys, there's even haven't been an answer to the question :lol

anyway let me post MY answer here, other people may have different opinion and any comments are welcome

根据俺的理解,point-in-time得FS image有一个很大的问题,也就是它可以在文件系统的页级别保证一致性,但是无法保证数据库的页级别一致性。
一个数据库的data page可以是4k,8k,16k,32k得,但是文件系统的页大小基本都是4k得。也就是在某一个point-in-time,有可能一个数据库的页只有一部分被刷新到磁盘上(比如只是前两个4k页),然后FS得consistency-group就会在文件系统级别一致,但是在数据库级别不一致……而且这种东西不能用crash recovery来恢复,因为从数据库页的header看来该页已经被写入了,但是实际上真实写入的只有前面的几个page……

这个不同于server crash。在server crash得时候,如果一个写请求已经完整地发送到SAN,那么SAN肯定会把完整的数据写进去。如果请求发送到一半数据库server就down了,那么这个tcpip得连接就会中断而SAN也不会去写那个发送到一半的请求。所以对于server crash来说,crash recovery是可以保证数据库页级别的一致性的……但是如果SAN断电了,那就自求多福吧……

这个是俺的理解,不知道有没有什么地方不大妥当,欢迎指出收起
IT分销/经销 · 2008-11-14
浏览791
jayciededejayciedede技术经理安图特(北京)科技有限公司
是的,所以oracle里用rman备份时,也是把控制文件做个快照,这样备份时就使用这个快照控制文件,以防止在备份时前后的SCN不一致显示全部
是的,所以oracle里用rman备份时,也是把控制文件做个快照,这样备份时就使用这个快照控制文件,以防止在备份时前后的SCN不一致收起
互联网服务 · 2008-11-14
浏览728

提问者

wangzhonnew
软件工程师IBM Canada Ltd.
擅长领域: 数据库

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2008-11-08
  • 关注会员:0 人
  • 问题浏览:29310
  • 最近回答:2010-04-07
  • X社区推广