You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSSQL全备份随机耗时激增:SSMS或存储过程是否有排查方法?

排查MSSQL全备份随机变慢的方法

1. 启用备份详细日志与统计

  • 执行备份时添加STATS = 1参数,每完成1%就输出进度,结合时间戳能定位哪段备份过程变慢。可以修改维护计划里的备份步骤,或者用T-SQL语句:
    BACKUP DATABASE [你的数据库名] TO DISK = N'备份路径\文件名.bak' WITH NOFORMAT, NOINIT, NAME = N'数据库名-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 1;
    
  • 查询系统视图获取备份IO统计,对比正常与慢备份的效率差异:
    SELECT 
        database_name,
        backup_start_date,
        backup_finish_date,
        DATEDIFF(SECOND, backup_start_date, backup_finish_date) AS 备份耗时_秒,
        backup_size/1024/1024 AS 备份大小_MB,
        compressed_backup_size/1024/1024 AS 压缩后大小_MB,
        backup_type,
        device_type
    FROM msdb.dbo.backupset 
    WHERE database_name = '你的数据库名'
    ORDER BY backup_start_date DESC;
    

2. 监控备份期间的资源与IO瓶颈

  • 在SSMS的活动监视器里找到备份进程(命令行含BACKUP DATABASE),查看等待类型:
    • WRITELOG:日志写入等待,大概率是磁盘IO瓶颈
    • BACKUPIO:备份IO等待,目标或源磁盘性能不足
    • PAGEIOLATCH_*:数据页读取等待,源磁盘读速变慢
  • 用T-SQL实时查询备份进程的等待统计:
    SELECT 
        session_id,
        wait_type,
        wait_time_ms,
        resource_description
    FROM sys.dm_os_wait_stats
    WHERE session_id = (SELECT spid FROM sys.sysprocesses WHERE cmd LIKE 'BACKUP%');
    
  • 检查磁盘IO延迟,对比备份时段的读写性能:
    SELECT 
        DB_NAME(vfs.database_id) AS 数据库名,
        mf.physical_name,
        vfs.io_stall_read_ms,
        vfs.io_stall_write_ms,
        vfs.num_of_reads,
        vfs.num_of_writes
    FROM sys.dm_io_virtual_file_stats(NULL, NULL) vfs
    JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id;
    

3. 排查系统后台任务

  • 检查凌晨5点左右的Windows定时任务:比如磁盘碎片整理、杀毒扫描、补丁更新、其他系统维护脚本,这些会抢占IO或CPU资源。
  • 查看Windows系统日志,过滤备份时段的警告/错误,比如磁盘超时、RAID控制器告警、存储系统异常记录。

4. 检查备份配置与存储介质

  • 对比正常与慢备份的压缩率,看是否是压缩过程异常:如果备份压缩的compressed_backup_size波动大,可能是数据碎片化导致压缩耗时增加。
  • 确认备份磁盘剩余空间:磁盘空间接近满时,写入速度会骤降,需保证至少有2倍备份文件大小的剩余空间。
  • 测试更换备份存储:比如临时备份到本地磁盘(原先是网络共享的话),排除网络波动;换个磁盘测试,排查硬件间歇性故障。

5. 追踪数据库内部自动任务

  • 检查是否有凌晨运行的SQL作业:比如索引重建、统计信息更新、ETL任务,这些会和备份抢资源。查询作业历史:
    SELECT 
        j.name AS 作业名,
        h.run_date,
        h.run_time,
        h.run_duration,
        h.status
    FROM msdb.dbo.sysjobhistory h
    JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
    WHERE h.run_date = CONVERT(VARCHAR(8), '慢备份日期', 112)
    ORDER BY h.run_time;
    
  • 检查数据库VLF数量:过多虚拟日志文件会拖慢备份日志处理,查询VLF数量:
    DBCC LOGINFO('你的数据库名');
    
    若数量超过100,建议收缩日志后重建日志文件,减少VLF数量。

内容的提问来源于stack exchange,提问作者Franck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:35:21