浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介:
本篇文章是系列文章中的第五篇,是对前一个日志系列的补充篇。如果您对日志的基本概念还没有一个比较系统的了解,可以参看本系列之前的文章:

浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

 

简介

    日志的作用是保证持久性和数据一致性,通过日志可以实现数据的Undo与Redo,因此通过日志,SQL Server不仅仅可以实现灾难恢复,还可以通过日志的Redo来实现高可用性。本篇文章主要讲述日志在SQL Server中提供的几种高可用性中的作用以及在灾难恢复中的角色。

 

日志损坏

    日志可能会由于IO子系统的故障而损坏,当出现日志损坏时,如果您对日志的原来略有了解,并能在日志损坏的情况下尽量挽救数据,那么感觉一定是非常好的:-),下面我们来了解几种日志损坏的情况下的恢复情况。

 

1.数据库正常关闭,日志损坏。

    当数据库正常关闭时,日志损坏就不是那么重要了,因为此时数据库中所有提交的事务对应的脏数据都已经CheckPoint到物理磁盘,因此不存在数据不一致的问题。因此,如果MDF和NDF文件完好,直接指定 FOR ATTACH_REBUILD_LOG参数后附加即可,如图1所示。

1

图1.如果数据库正常关闭,直接附加即可

 

    但值得注意的是,使用该方式附加数据库会自动重建日志文件,日志文件大小为0.5MB,也就是2个VLF,自动增长为10%,因此您需要手动再来设置一下日志的大小,避免出现太多VLF的情况。

 

2.数据库非正常关闭,日志损坏

    在讲述这种情况之前,我们首先来看数据库所能处在的几种状态,一个完整的模型如图2所示。

    2

    图2.数据库所能处在的状态关系

   

    上面的几种状态的具体转换关系超出了本文的讨论范围,但是这里我会强调两种和日志损坏关系很大的状态:RECOVERY_PENDING和SUSPECT状态。

    假如出现了数据库没有正常关闭,也就是还有数据没有CheckPoint到磁盘,如果数据库要启动就必须经历Recovery过程,如果日志损坏,则无法进行该Recovery过程,就会造成数据不一致的问题。

    此时,数据库可能处于下面两种状态之一:

RECOVERY_PENDING:需要运行crash recovery,但该过程由于资源等待无法开始,比如说日志完全损坏
SUSPECT:crash recovery已经开始,但无法完成
 

    因此处理该类情况要基于您所在的业务环境是否允许数据损失,可以选择从备份中恢复数据,或是将数据库状态改为EMERGENCY。EMERGENCY模式意味着数据库跳过crash recovery阶段,此时虽然可以访问数据库,但是会存在数据事务不一致的问题,如果仅仅是某些数据页不一致还好,但如果是对表结构修改的事务存在,那就可能存在数据库架构不一致的问题。如果您没有合适的备份集,那只能通过该方式来恢复数据。将数据库设置为EMERGENCY模式非常简单,如代码清单1所示。

ALTER DATABASE AdventureWorks2012 SET EMERGENCY
代码清单1.将数据库设置为紧急模式

 

    与该模式有关的一个选项是REPAIR_ALLOW_DATA_LOSS,该选项依然会执行crash recovery过程,但会跳过受损的日子,从而尽可能的修复数据一致性问题,该选项会创建一个新的日志文件,最后使得数据库处于ONLINE状态,使用该选项的一个简单例子如代码清单2所示。

ALTER DATABASE AdventureWorks2012 SET SINGLE_USER
 
DBCC CHECKDB(AdventureWorks2012,REPAIR_ALLOW_DATA_LOSS)
代码清单2.使用REPAIR_ALLOW_DATA_LOSS选项

 

    值得注意的是,作为DBA永远是要有“备”无患,上面这些操作是在您准备工作不充分的情况下才要去考虑的。

 

3.数据库处于在线状态,日志损坏

    在这种情况下,如果SQL Server在运行时需要使用的日志损坏(比如说回滚时),则SQL Server会将数据库下线,并转为SUSPECT模式。

    同样如果没有备份的话,只能考虑使用EMERGENCY模式。

    还有一种方式是,将数据库的恢复模式改为简单,然后手动发起一个CheckPoint来截断日志,最后再将数据库改回完整恢复模式。但这种方式会破坏日志链。但可能会将被损坏的日志清除掉。

 

 

日志在高可用性中的作用

 

镜像与AlwaysOn

    这两种高可用性技术都是基于日志来维护一个数据库的副本。通过将日志实时的传送到副本,在副本上来不断的进行REDO操作,就可以保证主体和副本数据库之间的实时同步。

    对于镜像来说,可以同步或异步将日志传送的1个副本。

    而对于AlwaysOn可用性组来说,就可以将日志最多同步到2个副本+异步到2个副本(据说SQL Server 2014已经将该特性翻倍,也就是最多可以4个同步副本和最多4个异步副本,但目前还没有发布,所以只是小道消息)。

    所谓的同步概念就是主副本只有将传送的日志发送到辅助副本之后,由辅助副本返回ACK信息后,才能够在本地提交,因此可能会造成明显的延迟并影响性能。这里还值得注意的是,主副本不是等待事务在辅助副本提交之后才能提交,而是只是需要收到辅助副本返回的收到日志的ACK信息即可。

    无论对于上面两种高可用特性,无论是哪一种,都需要考虑监控发送队列和REDO队列。发送队列过长意味着当故障转移时,可能丢失大量数据,同时还会阻止日志截断。REDO队列过长意味着当故障转移时,RECOVERY截断将会消耗更多的时间,从而使得故障转移消耗的宕机时间延长。这两种队列的监控都可以使用性能监视器进行,如图3所示。

3

图3.监控队列的计数器

 

事务日志传送

    相比其他高可用性功能来说,事务日志传送功能比较简单。本质上就是一个不断备份、传送、还原日志的过程。使用事务日志传送对于测试日志是否有效来说非常合适。

    事务日志传送还有一点值得注意的地方就是,当有批量操作的时候,考虑使用大容量事务日志模式,从而避免大量的日志通过网络传输。

    事务日志对于维护一个数据库冗余的副本来说是最简单的方式,虽然不能保证数据实时,但对于特定业务场景还是非常有意义的。

 

事务复制

    与前几种高可用性特性不同的是,事务日志无法直接传送事务日志。因为发布端和订阅端数据库的结构可以完全不一样,订阅端可以仅仅订阅一个或多个表,表中的一部分列,或是一部分数据子集。由于发布端和订阅端的表结构和数据不一致,因此无法直接将发布端的日志传送到订阅端。

    因此事务复制的原理是Log Reader Agent定期读取发布端的日志,汇总日志对发布内容的更改,从而将这些更改变为逻辑操作,从而使得订阅端可以Replay这些操作来打到数据同步的目的。

    这里值得注意的是,如果Log Reader Agent还没有扫描最新的修改,事务复制可能造成发布端的日志无法截断。

 

 

小结

    本篇文章作为对前面四篇文章的补充,讲述了日志在灾难恢复和高可用性中的原理和作用。这些原理对于设计一个好的备份计划、高可用性计划来说,是必不可少的。



本文转自CareySon博客园博客,原文链接:http://www.cnblogs.com/CareySon/archive/2013/06/16/3138742.html,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
229 7
MySQL事务日志-Undo Log工作原理分析
|
10月前
|
SQL 存储 缓存
高基数 GroupBy 在 SLS SQL 中的查询加速
本文详细介绍了SLS中的高基数GroupBy查询加速技术。
231 60
|
9月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
2088 14
MySQL事务日志-Redo Log工作原理分析
|
7月前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
9月前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
10月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
9月前
|
SQL 数据库
为什么SQL日志文件很大,该如何处理?
为什么SQL日志文件很大,该如何处理?
|
8月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2406 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
7月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
191 9
|
5月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
413 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

热门文章

最新文章