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…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...