当前位置: 首页 > news >正文

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

相关文章:

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++中的常用知识点总结

命名空间 使用命名空间之后&#xff0c;调用代码时可以省去也可以不省去相关的前缀。 #include <iostream>using namespace std;//使用c自己的命名空间 int main() {int num1 10;std::cout << "Hello, World!" << std::endl;cout<<num1&l…...

Leetcode:349. 两个数组的交集【题解超详细】

题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 难度&#xff1a;简单 题目链接&#xff1a;349.两个数组的交集 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,…...

Java 【异常】

一、认识异常 Exception 在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为异常 。 异常是异常exception&#xff0c;报错是报错error 1.算数异常 0不能作为除数&#xff0c;所以算数异常 2.空指针异常 arr不指向任何对象&#xff0c;打印不出arr的长度&#xff0c;…...

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 开发中&#xff0c;一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了&#xff0c;也称 SQL 数据库。另外&#xff0c;文档数据库&#xff08;如 mongodb&#xff09;、键值对数据库&#xff08;如 redis&#xff09;近几年也逐渐在 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))

装饰器模式 装饰器模式是一种结构型设计模式&#xff0c;用于动态地给对象添加额外的行为或责任&#xff0c;而不需要改变原始对象的结构。通过创建一个包装器类&#xff08;装饰器&#xff09;&#xff0c;它包含原始对象的引用&#xff0c;并提供与原始对象相同的接口&#…...

小程序v-for与key值使用

小程序中的v-for和key与Vue中的用法基本相同。v-for用于循环渲染列表&#xff0c;key用于给每个循环项分配一个唯一的标识。 使用v-for时&#xff0c;通常建议使用wx:for代替&#xff0c;例如&#xff1a; <view wx:for"{{ items }}" wx:key"id">{…...

Qt包含文件不存在问题解决 QNetworkAccessManager

这里用到了Qt的网络模块&#xff0c;在.pro中添加了 QT network 但是添加 #include <QNetworkAccessManager> 会报错说找不到&#xff0c;可以通过在项目上右键执行qmake后&#xff0c;直接#include <QNetworkAccessManager>就不会报错了&#xff1a;...

【视频图像篇】FastStone Capture屏幕长截图软件

【视频图像篇】FastStone Capture屏幕长截图软件 FastStone Capture最常用的一款屏幕长截图软件—【蘇小沐】 文章目录 【视频图像篇】FastStone Capture屏幕长截图软件实验环境1、启动界面2、自定义工具栏3、自动保存 &#xff08;一&#xff09;长截图1、捕获滚动窗口2、捕获…...

【C语言】每日一题(杨氏矩阵查找数)

目录 杨氏矩阵介绍&#xff1a;方法&#xff1a;思路&#xff1a;代码实现&#xff1a; 杨氏矩阵介绍&#xff1a; 既然在杨氏矩阵中查找数&#xff0c;那什么是杨氏矩阵呢&#xff1f; 矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的。 例如&#xff1a; 方法…...

探究SpringWeb对于请求的处理过程

探究目的 在路径归一化被提出后&#xff0c;越来越多的未授权漏洞被爆出&#xff0c;而这些未授权多半跟spring自身对路由分发的处理机制有关。今天就来探究一下到底spring处理了什么导致了才导致鉴权被绕过这样严重的问题。 DispatcherServlet介绍 首先在分析spring对请求处…...

如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例

文章目录 步骤1&#xff1a;创建 Google Cloud Platform&#xff08;GCP&#xff09;账户步骤2&#xff1a;设置 GCP 项目步骤3&#xff1a;启用 Google Compute Engine API步骤4&#xff1a;安装 Google Cloud SDK步骤5&#xff1a;创建虚拟机实例步骤6&#xff1a;连接到虚拟…...

springMVC中全局异常处理

前言&#xff1a; 当不同方法执行时&#xff0c;抛出相同异常。为了简约代码和避免重复使用try{}catch{}。此时使用统一异常处理。但局部的统一异常处理只能为所在类所调用。因此产生全局异常处理&#xff0c;该类中统一异常处理方法可以作用于整个controller。&#xff08;以…...

【Nginx24】Nginx学习:压缩模块Gzip

Nginx学习&#xff1a;压缩模块Gzip 又是一个非常常见的模块&#xff0c;Gzip 现在也是事实上的 Web 应用压缩标准了。随便打开一个网站&#xff0c;在请求的响应头中都会看到 Content-Encoding: gzip 这样的内容&#xff0c;这就表明当前这个请求的页面或资源使用了 Gzip 压缩…...

我的私人笔记(zookeeper分布式安装)

分布式安装 1.安装前准备 (1)下载zookeeper&#xff1a;Index of /dist/zookeeper&#xff08;当前使用为3.4.10版本&#xff09; (2)安装JDK (3)拷贝zookeeper安装包到Linux系统下 (4)解压到指定目录 tar -xzvf zookeeper-3.4.10.tar.gz -C /opt/servers/ (5)修改名称 …...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...