最近有人跟我提出一个看似很刁钻古怪的问题,问题是这样的:
假设事务A修改了一个数据块b,b变成脏数据块b,但是没有提交,又因为脏数据块写入磁盘不受事务提交的影响,所以现在的情况是这样的:
脏数据块b被写入磁盘,但是undo表空间保存的的b修改前的数据还没有写入磁盘
现在出现了实例崩溃
那么要恢复数据库实例的时候,就没有undo数据,试问,此时如何恢复数据库实例?
按照这个逻辑,的确会有发生这样的事情,为此我做了3个小时的资料寻找,终于给我找到一句可以粉碎这个问题的话了,这句话就是:
当触发DBWR之前,会先触发lgwr进程
看看,多么不堪一击的问题,脏数据写入磁盘需要触发DBWR进程,然后触发写日志进程,只要日志文件写入磁盘了,那么回滚段、脏数据自然也会在下次实例启动的时候前滚回来