
上得来终觉浅绝知此事要躬行。嗨大家好我是码农刚子。image现象所有功能界面操作长时间无响应提示数据库ERPData的事务日志已满。若要查明无法重用日志中的空间的原因请參阅sys.databases 中的 log_reuse_wait_desc 列。首先检查了服务器的磁盘空间和内存使用量空间都是足够的。接下来分析错误提示。看到这个错误提示说明你的SQL Server 2008数据库“ERPData”的事务日志已经满了新的事务无法写入。错误信息里其实已经给出了排查思路重点查看 sys.databases 中的 log_reuse_wait_desc 列它能告诉你日志空间为什么无法被重用。第一步执行诊断SQL定位根本原因打开SQL Server Management Studio (SSMS) 登录并连接到对应的实例并运行以下查询SELECT [name] ,[database_id] ,[log_reuse_wait_desc] FROM [sys].[databases]WHERE [name] ERPData;重点关注 log_reuse_wait_desc 列返回的值它将直接指示问题所在。第二步解读查询结果与解决方案查询会返回一个状态值以下是针对 SQL Server 2008 最常见的几种状态及其含义和解决办法log_reuse_wait_desc 值含义解释推荐解决方案NOTHING这通常意味着当前就有可重用的空间但日志文件可能因为初始设置过大或之前未收缩而占据了大量磁盘空间。你可以直接进行日志收缩来释放空间给操作系统。可以参考下文“通用解决步骤”中的方法。LOG_BACKUP这是最常见的原因。数据库处于完整恢复模式但你从未或很久没有备份事务日志了。日志文件在备份之前不会自动截断导致空间持续增长直至占满。立即执行一次事务日志备份。备份完成后日志中不活动的部分就会被截断空间就能被重用。备份语句示例BACKUP LOG [数据库名称] TO DISK D:\backup\data1_log_backup.trnACTIVE_TRANSACTION有一个长时间运行且未提交的事务。这可能是一个未提交的BEGIN TRAN或者一个正在回滚的大型事务。从该事务开始后的所有日志记录都必须保留因此日志无法截断。需要找到并处理这个“活跃事务”。你可以使用 DBCC OPENTRAN (数据库名称)命令来查看最早的一个活动事务的信息。根据结果要么提交它COMMIT要么回滚它ROLLBACK或者联系相关应用开发者。CHECKPOINT自上次日志截断后还没有发生检查点Checkpoint这通常是暂时性的。在活动量大的数据库中偶尔出现。通常等待系统自动发出检查点即可一般不会持续太久。如果长时间停留在此状态可以手动执行一次检查点CHECKPOINT。REPLICATION或DATABASE_MIRRORING与复制或镜像相关的事务日志记录还未被传递到分发数据库或镜像数据库。需要检查复制或镜像的配置和运行状态。可能因为网络或性能问题导致同步延迟需要修复这些组件间的同步。第三步通用解决步骤收缩日志文件无论原因为何当你确认问题已解决例如完成了日志备份或结束了长时间运行的事务之后如果日志文件的物理尺寸仍然很大你可以通过以下步骤将其收缩以释放磁盘空间。方法一使用T-SQL命令推荐便于操作和自动化复制代码-- 1. 将恢复模式切换为“简单”以截断日志ALTER DATABASE [数据库名称] SET RECOVERY SIMPLE;GO-- 2. 收缩日志文件。需要先知道日志文件的逻辑名称可通过下面命令查询-- SELECT file_id, name FROM sys.database_files;-- 假设日志逻辑文件名为 数据库名称_LogDBCC SHRINKFILE (N数据库名称_Log , 1, TRUNCATEONLY);GO-- 3. 将恢复模式恢复为“完整”如果业务需要ALTER DATABASE [数据库名称] SET RECOVERY FULL;GO复制代码特别提醒切换恢复模式会打断日志链影响数据库基于时间点的恢复能力。请在操作后立即进行一次完整备份。方法二使用SSMS图形化界面右键点击数据库 ERPData 属性 选项将恢复模式改为简单然后点击“确定”。再次右键点击数据库 任务收缩文件。在“文件类型”下拉框中选择“日志”。选择“释放未使用的空间”或指定一个目标大小点击“确定”。收缩完成后记得按照步骤1的方法将恢复模式改回“完整”。以上通用方法是针对 log_reuse_wait_desc 值为 LOG_BACKUP 时的常见问题。而我执行第一步中的sql 查询后log_reuse_wait_desc 值为 ACTIVE_TRANSACTION。这表明数据库中有一个长时间运行且尚未提交或回滚的事务。这个事务阻止了事务日志的截断导致日志文件持续增长直至占满。解决log_reuse_wait_desc 值为 ACTIVE_TRANSACTION要解决这个问题就需要找到这个活跃事务的具体信息然后根据情况决定是提交、回滚还是等待它自然完成。第一步查找最旧的活跃事务运行以下命令来查看数据库 ERPData 中最早的一个活动事务1DBCC OPENTRAN (ERPData);该命令会返回类似以下的信息事务的活动时间例如2015-03-03 10:30:00发起事务的 SPID服务器进程ID事务名称如果有事务的 SID用户IDimageSPID 就是你要找的进程ID可以进一步查看这个连接正在执行什么语句。第二步根据SPID获取详细信息使用 sp_who2 或 sys.sysprocesses 查看该SPID的详细信息-- 方法1使用 sp_who2结果更易读EXEC sp_who2 64; -- 将64替换为实际的SPID-- 方法2查询 sys.sysprocessesSELECT * FROM sys.sysprocesses WHERE spid 64;重点关注loginame哪个登录用户发起的。hostname从哪台机器发起的。lastwaittype当前等待类型如果是正在回滚可能看到ROLLBACK。cmd正在执行的命令如果是AWAITING COMMAND可能只是空闲连接但依然持有事务也可能是SELECT等。dbid确认确实是当前数据库。诨不纠歉