积极答复者
sql server 日志何时被写如磁盘?

问题
-
一个事务执行了如下步骤,然后系统崩溃,然后重启,做灾难恢复
Step1,begin transaction
Step2,update tableA set column1=2
Step3,checkpoint happened (this is last checkpoint before system crashed)
Step4,update tableA set column1=4
Step5,system crash happened1,请问上面的步骤中日志(Step2,Step4产生日志)何时会被写了磁盘?
比如说Step2,Step4都会产生日志,但是在系统崩溃的时候,是否它们都已经被写了磁盘,还是只是Step2的日志被写了磁盘?
我在MSDN上看到的解释说是日志在checkpoint 或者 commit的时候才会被刷入磁盘,但是我听另一个人说,checkpoint 并不意味着日志会被写了磁盘,是不是我的理解有误啊
"Write-Ahead Transaction Log"
http://msdn.microsoft.com/en-us/library/ms186259.aspx
"Checkpoints and the Active Portion of the Log "
http://msdn.microsoft.com/en-us/library/ms189573.aspx
2,在灾难恢复期间,对于未提交的事务,在对它做UNDO 前,是否一定要做REDO,为什么?
- 已编辑 Jacky_shen 2012年1月6日 10:06
答案
-
Possible, that's why sql has to do undo/redo before bring db online.
- 已标记为答案 Jacky_shen 2012年1月7日 3:05
- 取消答案标记 Jacky_shen 2012年1月7日 3:15
- 已标记为答案 Jacky_shen 2012年1月7日 3:27
-
虽然如楼上所说,是有可能的。但是一般地,log is certain percent full 很少发生,reaches recovery interval setting就是checkpoint。
另外,只是sql把数据写入磁盘控制器,由于磁盘一般自带cache,所以数据并不一定实际写入了磁盘。我平均每年会遇到一次磁盘控制器掉电或故障引起数据丢失的情况。
想不想时已是想,不如不想都不想。- 已标记为答案 Jacky_shen 2012年1月8日 5:08
全部回复
-
Hi rmiao,非常感谢,
1,你说的 changes will write to disk 指的是dirty pages被写入磁盘还是LOG被写入磁盘? 不过我在此处问的是LOG何时被写入磁盘,而不是dirty pages何时被写日磁盘。另外上面的Step1~Step4是在同一个transaction里的。
2,上面的Step1~Step4是在同一个transaction里的,既然这个事务在系统崩溃前的状态是 UNcommitted 的,为什么在灾难恢复的时候还需要对那个UNcommitted 的事务做REDO?直接UNDO掉它已经写入磁盘的dirty pages不就得拉?
- 已编辑 Jacky_shen 2012年1月6日 15:54
-
谢谢。
在系统崩溃前,Step4对应的那个操作(update tableA set column1=4)的日志有没有可能已经被写了磁盘了?虽然我知道那个日志被写入磁盘不是必须的,因为Step4操作对应的dirty pages还没有机会被写入磁盘,我只是想知道有没有这种可能性。
- 已编辑 Jacky_shen 2012年1月7日 2:52
-
Possible, that's why sql has to do undo/redo before bring db online.
- 已标记为答案 Jacky_shen 2012年1月7日 3:05
- 取消答案标记 Jacky_shen 2012年1月7日 3:15
- 已标记为答案 Jacky_shen 2012年1月7日 3:27
-
Possible, that's why sql has to do undo/redo before bring db online.
非常的感谢!这也说明了日志写入磁盘的时机并不完全基于checkpoint 跟 commit ,比如说你上面的提到的“refreshes log to disk when log is certain percent full or reaches recovery interval setting.”,也会写入日志到磁盘,是这样的吧?
- 已编辑 Jacky_shen 2012年2月16日 4:39
-
虽然如楼上所说,是有可能的。但是一般地,log is certain percent full 很少发生,reaches recovery interval setting就是checkpoint。
另外,只是sql把数据写入磁盘控制器,由于磁盘一般自带cache,所以数据并不一定实际写入了磁盘。我平均每年会遇到一次磁盘控制器掉电或故障引起数据丢失的情况。
想不想时已是想,不如不想都不想。- 已标记为答案 Jacky_shen 2012年1月8日 5:08
-
非常感谢两位,另外对于在system crash之前的uncommitted的事务在灾难恢复期间是否要一定做REDO操作的必要性,下面的帖子进行了一下讨论。
- 已编辑 Jacky_shen 2012年3月20日 6:02