此环境是AlwaysOn环境,主副本是01,辅助副本是02和03。
今早收到磁盘告警,提示01、02两节点事务日志盘空间不足。
于是检查发现01从昨日开始,定时事务日志收缩均未成功。
我的存储过程中,日志备份和收缩是连着执行的:
/****** Object: StoredProcedure [dbo].[DB_Backup_Log] Script Date: 2024/10/11 10:49:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
------------------------------------------------
CREATE PROCEDURE [dbo].[DB_Backup_Log]
AS
/*******************************************************************************************
<Create By> : wenjie.wang
<Create Date> : 2021_03_16
********************************************************************************************/
DECLARE @DBName VARCHAR (50)
SELECT @DBName=DB_NAME()
DECLARE @FullFileName VARCHAR(200)
DECLARE @FileFlag VARCHAR(20)
DECLARE @Hour VARCHAR(2)
SET @FileFlag='Log_'+CONVERT(CHAR(8),GETDATE(),112)
SET @Hour = DATENAME(HH,GETDATE())
IF LEN(@Hour) = 1
BEGIN
SET @Hour = '0'+@Hour
End
SET @FileFlag = @FileFlag +@Hour
SET @FullFileName='Z:\backup\log\'+@DBName+@FileFlag+'.BAK'
BackUp Log @DBName To Disk=@FullFileName with noinit
WaitFor Delay '00:00:5' ---Wait for I/0
DECLARE @sql nvarchar(500)
SET @sql = 'DBCC Shrinkfile([' + @DBName +'_log],100)'
--此处收缩时如果逻辑名不一致会报8985的报错,可用select * from sys.database_files查看并替换
--Execute master..xp_cmdshell @sql
exec (@sql)
WaitFor Delay '00:00:5' ---Wait for I/0
--Delete local old backup file
DECLARE @SQLStr varchar(300)
DECLARE @RemoteFileName varchar(200)
SET @FileFlag='Log_'+CONVERT(char(8),DATEADD(HOUR,-72,GETDATE()),112) + +@Hour
SET @RemoteFileName='Z:\backup\log\'+@DBName+@FileFlag+'.BAK'
SET @SQLStr='Del '+@RemoteFileName
Execute master..xp_cmdshell @SQLStr
---------------------------------------------'
GO
且agent是每小时调用一次,连续执行两遍这个存储过程:
exec DB_Backup_Log
exec DB_Backup_Log
正常情况下应该不会长时间无法截断,而导致无法收缩。
转念一想,为什么03节点未告警呢?会不会是集群故障导致?
于是检查有没有什么东西阻止了日志的截断:
select log_reuse_wait , log_reuse_wait_desc
from sys.databases
发现log_reuse_wait_desc列中果然有replica相关内容,故检查03节点出现了同步问题,但是未收到告警(后续再排查)。
由于生产环境,先将03节点踢出AG组,然后再次检查,log_reuse_wait_desc已经没有replica相关内容,而变为日志备份了。
此后重新执行日志备份收缩,恢复正常。
03节点通过备份还原重新加入AG。
检查库恢复情况:
SELECT
dc.database_name,
d.synchronization_health_desc,
d.synchronization_state_desc,
d.database_state_desc
FROM
sys.dm_hadr_database_replica_states d
JOIN sys.availability_databases_cluster dc ON d.group_database_id = dc.group_database_id
AND d.is_local = 1
最后修改时间:2024-12-10 10:58:19
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




