sqlserver收缩事务日志失败

梦莱2年前技术文章639

一、背景

2022.01.12 日晚上,sqlserver实例空间使用率达到85%开始告警。查看发现目前日志空间有较大增长,如下图所示:

图片3.png

与客户方进行反馈,在1月13日中午进行事务日志的收缩操作,发现日志空间并无明显变化。

二、过程

1.通过如下命令,先查看一下空间资源情况,可以找到日志空间(log_size)占用较大的数据库。

select DB_NAME(database_id),
     SUM(case when type=0 then size else 0 end) * 8/1024  data_size,
     sum(case when type=1 then size else 0 end) * 8/1024  log_size,
 SUM(case when type > 1 then size else 0 end) * 8/1024 other_size
 from sys.master_files
 group by DB_NAME(database_id) ;
 #单位 MB

2.查看日志空间占用较大的数据库 事务日志空间服用等待的情况

select name,log_reuse_wait,log_reuse_wait_desc
from sys.databases;

https://help.aliyun.com/document_detail/147053.htm?spm=a2c4g.11186623.0.0.39224a6aT7EfLw

若为 ACTIVE_TRANSACTION 状态是说明存在长活跃会话事务的,这种情况下无法缩容。需要等待长事物执行完成或者手动 kill 掉该 SQL ,再进行缩容。

3.定位慢 SQL 方式如下。该 SQL 可以定位出执行时间超过十分钟的事务 spid,后续可通过 sys.sysprocesses 表查找出该 SQL 对应的具体事务信息,如 hostname、login_time、program_name等,可以反馈给厂商,看是否可以 kill 掉。

SELECT  ST.session_id,ST.transaction_id AS TransactionID ,  
        DB_NAME(DT.database_id) AS DatabaseName ,  
        AT.transaction_begin_time AS TransactionStartTime ,  
        DATEDIFF(minute, AT.transaction_begin_time, GETDATE()) AS Tran_run_time ,  
        CASE AT.transaction_type  
          WHEN 1 THEN 'Read/Write Transaction'  
          WHEN 2 THEN 'Read-Only Transaction'  
          WHEN 3 THEN 'System Transaction'  
          WHEN 4 THEN 'Distributed Transaction'  
        END AS TransactionType ,  
        CASE AT.transaction_state  
          WHEN 0 THEN 'Transaction Not Initialized'  
          WHEN 1 THEN 'Transaction Initialized & Not Started'  
          WHEN 2 THEN 'Active Transaction'  
          WHEN 3 THEN 'Transaction Ended'  
          WHEN 4 THEN 'Distributed Transaction Initiated Commit Process'  
          WHEN 5 THEN 'Transaction in Prepared State & Waiting Resolution'  
          WHEN 6 THEN 'Transaction Committed'  
          WHEN 7 THEN 'Transaction Rolling Back'  
          WHEN 8 THEN 'Transaction Rolled Back'  
        END AS TransactionState  
FROM    sys.dm_tran_session_transactions AS ST  
        INNER JOIN sys.dm_tran_active_transactions AS AT ON ST.transaction_id = AT.transaction_id  
        INNER JOIN sys.dm_tran_database_transactions AS DT ON ST.transaction_id = DT.transaction_id  
WHERE DATEDIFF(minute, AT.transaction_begin_time, GETDATE())>10 -- 找出运行时间大于10分钟的事务
ORDER BY TransactionStartTime  

select * from sys.sysprocesses where spid=138

4.当 log_reuse_wait 状态不再为 ACTIVE_TRANSACTION 时,可再次进行事务收缩重试即可。

注意:如果您的数据库服务器提示事务日志已满,无法通过控制台收缩事务日志,需要您手动执行SQL语句进行处理。收缩事务日志需要占用部分日志空间,所以当日志处于已满状态时只能按命令截断收缩。

 5.当数据库日志已满只能截断日志链收缩,所以会影响备份恢复到这个时间点,但不影响业务,处理前请先备份数据库。具体操作情况如下:

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




相关文章

lru_cache 缓存

Python 语法: @functools.lru_cache(maxsize=128, typed=False)Least-recently-used 装饰器。Iru 最近最少使用、cache 缓存...

hadoop纠删码

hadoop纠删码

纠删码是CDH6/Hadop3引入的新功能,之前的HDFS都是副本方式容错,默认情况下,一个文件有三个副本,可以容忍任意2个副本(Datanode)不可用,是以牺牲空间的代价提供了数据的可用性,带来了...

Doris 介绍及使用场景

Doris 介绍及使用场景

Doris 介绍                    Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据...

某客户k3s网络故障案例

某客户k3s网络故障案例

1、出现问题     在我们吃饭的过程中,小丫告诉我客户的系统出现问题了,我们赶快吃完饭回去帮忙排查。当我们回去的时候,被告知问题已经被修复了,但是问题根源没有找到。故障原因给出的是:  服务重启后对...

prometheus黑盒监控

prometheus黑盒监控

黑盒监控即以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP探针、TCP探针、Dns、Icmp等用于检测站点、服务的可访问性、服务的连通性,以及访问效率等。prometheus提供了bla...

Redis 主从同步

Redis 主从同步

前言在分布式系统中为了解决单点问题,通常会把数据复制到多个副本部署到其它机器,满足故障恢复和负载均衡需求。Redis 也提供了复制功能,实现相同数据多个 Redis 副本。本篇文章介绍如何配置 Red...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。