关于SQL SERVER 2008 R2的事务日志的疑问,看了很多,还是众说纷纭~~

youthdating 2013-02-18 04:26:02
版本:SQL Server 2008 R2
问题:
一、完全恢复模式下,在不同备份情况时,是否截断了日志?
1、完全备份时
2、差异备份时
3、事务日志备份时
二、截断日志后,
1、在不改变完全恢复模式情况下,进行收缩,日志文件大小是不发生改变的,此时,日志文件内的日志是否删除了?
2、改变完全恢复模式为简单模式,然后再从简单模式改为完全模式,没有进行收缩操作,此时,日志文件内的日志发生了变化没?
3、改变完全恢复模式为简单模式,进行收缩,然后再改为完全模式,此是比较明确的,日志没有了,被删除了。
三、截断日志的理解。
如果日志a1部分被截断了,然后又产生了a2部分日志,那a1和a2部分的日志是连续的吗?在备份事务日志的时候,是两部分日志都备份吗?如果都备份,那在做时点还原时,可以还原到该两部分日志的任何时刻吗?

谢谢指点。
...全文
572 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyong109 2013-09-26
  • 打赏
  • 举报
回复
好东西啊,学习了。
youthdating 2013-02-19
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
引用 16 楼 youthdating 的回复:引用 13 楼 DBA_Huangzj 的回复:引用 11 楼 youthdating 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 youthdating 的回复:引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备……
非常感谢你的回复,很清晰明了。 最后一个问题: 备份如此做: 全备1,日志备2,日志备3,差异备4,日志备5... 那么在日志备5后发生灾难,我要恢复,是否可以看成有两种办法: 1、1+2+3+5 2、1+4+5 我在MSDN上看到这样说明:http://technet.microsoft.com/zh-cn/library/ms177446(v=sql.105).aspx 备份必须按照其创建顺序进行还原。在还原特定的事务日志备份之前,必须先还原下列以前备份,而不回滚未提交的事务,即 WITH NORECOVERY: 在特定事务日志备份之前执行的完整数据库备份上次差异备份(如果有)。 在完整数据库备份之后执行的所有事务日志备份或在特定事务日志备份之前执行的差异备份(如果您还原了差异备份)。 这个说明如何解读?是否意思是差异数据库备份需要按顺序还原?谢谢。
發糞塗牆 2013-02-19
  • 打赏
  • 举报
回复
引用 16 楼 youthdating 的回复:
引用 13 楼 DBA_Huangzj 的回复:引用 11 楼 youthdating 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 youthdating 的回复:引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不……
这是联机丛书上的原话,看我红字标出的地方: 如果从来没有从事务日志中删除过日志记录,日志记录将会逐渐填满供物理日志文件使用的所有磁盘空间。日志截断可自动释放逻辑日志中的空间以供事务日志重新使用。 除非由于某些原因导致延迟,日志截断将按照以下方式自动发生: 简单恢复模式下,在检查点之后发生。 完整恢复模式或大容量日志恢复模式下,在日志备份之后发生(如果自上次备份后出现检查点)。有关详细信息,请参阅本主题后面的“完整恢复模式和大容量日志恢复模式下的日志截断”部分。 对于你17楼的问题:如果只有两周,那么还原不了之前的“任意时刻”,之后的可以。如果你有这样的担心,你最好每天做一次完整备份,并保留足够长的时间。其实学校的业务系统没那么严格,所以没必要每次都还原到任意时间。如果做了日志备份,那么你从日志中只能看到截断后剩余的事务,你可以理解为对数据库的操作。其实对数据库的操作,都是先写入日志,再写入数据文件,所以那些随便就叫人删掉ldf再重建的人,是非常不负责任的。非到万不得已不要这样做。如果不做日志备份,那么理论上日志中会存放着所有自上一次完整备份以后,所有对SQLServer数据库的操作记录。直到下一次日志备份或者完整备份。另外说明,如果不做日志备份,那么只做完整备份,仅仅影响日志的lsn,也就是顺序链,不截断。 对于你18楼的问题:完整备份包括所有东西,它是磁盘上对应数据库文件的某一时刻点,所以物理页的复制。你可以理解为一个快照吧。如果你只还原周六的全备,那么周六全备那个操作完成之后的所有后续操作都会丢失。 睡觉了,有事明天再问
youthdating 2013-02-19
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
其实数据库不大的话,日志备份保留一段时间就可以了,一旦做了一次完整备份,那么以前的日志备份都可以不要了,我现在公司的策略是这样,你可以参考一下: 每天一次完整备份,每天中午12点一次差异备份,8点到23点每小时一次日志备份,全部备份文件保留两周。
突然还有一个问题,完全备份里面包含着日志文件没?比如周一备份了一个全备,然后中间几个日志备份,然后到周六一个全备。那么,我在后面的日子里面做还原,我只还原了周六的全备,我想问问,还原的数据库的日志中包含不包含周六正常运行时的事务日志?
youthdating 2013-02-19
  • 打赏
  • 举报
回复
引用 25 楼 DBA_Huangzj 的回复:
引用 23 楼 mayuanf 的回复:1.我非常肯定地说,只有日志备份会截断非活动日志(only by performing log backup can truncate inactive VLFs) 2.这都取决于是否存在unused space 3.既然截断日志的唯一前提是进行日志备份(完整模式下),也不存在第三个问题了。因为所有被截断的日志都是被备份……
非常感谢。
發糞塗牆 2013-02-19
  • 打赏
  • 举报
回复
引用 23 楼 mayuanf 的回复:
1.我非常肯定地说,只有日志备份会截断非活动日志(only by performing log backup can truncate inactive VLFs) 2.这都取决于是否存在unused space 3.既然截断日志的唯一前提是进行日志备份(完整模式下),也不存在第三个问题了。因为所有被截断的日志都是被备份过的,也当然是可以恢复的。非完整模式不支持point in tim……
大容量日志模式也支持,但是不是完全支持,对于大容量操作,是不记录到日志中(记录操作不记录数据)。 24楼:日志备份是记录上一次日志备份以后的日志,且差异备份不截断日志,所以可以用1+2+3+5
youthdating 2013-02-19
  • 打赏
  • 举报
回复
引用 21 楼 DBA_Huangzj 的回复:
差异、日志都是建立在完备的基础上,所以必须先还原完备,如果还原后还需要还原其他文件,那么完备的时候要带有WITH NORECOVERY,此时数据库会显式正在还原中。如果不需要还原其他文件,那不需要带有这个语句。还原了完备之后,也要按顺序还原,也就是你1+4+5,记得“除了最后一个备份文件外”的其他文件,还原时每一步,都需要使用WITH NORECOVERY。否则后面那个还……
谢谢,版主的解释还是很明确,切中我的问题。 那么如果其中的差异备份不慎损坏,那可以使用1+2+3+5吗?
mayuanf 2013-02-19
  • 打赏
  • 举报
回复
1.我非常肯定地说,只有日志备份会截断非活动日志(only by performing log backup can truncate inactive VLFs) 2.这都取决于是否存在unused space 3.既然截断日志的唯一前提是进行日志备份(完整模式下),也不存在第三个问题了。因为所有被截断的日志都是被备份过的,也当然是可以恢复的。非完整模式不支持point in time recovery.
rfq 2013-02-19
  • 打赏
  • 举报
回复
日志文件 实际是上是有好多的虚拟日志文件组成,他们有四种状态 活动,可恢复,可复用,未用 日志截断实际上就是把虚拟文件设置成可复用 如果不进行收缩 ,日志文件的大小是不发生变化的 ,如果收缩,就可以吧未用和可复用的空间收缩回来。 实际上 在做日志备份的时候 在出现灾难的时候 还有一段时间,这段时间你可以进行日记结尾备份(如果日志文件可以) 一般的语句是 backup log db to disk='备份设备' with no_truncate 这样 就可以利用 完全备份和完全备份后的所有日志备份进行恢复, 恢复的过程要用with norecovery 参数告诉数据库 还在还原中不要进行一致性恢复。
發糞塗牆 2013-02-19
  • 打赏
  • 举报
回复
差异、日志都是建立在完备的基础上,所以必须先还原完备,如果还原后还需要还原其他文件,那么完备的时候要带有WITH NORECOVERY,此时数据库会显式正在还原中。如果不需要还原其他文件,那不需要带有这个语句。还原了完备之后,也要按顺序还原,也就是你1+4+5,记得“除了最后一个备份文件外”的其他文件,还原时每一步,都需要使用WITH NORECOVERY。否则后面那个还原不了。至于1+2+3+5我还没试过这样还原,因为差异备份的重要作用就是减少还原所需的文件数,所以我一般都从完备直接到差异,然后再还原后续的文件。
youthdating 2013-02-18
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
其实数据库不大的话,日志备份保留一段时间就可以了,一旦做了一次完整备份,那么以前的日志备份都可以不要了,我现在公司的策略是这样,你可以参考一下: 每天一次完整备份,每天中午12点一次差异备份,8点到23点每小时一次日志备份,全部备份文件保留两周。
全部文件保留两周。那么如果出现此种情况呢: 我现在发现数据库中某个数据不对,我想还原到两周之前的某个时刻,是不是就有问题了?从这里引申出来一个问题,能不能查看备份日志中对于数据库的操作呢?
youthdating 2013-02-18
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
引用 11 楼 youthdating 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 youthdating 的回复:引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,……
版主,我在http://www.west263.com/info/html/wangluobiancheng/Mssql/20090512/118157.html上又看到,其还是说“你每进行一次完整恢复模式或大容量日志恢复模式的数据库备份,SQL Server就会截断一次事务日志。”
發糞塗牆 2013-02-18
  • 打赏
  • 举报
回复
其实数据库不大的话,日志备份保留一段时间就可以了,一旦做了一次完整备份,那么以前的日志备份都可以不要了,我现在公司的策略是这样,你可以参考一下: 每天一次完整备份,每天中午12点一次差异备份,8点到23点每小时一次日志备份,全部备份文件保留两周。
youthdating 2013-02-18
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
引用 11 楼 youthdating 的回复:引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 youthdating 的回复:引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,……
定期做的日志备份,是否要一直保存呢?
發糞塗牆 2013-02-18
  • 打赏
  • 举报
回复
引用 11 楼 youthdating 的回复:
引用 10 楼 DBA_Huangzj 的回复:引用 9 楼 youthdating 的回复:引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,你才有收缩的可能,你用DBCC SQLPERF(……
定期做日志备份是非常重要的。特别是对正式的数据库
mickers 2013-02-18
  • 打赏
  • 举报
回复
不懂,来学学
youthdating 2013-02-18
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
引用 9 楼 youthdating 的回复:引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,你才有收缩的可能,你用DBCC SQLPERF(LOGSPACE)命令,来看看已经用了多少,如果……
这个明白了。谢谢。 我这个是学校的业务系统。特点是业务量时段比较集中,每年大约有4个时段业务量比较大,其他时段只是查询,中间小部分操作。
發糞塗牆 2013-02-18
  • 打赏
  • 举报
回复
引用 9 楼 youthdating 的回复:
引用 8 楼 DBA_Huangzj 的回复: 提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,你才有收缩的可能,你用DBCC SQLPERF(LOGSPACE)命令,来看看已经用了多少,如果百分比很大,接近100,那代表没有可收缩的空间了 做了日志备份,也就是……
这句话是对的。所以不一定要收缩,特别对业务量比较频繁的系统,反而不好,因为收缩、增长严重消耗I/O。你收缩得很小,但是日志增长很快的时候,ldf又要自增长,这样反反复复还不如放着让它重用
youthdating 2013-02-18
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,你才有收缩的可能,你用DBCC SQLPERF(LOGSPACE)命令,来看看已经用了多少,如果百分比很大,接近100,那代表没有可收缩的空间了
做了日志备份,也就是说日志截断之后,那之前的日志空间就是可以重复利用的,不用收缩也是重复利用的,是吗?
發糞塗牆 2013-02-18
  • 打赏
  • 举报
回复
提交和未提交是SQLServer层面的东西,不是业务层面的。如果不收缩,但是做了日志备份(特别是定期做),那么理论上ldf文件的增长不会很明显,应为空间的确可以循环利用。只有有空间,你才有收缩的可能,你用DBCC SQLPERF(LOGSPACE)命令,来看看已经用了多少,如果百分比很大,接近100,那代表没有可收缩的空间了
加载更多回复(7)

34,597

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧