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

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1250人左右 1 + 2 + 3 +4)新人会进入3群 (3群准备关闭自由申请)
每天感悟
好像现代人不焦虑就不正常,为了孩子,为了身体,为了工作,为了钱财,为了每天安全的食品,焦虑是每天的必修课,焦虑中饱含希望一切都按照自己的想法运转,自己仿佛是宇宙的中心,为什么就不能按我心意,如意如意,麻烦醒醒,你脚离地了。 
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 。

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

这里会对不同的日志块,进行标记那些那些事务是活跃的,而那些是已经提交的。当一个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 数据中操作修改的字段的值

所以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 新的功能。

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 背后的投资者还是微软和甲骨文,敌人的敌人就是朋友被演绎的淋漓尽致。


参考文字
https://techcommunity.microsoft.com/t5/sql-server-blog/sql-server-2016-2017-availability-group-secondary-replica-redo/ba-p/385905
相关文章:
SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 l…...
SpringBoot原理-自动配置-原理分析-源码跟踪
自动配置原理 SpringBootApplication 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。 SpringBootConfiguration:该注解与Configuration注解作用一样,用来声明当前类为一个配置类Comp…...
安全基础 --- 原型链污染
原型链 大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。传统上,JavaScript 语言的继承不通过 class,而是通过“原型对象”(prototype)实现 1、prototype 属性的作用 JavaScri…...
c++中的常用知识点总结
命名空间 使用命名空间之后,调用代码时可以省去也可以不省去相关的前缀。 #include <iostream>using namespace std;//使用c自己的命名空间 int main() {int num1 10;std::cout << "Hello, World!" << std::endl;cout<<num1&l…...
Leetcode:349. 两个数组的交集【题解超详细】
题目 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 难度:简单 题目链接:349.两个数组的交集 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,…...
Java 【异常】
一、认识异常 Exception 在 Java 中,将程序执行过程中发生的不正常行为称为异常 。 异常是异常exception,报错是报错error 1.算数异常 0不能作为除数,所以算数异常 2.空指针异常 arr不指向任何对象,打印不出arr的长度,…...
B - Polycarp‘s Practice
Polycarp is practicing his problem solving skill. He has a list of nn problems with difficulties a_1, a_2, \dots, a_na1,a2,…,an, respectively. His plan is to practice for exactly kk days. Each day he has to solve at least one problem from his list. …...
朴素贝叶斯数据分类------
------------------后期会编辑些关于朴素贝叶斯算法的推导及代码分析----------------- import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB from sklear…...
flask中的操作数据库的插件Flask-SQLAlchemy
1、ORM 框架 Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据库(如 redis)近几年也逐渐在 w…...
arrow的使用
pandas2.0引入了pyarrow作为可选后端,比numpy的性能提高很多,所以为了改造backtrader,用cython和c++重写整个框架,准备用arrow作为底层的数据结构(backtrader现在的底层数据结构是基于python array构建的) 安装arrow推荐使用vcpkg git clone https://github.com/Microsoft…...
【24种设计模式】装饰器模式(Decorator Pattern(Wrapper))
装饰器模式 装饰器模式是一种结构型设计模式,用于动态地给对象添加额外的行为或责任,而不需要改变原始对象的结构。通过创建一个包装器类(装饰器),它包含原始对象的引用,并提供与原始对象相同的接口&#…...
小程序v-for与key值使用
小程序中的v-for和key与Vue中的用法基本相同。v-for用于循环渲染列表,key用于给每个循环项分配一个唯一的标识。 使用v-for时,通常建议使用wx:for代替,例如: <view wx:for"{{ items }}" wx:key"id">{…...
Qt包含文件不存在问题解决 QNetworkAccessManager
这里用到了Qt的网络模块,在.pro中添加了 QT network 但是添加 #include <QNetworkAccessManager> 会报错说找不到,可以通过在项目上右键执行qmake后,直接#include <QNetworkAccessManager>就不会报错了:...
【视频图像篇】FastStone Capture屏幕长截图软件
【视频图像篇】FastStone Capture屏幕长截图软件 FastStone Capture最常用的一款屏幕长截图软件—【蘇小沐】 文章目录 【视频图像篇】FastStone Capture屏幕长截图软件实验环境1、启动界面2、自定义工具栏3、自动保存 (一)长截图1、捕获滚动窗口2、捕获…...
【C语言】每日一题(杨氏矩阵查找数)
目录 杨氏矩阵介绍:方法:思路:代码实现: 杨氏矩阵介绍: 既然在杨氏矩阵中查找数,那什么是杨氏矩阵呢? 矩阵的每行从左到右是递增的,矩阵从上到下是递增的。 例如: 方法…...
探究SpringWeb对于请求的处理过程
探究目的 在路径归一化被提出后,越来越多的未授权漏洞被爆出,而这些未授权多半跟spring自身对路由分发的处理机制有关。今天就来探究一下到底spring处理了什么导致了才导致鉴权被绕过这样严重的问题。 DispatcherServlet介绍 首先在分析spring对请求处…...
如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例
文章目录 步骤1:创建 Google Cloud Platform(GCP)账户步骤2:设置 GCP 项目步骤3:启用 Google Compute Engine API步骤4:安装 Google Cloud SDK步骤5:创建虚拟机实例步骤6:连接到虚拟…...
springMVC中全局异常处理
前言: 当不同方法执行时,抛出相同异常。为了简约代码和避免重复使用try{}catch{}。此时使用统一异常处理。但局部的统一异常处理只能为所在类所调用。因此产生全局异常处理,该类中统一异常处理方法可以作用于整个controller。(以…...
【Nginx24】Nginx学习:压缩模块Gzip
Nginx学习:压缩模块Gzip 又是一个非常常见的模块,Gzip 现在也是事实上的 Web 应用压缩标准了。随便打开一个网站,在请求的响应头中都会看到 Content-Encoding: gzip 这样的内容,这就表明当前这个请求的页面或资源使用了 Gzip 压缩…...
我的私人笔记(zookeeper分布式安装)
分布式安装 1.安装前准备 (1)下载zookeeper:Index of /dist/zookeeper(当前使用为3.4.10版本) (2)安装JDK (3)拷贝zookeeper安装包到Linux系统下 (4)解压到指定目录 tar -xzvf zookeeper-3.4.10.tar.gz -C /opt/servers/ (5)修改名称 …...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
