ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 数据库 >> SqlServer >> SQL Server DBA面试知识点(四)-- SQL Server事务日志和数据库备份

SQL Server DBA面试知识点(四)-- SQL Server事务日志和数据库备份

来源:网络整理     时间:2015-12-29     关键词:

本篇文章主要介绍了"SQL Server DBA面试知识点(四)-- SQL Server事务日志和数据库备份",主要涉及到方面的内容,对于SqlServer感兴趣的同学可以参考一下: Transaction log事务日志的作用要明白备份的相关知识,首先必须理解transaction log。事务日志是SQL Server最重要的文件,每个数...

Transaction log事务日志的作用

要明白备份的相关知识,首先必须理解transaction log。事务日志是SQL Server最重要的文件,每个数据库都有一个事务日志,用户记录用户对数据的所有修改(update&insert)操作都详细记录在事务日志中,另外还有一些schema修改操作,设置变化等等。记录详细到什么地步呢?当用户运行
insert into table values(…)这样的语句时,这条语句会被完整记录到事务日志中。其原因不难理解:当事务失败需要全部rollback时,SQL Server需要读取事务日志中的相关记录并逐条回滚。
另外SQL Server提供名为log shipping的解决方案,可以不间断的将主数据库同步到从数据库上。其实现方案就是将主数据库的事务日志通过网络不间断的传输到从数据库所在的服务器,并按照log中的数据修改记录redo所有操作。可见事务日志需要记录多么详细的信息,才能完全复制出一个一模一样的数据库。
从以上事务日志的作用可推断出,对于不改变数据的查询语句是不会被记录的。虽然如此,对于负载较重的数据库,事务日志可能会在短时间内就填满硬盘。最重要的文件无法工作必然导致数据库无法正常工作,此时数据库只可查询,所有修改操作都会被挂起(suspend)。
另外事务日志是供SQL Server内部使用而非给用户或管理者查询的,因此事务日志不可读。只有使用第三方工具才能将其内容转换为可读的。

Rollback and Rollforward 前滚和回滚

数据库的前滚和回滚是事务日志的另一个重要作用。当数据库正常运行时,总是有多个事务正在运行。当数据库shutdown时(正常或非正常关闭,主动或非主动关闭),总是有一些事务没有完成。
当数据库再次启动时,需要读取事务日志并对其中未完成的事务做以下两种操作:

  1. 回滚
    一些事务由于还没来得及commit,因此需要将事务回滚。
  2. 前滚
    另外一些事务已经commit了,但数据更改还没有持久化到硬盘上。此时需要根据事务日志将操作redo。

理解了transaction log的工作原理,下面我们论述事务日志对数据库备份的重大影响:
1,对事物日志的备份频率直接决定了可能的数据丢失程度。
2,数据库备份对事物日志文件的大小有重要影响。
3,使用备份文件恢复数据库时,可能需要事务日志来做前滚和回滚。

数据库备份

数据库备份的目的是当数据库失败时,可以利用备份文件将数据库恢复到某个精确的时间点,尽量减少数据丢失。
SQL Server提供三种类型的备份:全库备份full backup,增量备份differential backup和日志备份log backup。

  1. 全库备份full backup
    顾名思义,全库备份是对整个数据库的dump。数据文件被完全复制到备份文件里,以便将来从备份文件完全恢复。
    现在思考这样的场景:对一个数据库做全库备份,由于数据库很大,全库备份用了3小时才完成。
    全库备份开始后,SQL Server一一将数据文件中的内容拷贝到备份文件中,但在这3小时内,数据库不间断的继续为用户提供服务,因此数据又被用户做了多次修改。那么备份文件中包含的数据,到底是哪一个时间点数据库中的数据呢?
    显然不可能是全库备份开始时的数据。全库备份花费3小时才完成,因此前期就被写入备份文件的部分数据页面是备份开始时的内容,另一部分数据页面内容在备份开始后,被用户修改过了,且在备份后期才被写入备份文件。因此备份文件中的数据既包含部分开始时间点的数据,又包含部分备份快结束时的数据,是一个混乱的中间状态。由此引出全库备份的一个重要知识点:全库备份不仅仅会备份硬盘上的数据文件(数据页面),同时还会自动备份一部分事务日志。只有如此,在数据dump完成后,SQL Server才能利用事务日志中的信息将数据库统一到一个特定的时间点,这个时间点就是备份完成时数据的样子(而不是开始!)。方法就是按照事务日志做redo或回滚。
    如果我们在5点整开始做全库备份,7点完成。使用全库备份文件恢复时,数据库恢复到7点时的数据库,而不是5点。
    由于全库备份比较慢,因此大数据库常常一天自动备份一次。小数据库可以根据需要调整。全库备份时会加数据库级别的锁,因此备份正在运行时,其他人试图同时备份数据库会被阻塞。其他对数据文件相关的操作也会被阻塞,例如增加或删除数据文件,shrink数据文件等。
  2. 增量备份
    一个增量备份捕捉扇区(硬盘上的多个连续的数据页面)的状态变化,包含从上个全库备份完成到本次增量备份开始之间的所有变化。因此用增量备份恢复,数据库会恢复到增量备份开始时的数据。
    增量备份不会同时备份事务日志,且增量备份必须和全库备份结合使用。
  3. 日志备份log backup
    顾名思义,就是对事物日志的备份。由于事物日志相对较少,因此可以高频率备份它,如15分钟一次。
    需要注意的是:
    a, 第一次做log备份前,必须至少有一次全库备份。恢复时也不可只使用log备份恢复数据库。
    b, 只有用日志备份做恢复才能恢复到指定的时间点。也就是说用全库备份文件恢复,数据库只能恢复到备份完成的那个时间点。
    c, 在一次log备份后,log文件中的一些事务会被标记为inactive,从而可以被truncate掉了。
    如果数据库运行在full mode下,日志文件中记录的事务即使已经成功提交并完成,日志文件中的记录也不能被删除。由于log可能会被应用到log shipping中,因此过期的事务记录不能被删除。在这种情况下,日志文件会持续增长。
    如果数据库运行在simple mode下,事务一旦完成,log中的记录就可以被truncate掉。因此simple模式下log文件增长的比较慢。

现在思考这样的备份策略:
一个数据库每天5点整进行一次全库备份,用时45分钟左右完成。全天每小时一次增量备份,5分钟完成。每15分钟一次log备份,1分钟完成。

现需要将数据库恢复到5:30,问需要使用哪些备份文件?
答:需使用全库备份文件,以及5点到5点30时间的log备份,并指定时间恢复到5:30。
如果需要将数据库恢复到8:30,问需要使用哪些备份文件?
答:需要使用5点开始的全库备份文件,8点开始的增量备份文件以及8点,8点15,8点30开始的log备份且指定恢复时间点。或5点开始的全库备份文件,以及5点到8点30的所有log备份且指定恢复时间点。
需要注意的是备份文件中都有时间序列标记(lsn),只要时间序列连续就可以成功恢复。即使不小心使用了多余的备份文件也无所谓,数据库可以根据lsn来redo或undo。
理论上最大数据丢失量是多少?
答:最坏的情景是,log备份开始时数据库损坏了,前推15分钟的数据变化没有任何备份,完全丢失。

关于备份的其他知识:
SQL Server还支持数据文件或文件组级别的 backup和restore。Online restore是指支持数据库整体online的同时,恢复单个数据文件.一些第三方工具,如Litespeed还可以支持单个object级别d的restore。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    以上就介绍了SQL Server DBA面试知识点(四)-- SQL Server事务日志和数据库备份,包括了方面的内容,希望对SqlServer有兴趣的朋友有所帮助。

    本文网址链接:http://www.codes51.com/article/detail_265731.html

    相关图片

    相关文章