处理令人心烦的数据库事务日志 (SQL Server Transaction Log Files)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 经常, 我们会被过快增长的数据库事务日志Transaction Log而困扰, 如果我们没有正确及时的处理, 可能会造成数据库交易无法进行, 服务器磁盘空间占光等问题.在SQL Server的使用过程中, 我经常帮助用户和数据库的维护人员处理日志Transaction Log太大后造成的系统瘫痪的问题. 其实这个问题很容易避免. 今天我给大家分享下, 是什么造成了日志增长过大的问题. 和如何避免这种问题再次发生.该文章的语句适用于SQL Server 2015 及其以后的版本每一个数据库至少有两个文件: 一个是数据文件(Data file), 一个是事务日志文件(Transaction

经常, 我们会被过快增长的数据库事务日志Transaction Log而困扰, 如果我们没有正确及时的处理, 可能会造成数据库交易无法进行, 服务器磁盘空间占光等问题.
在SQL Server的使用过程中, 我经常帮助用户和数据库的维护人员处理日志Transaction Log太大后造成的系统瘫痪的问题. 其实这个问题很容易避免. 今天我给大家分享下, 是什么造成了日志增长过大的问题. 和如何避免这种问题再次发生.

该文章的语句适用于SQL Server 2015 及其以后的版本
每一个数据库至少有两个文件: 一个是数据文件(Data file), 一个是事务日志文件(Transaction Log file). 数据文件存储系统和用户的数据, 而事务日志问题存储所有的交易和由这些交易产生的数据库的变更. 随着时间的推移, 越来越多的数据库交易日志被保留下来.

如果你的数据的恢复模式 (Recovery Model) 设为Simple, 那么当交易完成, 系统生成检查点(Checkpoint) 后, 之前的事务日志会被标记为无效, 从而被数据库自动截断.

事务日志备份 Transaction Log Backups
如果你的数据库恢复模式 (Recovery Model) 设为 Full 或 Bulk-Logged (通常数据库的默认恢复模式时 Full), 所以你必须创建日志备 (Log Backup)来控制的事务日志 (注意, 日志备份之前一定要先做全备(Full Backup)).

你可以用一下语句查看你数据库的恢复模式

SELECT name, recovery_model_desc
FROM sys.databases
如果你没有建立日志备份, 用完并失效的日志所占用的空间不会被重用, 那就意味着你的事务日志文件随着交易的发生会越累越大. 你可以通过 database maintenance plan来建立一个定期的日志备份. 一旦有了日志的备份, 占用的日志空间就可以释放出来被下一个交易利用, 这样日志文件就会在控制在一个一个合理的范围.

如果事务日志备份出了问题, 也可能导致事务日志过大, 你可以通过一下语句来查看当前备份的情况.

SELECT name, log_reuse_wait_desc
FROM sys.databases
长时间的活动交易 Long-Running Active Transactions
长时间的持续运行的交易也会阻止事务日志的释放. 有些交易可能需要等待其他用户输入或者其他的资源, 导致交易(Transaction)一直打开, 你可以通过一下语句查看打开的交易.

DBCC OPENTRAN
返回的结果有该交易的会话ID, SPID (Session_id), 你可以 通过一下语句查看该会话执行的详细信息.

EXECUTE sp_who2 spid
如果你想知道更详细的语句, 可以再通过DBCC INPUTBUFFER()来看到完整的执行语句.

DBCC INPUTBUFFER(spid)
日志复制 Transactional Replication
如果你开启的日志复制功能, 基于日志复制的原理, 主Database事务日志在被成功复制到 distributor之前也是不能被截断的. 如果 distributor 端有问题, 导致QQ账号买卖事务日志复制不成功.

你可以通过之前的 DBCC OPENTRAN 检查是否有未完成的交易没有复制成功, 或被打开很长时间.

数据库镜像 Database Mirroring
数据库镜像和日志复制有相似的问题, 如果事务日志不能提交的从数据库 Mirror端, 主数据库Principal的日志也是不是被释放的. 如果那样的话, 你可能需要断掉Mirror, 截断主数据的日志, 然后重做Mirror.

磁盘空间 Disk Space
如果你的服务器磁盘空间不足, 导致事务日志有问题, 但是截断或操作日志有需要额外的空间, 你可能最好的的办法在磁盘空间足够的驱动器上新建一个日志文件, 然后进行后续的截断操作.

ALTER DATABASE your_db_name Add LOG FILE
收缩日志文件 Shrinking the File
一旦你定位了日志增长的问题, 并解决后, 该是收拾"烂摊子", 把日志重新收回到合理值.

你可以用SQL Server Management Studio 右键你的数据库 --> Tasks --> Shrink --> Select Log Files. 或者你用下面的TSQL

SELECT name
FROM sys.database_files
WHERE type_desc = 'LOG'
找到Log File之后, 可以用一下DBCC命令收缩日志到制定的大小, 本例为1G

DBCC SHRINKFILE ('db_log_file_name', 1000) -- Target 1G
写在最后
我列出来一些常见的问题导致事务日志过大的问题, 和常用的解决办法. 除了上述方法, 你最好对的关键数据库的磁盘等关键指标加上阈值报警, 这样才有时间在事情来变得更糟之前解决这些问题.

希望以上能够帮到你.

Make work and life simple.

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
3月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
12天前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
149 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
11天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
12天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
17天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
212 4
|
29天前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
96 8
|
2月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
199 8
|
17天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
2月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
163 0

热门文章

最新文章