检查点(Checkpoint)过程如何处理未提交的事务

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么。执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改内存中的相关页,并在事务日志里记录整个事务。

介绍完这些特定步骤后,我总会问同样的问题:当我们有个未提交的事务,这个时候刚好有检查点(Checkpoint)发生,SQL Server会崩溃么?在我们数据文件里有我们未提交的数据么?先思考下,然后再写下你的答案。

创建测试场景

现在我想和你一起重建这个特定场景,最后你会看到你是否回答对了。这个场景的第一步,我创建了一个新的数据库,一个新的表,并插入一些记录。

复制代码
 1 -- Create a new database
 2 CREATE DATABASE Checkpointing
 3 GO
 4 
 5 -- Use it
 6 USE Checkpointing
 7 GO
 8 
 9 -- Create a new table
10 CREATE TABLE Foo
11 (
12     Col1 CHAR(100) NOT NULL,
13     Col2 CHAR(100) NOT NULL,
14     Col3 CHAR(100) NOT NULL
15 )
16 GO
17 
18 -- Insert a record
19 INSERT INTO Foo VALUES
20 (
21     REPLICATE('A', 100),
22     REPLICATE('B', 100),
23     REPLICATE('C', 100)
24 )
25 GO
26 
27 -- Retrieve the record
28 SELECT * FROM Foo
29 GO
复制代码

在我们插入数据后,我想知道SQL Server存储特定记录的页号。我们可以使用DBCC IND命来来返回特定表的所有页。在我的服务器上SQL Server使用的Page id是79。

1 -- Retrieve the first data page for the specified table (columns PageFID and PagePID)
2 DBCC IND(Checkpointing, Foo, -1)
3 GO

现在当我们用DBCC PAGE命令输出页内容时(使用这个命令前,要先启用3604跟踪标记),我们可以看到插入的A,B,C的16进制值。

复制代码
1 -- Enable DBCC trace flag 3604
2 DBCC TRACEON(3604)
3 GO
4 
5 -- Dump the first data page of the table Customers retrieved by DBCC IND previously
6 DBCC PAGE (Checkpointing, 1,79, 3)
7 GO
复制代码

现在当我们进行检查点(Checkpoint)过程,并最终杀掉SQL Server会发生什么?未提交的数据会物理写入数据文件么?我们来试验下...

崩溃并恢复SQL Server

现在我们开始一个新的事务,并更新插入记录的第一列。

复制代码
1 -- Begin a new transaction without committing it...
2 BEGIN TRANSACTION
3 
4 UPDATE Foo
5 SET Col1 = REPLICATE('X', 100)
复制代码

从代码里你可以看到,我们并没有提交这个事务!它还是待定的,未提交的事务。现在我们打开另一个会话,我们人为进行一次检查点(Checkpoint)过程,并最终关闭SQL Server。

复制代码
1 -- Execute it in a different session
2 CHECKPOINT
3 GO
4 
5 SHUTDOWN WITH NOWAIT
6 GO
复制代码

现在你认为未提交的事务已经写入数据文件了么?不确定?我们来找出答案!我们在16进制的编辑器(例如XVI32)里打开数据文件。跳到页号79的开始。在数据文件里,页号是物理偏移量,即页开始的地方——乘上8192字节,因为在SQL Server里页的大小是8kb。因此页79的开始整数偏移量是647168(79*8192).当我们查看hex值时,我们看到了我们未提交的数据。

检查点(Checkpoint)过程不会区分提交和未提交的事务。它只会到缓存管理器(Buffer Manager)索取所有脏页,不管它们事务的状态。

现在我们有不一致,损坏的数据库了么?没有,并不真的是。因为现在当我们启动SQL Server,每个数据库都经过故障恢复阶段,所有没提交的事务都会回滚。当SQL Server启动的时候,我们可以在SQL Server日志里看到这个行为:

小结

检查点(Checkpoint)不会在意你的事务状态。来自缓存池(Buffer Pool)的每个脏页会写入数据页。如果SQL Server崩溃了也没关系,因为故障恢复能恢复你的数据库到完全一致的状态。我希望这篇日志能让你更好的理解检查点(Checkpoint)过程,还有它如何与未提交的事务打交道。



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/5164359.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
数据安全/隐私保护
如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件
该文提供了一个工具的下载链接,分别在百度网盘和蓝奏云,提取码分别为&qwu2"和"2r1z"。工具的使用需结合之前发布的两篇教程:《快捷自由定时重启、注销、关机》和《如何从多个文件夹内转移全部文件(忽略文件夹的结构)(进行复制)(再打包)》。操作步骤包括设定"来源路径"进行Zip打包,启用"备份模式",然后保存批量复制任务,最后在定时器中执行已设置的批量文件复制任务。文中附有相关截图以供参考。
|
Go 数据库
sync.Once-保证运行期间的某段代码只会执行一次
sync.Once-保证运行期间的某段代码只会执行一次
90 0
|
存储 算法 关系型数据库
对比两阶段提交,三阶段提交做了哪些改进?
在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。在关系型数据库中,由于存在事务机制,可以保证每个独立节点上的数据操作满足 ACID。但是,相互独立的节点之间无法准确的知道其他节点中的事务执行情况,所以在分布式的场景下,如果不添加额外的机制,多个节点之间理论上无法达到一致的状态。 在分布式事务中,两阶段和三阶段提交是经典的一致性算法,那么两阶段和三阶段提交的具体流程是怎样的,三阶段提交又是如何改进的呢?
125 0
|
消息中间件 存储 算法
Flink---13、容错机制(检查点(保存、恢复、算法、配置)、状态一致性、端到端精确一次)
Flink---13、容错机制(检查点(保存、恢复、算法、配置)、状态一致性、端到端精确一次)
|
存储 算法 NoSQL
分布式事务两阶段提交和三阶段提交有什么区别?
分布式事务两阶段提交和三阶段提交有什么区别?
350 0
分布式事务两阶段提交和三阶段提交有什么区别?
|
SQL 存储 关系型数据库
什么是binlog,redolog,两阶段提交
什么是binlog,redolog,两阶段提交
222 0
|
SQL 存储 运维
FLIP-147:支持包含结束任务的 Checkpoint 操作与作业结束流程修正
为了完善流执行模式对有限数据流的支持,所进行的改动以及更详细的实现。
FLIP-147:支持包含结束任务的 Checkpoint 操作与作业结束流程修正
|
缓存 Oracle 关系型数据库
redolog switch会发生完全检查点还是增量检查点
检查点这个概念在Oracle中非常重要,很多人对检查点这个概念很模糊,为了彻底搞懂,我们一起来讨论以下几个问题! 1、什么是完全检查点?哪些操作会触发?  2、什么是增量检查点?哪些条件会触发? 3、redolog switch会发生完全检查点还是增量检查点?(此话题的核心部分:用实验验证) 4、Oracle中检查点(checkpoint)一共有多少种呢?
redolog switch会发生完全检查点还是增量检查点
|
SQL Oracle 关系型数据库
Oracle数据库的显示提交与隐式提交,针对oracle工具的自动提交机制
Oracle数据库的显示提交与隐式提交,针对oracle工具的自动提交机制
598 0
|
架构师 关系型数据库 MySQL
事务已提交,数据却丢了,赶紧检查下这个配置!!! | 数据库系列
有个星球水友提问: 沈老师,我们有一次MySQL崩溃,重启后发现有些已经提交的事务对数据的修改丢失了,不是说事务能保证ACID特性么,想问下什么情况下可能导致“事务已经提交,数据却丢失”呢?
675 0
事务已提交,数据却丢了,赶紧检查下这个配置!!! | 数据库系列