SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

29e3ccfc7efcb44632c55527b41e57d0.png

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1250人左右 1 + 2 + 3 +4)新人会进入3群 (3群准备关闭自由申请)

每天感悟

好像现代人不焦虑就不正常,为了孩子,为了身体,为了工作,为了钱财,为了每天安全的食品,焦虑是每天的必修课,焦虑中饱含希望一切都按照自己的想法运转,自己仿佛是宇宙的中心,为什么就不能按我心意,如意如意,麻烦醒醒,你脚离地了。

5e9e8f9d2ed949fa5b8272e7eb328d6d.png

SQL SERVER 好久没有写了,偶然有人问SQL SERVER 的UNDO REDO 怎么实现的,因为这些人不曾听说SQL SERVER 有 autovacuum ,vacuum ,也不曾听说 SQL SERVER 有UNDO 表空间,REDO 日志,到底SQL Server是怎么实现,传统数据库中需要的,前滚翻和后滚翻,我们今天看看,到底SQL SERVER 和那个数据库有近亲关系。

首选需要确认的,SQL SERVER 的确没有和ORACLE 以及MYSQL 同流合污,走了UNDO 表空间的这条路,也没有和PostgreSQL 一样将UNDO 深藏在每个自己的表内,他走的是完全依靠日志的的这条路。

在SQL SERVER 中饱含了数据文件MDF NDF,以及SQL SERVER 最硬核的日志,LDF 文件,而 LDF 文件,承载了SQL SERVER 的 REDO ,UNDO 的两个数据库核心功能的实现。

首先我们需要确认一个前提,无论那种数据库的WAL ,write ahead log 都是顺序的,有时间性和顺序性,在确认这点后,我们就可以很少的解释SQL SERVER 到底怎么单纯通过日志就可以完成,那些数据库通过日志无法完成的 UNDO 。

e30eec9a3511d491c4f74c33310a5842.png

这里需要说明,SQL SERVER LDF 文件本身是被切成多个VLF 块的,而这些块有正在被使用的,也有还未激活的,整体的日志VLF 是循环使用每个VLF 中会写事务的日志,每个日志占用512bytes 到 60KB 不同大小的,来记录每个事务的工作。

42b17cfee01d2220d16ebf5e40678880.png

这里会对不同的日志块,进行标记那些那些事务是活跃的,而那些是已经提交的。当一个VLF 写满后,就开启下一个VLF 来继续写日志,所以SQL SERVER 的日志是一个非常复杂的结构。

那么SQL SERVER 回滚,需要做的就是将ACTIVE 的事务日志block,进行反向翻译,然后执行就可以得到事务的回滚。下图中事务1 事务2都是并行运行的,当事务1发生问题,进行回滚,举例 事务1中为

insert into table 而产生回滚,则会产生反向语句 delete from table where XXXX. 所以通过一个逆向的操作,将正向的操作抵消掉。同时每个事务自身也有自己的序号,LDF 日志中通过 VLF 分块,然后每个事务占用VLF 中的 512 bytes 或 60KB 来记录事务,而其中会标记

1 事务的commit 还是uncommit

2  事务中的log block 顺序号

3  事务中 log block 中的事务详细执行的每一步的顺序

4  数据中操作修改的字段的值

da3b69622a2429f1f1165a9fe446b27b.png

所以SQL SERVER LDF 日志文件中,如果回滚将从原有的日志中,获取倒序的执行顺序,执行的值,等信息,产生逆向操作后,直接执行日志即可,数据库的操作可以随时进行rollback。这里与其他的数据库 ORACLE ,MySQL , PostgreSQL 的实现方式均不同,UNDO 的整体操作都在日志中完成。

这里小结一下,SQL SERVER 日志中饱含的信息

1  每个事务的是否活跃的信息标志

2  每个事务的序号

3  每个事务内部的序号

4  事务终止标志

5  回滚标志位 -- 反向事务日志

6   CheckPoint 标记位

通过这个SQL SERVER 事务的了解,也就明白如果有一个长事务不进行commit 则SQL SERVER 的LDF 文件会疯狂的进行扩展,无法进行回收。

同时回滚的事务较多的情况下,尤其大事务,则会导致回滚较慢以及LDF文件加大的问题。

通过学习也了解了三种UNDO实现的方式 SQL SERVER 是将冗余的回滚段放到了日志,POSTGRESQL是将回滚的数据放到了原表,ORACLE MYSQL则是单独设置了回滚段,4种数据库3种实现的UNDO的方式,也体现了每种数据库设计者的一些数据库设计的思路。

REDO 的实现在SQL SERVER 也更加的简单,还是通过LDF 日志文件来实现,在最后一次CHECKPOINT点前说明数据已经刷新到数据页面,则这些日志数据无需回滚,而在最后一次CHECKPOINT点标志位后的日志,则说明需要进行前滚。

单这里会出现一个问题,便是和POSTGRESQL 一样被DISS的 REDO 大量事务过慢的问题,这里POLARDB FOR POSTGRESQL 在代码中,将这部分变为了多线程的前滚模式,SQL SERVER 解决这个问题,开始并行REDO是在2012以后得版本,当然有一些BUG不够应该FIXED 了,SQL SERVER在 2019版本中又启用了ADR 新的功能。

c4a42359c8b9028f82a9b5308ab949ed.png

ADR --  accelerated database recovery , 其中这个新的功能中饱含了新的组件

1  PVS  persistent version store  -- 存储事务中修改行前一个版本的行信息
2  logical revert  通过逻辑分析,在事务回滚时组织好如何读取前一个版本的信息
3  sLog  这个组件的信息是在内存中,比如一些还为写入PVS 的行信息
4  cleaner 清理PVS 中过期的行的信息 

当启用ADR会在数据行中产生一个14个字节的指针,当行被修改后指针指向行之前的行版本,启用了ADR 后,之前SQL SERVER 大事务日志无法截断和快速收缩的问题得到了解决,但是会产生一个新得问题,和POSTGRESQL 一样,数据文件将变得大。

ALTER DATABASE [ADR] SET  ACCELERATED_DATABASE_RECOVERY = OFF;

这里微软官方文档明确指出,如果你的应用是高频的UPDATE和 DELETE的操作数据库表,则不建议开启ADR功能。

所以SQL SERVER ADR的功能和 POSTGRESQL的某些设计是不是近亲,你心里应该有一个答案,当然好消息是,对于大事务的UNDO回滚,将比以往有更快的速度。

小结:在数据库的设计中,UNDO REDO 的实现的方式在不同的数据库有不同的设计的方式,各种数据库都在尽力的解决自身设计的缺陷并和其他数据库取长补短,回到题目,SQL SERVER 在有了ADR 后,和POSTGRESQL是不是有近亲关系?这可能还需要更深入的研究,但是在LINUX 系统中各种数据库互相“拳打脚踢”的局面不同,Windows server服务器的市场中,SQL Server 是隔岸观火,唯我独尊的状态。

最终,数据库的WAR 背后的投资者还是微软和甲骨文,敌人的敌人就是朋友被演绎的淋漓尽致。

7ef90e4351f9ac9bb5d1cf71e145d5f2.png

66ac0477aceacf6e44ad9116b97e7325.png

参考文字

https://techcommunity.microsoft.com/t5/sql-server-blog/sql-server-2016-2017-availability-group-secondary-replica-redo/ba-p/385905

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel VSTO开发5 -Excel对象结构

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 5 Excel对象结构 Excel提供了几个比较重要的对象: Application、Workbooks、Workbook、Worksheets、Worksheet 为了便…

Ubantu终端常用命令、快捷键和基本操作

目录 前言 一、常用命令 二、常用快捷键 三、快捷键自定义设置 总结 前言 Ubantu终端常用命令和快捷键用于进行系统管理、文件操作、软件安装等常见使用场景。使用它们可以提高工作效率,简化操作流程,并进行更多的自定义配置和控制。同时&#xff0c…

jenkins创建用户

一.背景 之前用了很多次,现在转到甲方爸爸的岗位,要培养大学毕业生,才发现好记性不如烂笔头。给年轻人写出来。 二.创建用户的过程 1.用户管理界面入口 Dashboard>Manage Jenkins>Jenkins own user database 2.点击右边的按钮“Cre…

深入《C++ Core Guidelines解析》:提升C++编程实践的关键指南

目录 1、写在前面2、推荐理由3、内容介绍4、作者介绍5、赠书 or 购买 1、写在前面 C Core Guidelines是一个正在进行的开源项目,通过将广泛认可的现代C上佳实践集中在一个地方来解决这些问题。Core Guidelines依赖于几十年的经验和早期的编码规则。它们与C本身共享一…

数据结构 每日一练:将带头结点的单链表就地逆置(视频讲解两种方法)

目录 方法一 算法视频分析 方法二 算法视频分析 Q:什么是“就地”捏? A:就是指辅助空间复杂度为O(1),通俗一点来说就是不需要再开辟一块空间来实现算法。 特别说明: 笔者第一次录制视频,言语有些不顺&…

MySQL——常见问题

NULL和空值的区别 1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。 3、判断NULL 用IS NULL 或者 is no…

Win10 ping 虚拟机kali 请求超时解决办法

出现这种问题应该是windows休眠导致的 这里我的解决方法是先禁用再启用连接 然后再ping 虚拟机ip和kali ip,发现就可以连上了

vue前后端端口不一致解决方案

在config index.js文件中 引入如下代码即可 const path require(path) const devEnv require(./dev.env) module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: devEnv.OPEN_PROXY false ? {} : {/api: {target: http://localhos…

工作和生活中,如何用项目管理思维解决复杂的事情?

在工作和生活中,许多事情都可以采用项目思维方式来解决。当我们逐渐将工作和生活中的各种事务以项目的方式来处理和推进时,我们可能并没有意识到,实际上我们正在运用项目管理思维。 项目管理思维能帮助我们在面对繁杂事务时,理清…

PY32F003F18按键输入

一、PY32F003F18的GPIO介绍 1、PY32F003F18的18个I/O,均可作为外部中断; 2、每个GPIO都可以由软件配置为输出: 1)、推挽输出(push-pull) 2)、开漏极输出(open drain) 注意:驱动电流为8mA; 3、每个GPIO都可以由软件配置为输入: 1)、…

ERP辅助报价助力提高效率和准确性

一、ERP辅助报价的定义: ERP辅助报价是指通过企业资源计划系统提供的功能和工具,辅助企业进行报价流程的管理和执行。它涵盖了报价数据的收集、计算、分析和生成报价文件的全过程,以提高报价的准确性、效率和一致性。 二、ERP辅助报价的重要…

LeetCode:2. 两数之和

这个解题思路来自代码随想录&#xff1a;代码随想录 (programmercarl.com) class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {std::unordered_map <int,int> map;for(int i 0; i < nums.size(); i) {// 遍历当前元素&am…

若依前端vue设置子路径

若依前端vue设置子路径 说明&#xff1a;本文档中以前后端分离版为例&#xff0c;版本为:3.8.6 一设置变量 在.env.development和.env.production 中定义一个变量如VUE_APP_PROJECT_IDENTIFIER # 项目标识字符 VUE_APP_PROJECT_IDENTIFIER admin二引用路径变量 ${process…

mysql trace

optimizer_trace 它可以跟踪优化器做出的各种决策&#xff08;比如访问表的方法、各种开销计算、各种转换等&#xff09;&#xff0c;并将跟踪结果记录到 information_schema 数据库中的 optimizer_trace 表中。 mysql 默认是关闭 追踪的 开启、并设置格式为 josn,同时设置trac…

数电课程设计

为了帮助大家更好学习FPGA硬件语言&#xff0c;创立此资源 包含文件有&#xff1a;实验报告、仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 课设一&#xff1a;加减计数器 一、实验内容 1、利用QuartusII和Modelsim实现100进制可逆计数器编码显示实验。 二、实…

【HttpRunnerManager】搭建接口自动化测试平台操作流程

一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置 2. python: django 配置、uwsgi 配置 二、我搭建的环境 1. Centos7 &#xff08;配置 rabbitmq、mysql 、Supervisord&#xff09; 2. python 3.6.8 &#xff08;配置 django、uwsgi&am…

解决本地jar包导入maven

1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径&#xff08;尽量简单并且不要含中文&#xff09; <group-id>为grouId号&#xff0c;与<artifact-id>组成唯一识别你jar包的坐标&#xff0c;当不在公共资源jar包中&#…

git撤销还未push的的提交

怎样撤销掉上图中的提交呢 使用以下代码即可提交 git reset --soft HEAD^

MyBatis-Plus学习笔记总结

一、查询 构造器分为QueryWrapper和LambdaQueryWrapper 创建实体类User package com.system.mybatisplus.model;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.…

postman返回值乱码

描述&#xff1a; 在使用postman测试接口的时候&#xff0c;结果正常返回&#xff0c;但是乱码了&#xff0c;这个一般都是编码集设定的问题,后端接口是使用的springmvc Controller public class TestController(){RequestMapper("/test8")ResponseBodypublic Strin…