解决 RDS SQL Server 日志空间增长问题

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 解决 RDS SQL Server 日志空间增长问题

背景

在日常业务使用中,经常遇到由于日志增长非常快速,而磁盘空间预留不足,导致磁盘空间被打满的情况,从而影响业务正常运转。

今天就说说,遇到此类问题如何处理和正常使用的姿势。

针对环境:

RDS SQL Server 基础版、高可用版本。

日志使用原理

在讲解如何处理日志增长问题之前,先说说日志设计原理与机制。

日志的用途

  • 每个 SQL Server 数据库都有独立的事务日志文件,用于记录所有事务所做的数据库修改。
  • 事务日志是数据库的一个关键组件。 如果系统出现故障,你将需要依靠该日志将数据库恢复到一致的状态。


事务日志的循环性质

事务日志是一种回绕的文件。 例如,假设有一个数据库,它包含一个分成四个 VLF 的物理日志文件。 当创建数据库时,逻辑日志文件从物理日志文件的始端开始。 新日志记录被添加到逻辑日志的末端,然后向物理日志的末端扩张。 日志截断将释放记录全部在最小恢复日志序列号 (MinLSN) 之前出现的所有虚拟日志。 MinLSN 是成功进行数据库范围内回滚所需的最早日志记录的日志序列号。 示例数据库中的事务日志的外观与下图所示相似。

当逻辑日志的末端到达物理日志文件的末端时,新的日志记录将回绕到物理日志文件的始端。


这个循环不断重复,只要逻辑日志的末端不到达逻辑日志的始端。 如果经常截断旧的日志记录,始终为到下一个检查点前创建的所有新日志记录保留足够的空间,则日志永远不会填满。 但是,如果逻辑日志的末端真的到达了逻辑日志的始端,将发生以下两种情况之一:

  • FILEGROWTH如果为日志启用了该设置,并且磁盘上有可用空间,则该文件将按FILEGROWTH参数中指定的数量进行扩展,并将新日志记录添加到扩展中。 有关设置的详细信息 FILEGROWTH ,请参阅FILEGROWTH
  • 如果未启用该 FILEGROWTH 设置,或保存日志文件的磁盘的可用空间小于 FILEGROWTH中指定的数量,则会生成9002错误。

日志截断

日志截断主要用于阻止日志填充。 日志截断从 SQL Server 数据库的逻辑事务日志中删除不活动的虚拟日志文件,释放逻辑日志中的空间以便物理事务日志重用这些空间。 如果事务日志从不截断,它最终将填满分配给物理日志文件的所有磁盘空间。 但是,在截断日志前,必须执行检查点操作。 检查点将当前内存中已修改的页(称为“脏页”)和事务日志信息从内存写入磁盘。 执行检查点时,事务日志的不活动部分将标记为可重用。 此后,日志截断可以释放不活动的部分。


下列各图显示了截断前后的事务日志。 第一个图显示了从未截断的事务日志。 当前,逻辑日志使用四个虚拟日志文件。 逻辑日志开始于第一个逻辑日志文件的前面,并结束于虚拟日志 4。 MinLSN 记录位于虚拟日志 3 中。 虚拟日志 1 和虚拟日志 2 仅包含不活动的日志记录。 这些记录可以截断。 虚拟日志 5 仍未使用,不属于当前逻辑日志。

第二个图显示了日志截断后的情形。 已释放虚拟日志 1 和虚拟日志 2 以供重新使用。 现在,逻辑日志开始于虚拟日志 3 的开头。 虚拟日志 5 仍未使用,它不属于当前逻辑日志。


活动日志

日志文件中从 MinLSN 到最后写入的日志记录这一部分称为日志的活动部分,或者称为活动日志。 这是进行数据库完整恢复所需的日志部分。 永远不能截断活动日志的任何部分。 所有的日志记录都必须从 MinLSN 之前的日志部分截断。


下图显示了具有两个活动事务的结束事务日志的简化版本。 检查点记录已压缩成单个记录。


LSN 148 是事务日志中的最后一条记录。 在处理 LSN 147 处记录的检查点时,Tran 1 已经提交,而 Tran 2 是唯一的活动事务。 这就使 Tran 2 的第一条日志记录成为执行最后一个检查点时处于活动状态的事务的最旧日志记录。 使 LSN 142(Tran 2 的开始事务记录)成为 MinLSN。


长时间运行的事务

活动日志必须包括所有未提交事务的每一部分。 如果应用程序开始执行一个事务但未提交或回滚,将会阻止数据库引擎推进 MinLSN。 这可能会导致两种问题:

  • 如果系统在事务执行了许多未提交的修改后关闭,以后重新启动时,恢复阶段所用的时间将比“恢复间隔” 选项指定的时间长得多。
  • 因为不能截断 MinLSN 之后的日志部分,日志可能变得很大。 即使数据库使用的是简单恢复模式,这种情况也有可能出现,在简单恢复模式下,每次执行自动检查点操作时通常都会截断事务日志。

日志截断两种方法

  • 日志备份
  • 更改简单恢复模式

查看日志使用

查看日志状态的三个命令:

  • sys.dm_db_log_info:查看日志详细使用信息
  • sys.dm_db_log_stats:查看日志状态统计信息
  • sys.dm_db_log_space_usage:查看日志空间使用信息


1. sys.dm_db_log_info

-- db02 为示例数据库名称select*from  sys.dm_db_log_info(DB_ID('db02'));

下图为执行结果剪切截图


2. sys.dm_db_log_stats

select*from  sys.dm_db_log_stats(DB_ID('db02'));

3. sys.dm_db_log_space_usage

use db02;SELECT*FROM sys.dm_db_log_space_usage;

总结

  1. 主要查看vlf_status 字段,此字段0不活跃,2为活跃。状态为0的可以重用。
  2. 可以看出,总共有78个VLF 虚拟日志文件。
  3. 其中有27个是活跃的,51个为可以使用的状态。
  4. 日志空间已使用比例 14%
  5. 此时的27个活跃VLF 虚拟日志文件,并非是有活跃事务,只是没有进行日志备份进行截断。

注:虽然现在日志空间只使用了14%,若执行日志收缩操作,不会释放任何空间。因为释放空间,只会释放在文件尾部VLF 状态连续为 0 状态的部分。  

合理日志备份

如上面说明,日志备份是为了及时进行日志截断,达到可以重复使用日志空间。

此时进行日志备份,然后在看日志状态。备份通过RDS 30分钟日志备份自动完成。

  1. 日志备份之后,活跃VLF 只有一个。
  2. 目前还是有78个VLF 虚拟日志文件,并不会减少。
  3. 此时min_lsn 和 end_lsn 都集中在 140 号的VLF 上。
  4. 目前日志空间只有 0.5% 使用率,基本都是空闲的。

执行日志文件收缩操作

use db02;DBCC SHRINKFILE (N'db02_log',0, TRUNCATEONLY)

在日志状态

  1. 日志文件,VLF 140 之后未活跃部分VLF 全部都释放掉了。
  2. 然后VLF 循环使用,VLF end_lsn  移动到了开头的部分。
  3. 日志空间,已经从3GB释放到了300MB。
  4. 此若还需要进行一释放空间,就是要进行日志备份,移动尾部活跃 VLF 位置。
  5. 然后在进行重复收缩操作。

紧急截断收缩操作

背景

有的时候,日志备份增长的非常大了,导致空间被打满,从而严重影响到了业务。

这个需要在等备份和收缩操作,可能由于空间满不无成功,或者需要等待非常久的时间。

就需要紧急截断+收缩空间,恢复业务。

操作

  • 修改简单恢复模式
  • 进行收缩日志文件

注:此操作,非必要,不要进行。

影响:

  • 截断日志,会打断备份链,会影响恢复数据库操作。
  • 高可用版本,还需要额外的重搭镜像流程。(此流程需要进行备份+备库还原操作,期间处于非高可用状态)


查看当前的日志状态

1. 修改简单恢复模式

RDS SQL Server 基础版本

可以直接修改

USE [master]GO
ALTER DATABASE [db02]SET RECOVERY SIMPLE WITH NO_WAIT
GO

RDS SQL Server 高可用版本

需要先关闭镜像,才可以修改简单恢复模式

高可用版本不关闭镜像会报错

修改简单恢复模式时,会抛出异常报错,是因为RDS 有触发器进行限制,禁止设置简单恢复模式。

触发器原理是在修改简单恢复模式时,会自动更回FULL模式

2. 通过查看错误日志可以看触发器操作逻辑

EXEC sp_rds_read_error_logs0,1,'db02';

3.此时在查看日志状态,只有一个活跃VLF

4. 此时进行收缩日志文件

use db02;DBCC SHRINKFILE (N'db02_log',0, TRUNCATEONLY)

5.此时查看日志文件,只剩下8MB大小


参考文档

https://learn.microsoft.com/en-us/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-ver16

https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-log-info-transact-sql?view=sql-server-ver16

https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-log-stats-transact-sql?view=sql-server-ver16


查看SQL Server 错误日志:

https://help.aliyun.com/document_detail/95645.html


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL 存储 关系型数据库
Mysql并发控制和日志
通过深入理解和应用 MySQL 的并发控制和日志管理技术,您可以显著提升数据库系统的效率和稳定性。
27 10
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
142 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
16天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
15天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
55 3
|
18天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
20天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
21天前
|
SQL Oracle 关系型数据库
SQL(MySQL)
SQL语言是指结构化查询语言,是一门ANSI的标准计算机语言,用来访问和操作数据库。 数据库包括SQL server,MySQL和Oracle。(语法大致相同) 创建数据库指令:CRATE DATABASE websecurity; 查看数据库:show datebase; 切换数据库:USE websecurity; 删除数据库:DROP DATABASE websecurity;
|
1月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
1月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
|
1月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的慢查询日志
MySQL的慢查询日志用于记录执行时间超过设定阈值的SQL语句,帮助数据库管理员识别并优化性能问题。通过`mysqldumpslow`工具可查看日志。本文介绍了如何检查、启用及配置慢查询日志,并通过实例演示了慢查询的记录与分析过程。
126 3