Sqlserver没有单独的undo文件,使用tempdb和redo log来存放undo数据

官方文档
https://learn.microsoft.com/zh-cn/sql/relational-databases/databases/tempdb-database?view=sql-server-ver16
https://learn.microsoft.com/zh-cn/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-ver16
https://learn.microsoft.com/zh-cn/sql/relational-databases/backup-restore/restore-a-transaction-log-backup-sql-server?view=sql-server-2017

总结
sqlserver的undo信息记录在temp文件中和log文件中,temp文件记录事务的行版本,log文件记录事务修改动作发生之前的表的前像

sqlserver没有undo文件
现象:遇到一个案例,对没有空闲分区的分区函数和分区架构进行分区的扩展,比如分区只到2020年,但是2021到2022的数据已经写入默认分区,再此基础上,扩展分区架构和函数到2021的过程中,发现耗时10天,期间产生了2T日志,2T临时数据和临时日志,而且期间产生的日志就算备份了,也无法shrink这个2T的日志文件,直到扩展结束才能shrink,期间数据库databases.log_reuse_wait_desc一直处于ACTIVE_TRANSACTION状态

解释
1、日志备份只能截断非活动的日志,如果一个事物长时间运行,此时备份事物日志将不会引起截断发生,因为扩展分区是一个事务,该事务耗时10天,这10天内日志在不停的增加并且因为这个事务最初发生时占用的虚拟日志文件(VLM)中存在活动日志(尾日志),导致首日志(最新的活动日志序号)和尾日志(保留时间最长的活动日志序号)涉及的VLM都可能有这个事务的数据,因为VLF中存在活动日志(哪怕只有一条),所以数据库无法利用这个VLF的剩余空间。所以导致redo log日志文件越来越来大且无法收缩。
2、如果一个事物长时间运行,不管涉及多少行版本,这个事务的行版本信息都会记录在tempdb中,所以随着这个事务的时间的增加,tempdb临时文件和临时文件日志也会越来越大

Tempdb
tempdb系统数据库是包含以下内容的全局资源:
1、显式创建的临时用户对象,它包括全局或局部临时表及索引、临时存储过程、表变量、表值函数返回的表或游标。
2、数据库引擎创建的内部对象,它包括:用于储存假脱机、游标、排序和临时大型对象 (LOB) 存储的中间结果的工作表。用于哈希联接或哈希聚合操作的工作文件。用于创建或重新生成索引等操作(如果指定了SORT_IN_TEMPDB)的中间排序结果,或者某些GROUP BY、ORDER BY 或 UNION 查询的中间排序结果。
3、版本存储区是数据页的集合,它包含支持用于行版本控制的功能的数据行。有两种类型:公用版本存储区和联机索引生成版本存储区。版本存储区包含:
由通过行版本控制隔离或快照隔离事务使用READ COMMITTED的数据库中的数据修改事务生成的行版本。
由数据修改事务为实现联机索引操作、多重活动结果集 (MARS) 以及 AFTER 触发器等功能而生成的行版本。
Version stores, which are collections of data pages that hold the data rows that support features for row versioning. There are two types: a common version store and an online-index-build version store.The version stores contain:
Row versions that are generated by data modification transactions in a database that uses READ COMMITTED through row versioning isolation or snapshot isolation transactions.
Row versions that are generated by data modification transactions for features, such as online index operations, Multiple Active Result Sets (MARS), and AFTER triggers.

tempdb 中的操作是最小日志记录操作,以便回滚事务。 每次启动 SQL Server 时都会重新创建 tempdb,从而在系统启动时总是具有一个干净的数据库副本。 在断开联接时会自动删除临时表和存储过程,并且在系统关闭后没有活动连接。

tempdb 不会有什么内容从 SQL Server 的一个会话保存到另一个会话。 不允许对 tempdb 执行备份和还原操作。

Redo log事务日志逻辑体系结构
Log records for data modifications record either the logical operation performed or they record the before and after images of the modified data. The before image is a copy of the data before the operation is performed; the after image is a copy of the data after the operation has been performed.
数据修改的日志记录,记录所执行的逻辑操作,或者记录已修改数据的前像和后像。 前像是执行操作前的数据副本;后像是执行操作后的数据副本。

操作的恢复步骤取决于日志记录的类型:
记录逻辑操作
若要前滚逻辑操作,请再次执行该操作。
若要回滚逻辑操作,请执行相反的逻辑操作。

记录前像和后像
若要前滚操作,请应用后像。
若要回滚操作,请应用前像。

以上话,很明显说明sqlserver的undo信息记录在temp文件中和log文件中,temp文件记录行版本,log文件记录前像

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值