本主题讨论对已满事务日志可以采取的几种应对措施,并就以后如何避免出现已满事务日志给出建议。如果事务日志已满,则 SQL Server 数据库引擎会发出 9002 错误。当数据库联机或恢复时,日志可能会满。如果数据库联机时日志已满,则数据库保持联机状态,但是只能进行读取而不能更新。如果恢复过程中日志已满,则数据库引擎将数据库标记为 RESOURCE PENDING。不管哪种情况,都需要用户执行操作才能使日志空间可用。

注意注意

一般来说,事务日志用尽磁盘空间后,仍可以在只读模式下访问数据库。但是,启用快照隔离级别时,如果您正在删除堆(没有聚集索引的表)中的行且事务日志在虚影行的日志记录持久化前填充,则数据库将脱机。如果出现这种情况,数据库将自动重新启动,进行完全恢复后再联机。

应对已满事务日志


正确应对已满事务日志在某种程度上取决于导致日志已满的情况。若要在给定情况下查找阻止日志截断的原因,请使用 sys.database 目录视图的log_reuse_wait 列和 log_reuse_wait_desc 列。有关详细信息,请参阅 sys.databases (Transact-SQL)。有关延迟日志截断的因素的说明,请参阅可能延迟日志截断的因素

重要说明重要提示

如果数据库在恢复过程中出现 9002 错误,则在解决此问题后,可使用 ALTER DATABASE database_name SET ONLINE 恢复数据库。

应对已满事务日志的备选方法包括:

备份日志。

释放磁盘空间以便日志可以自动增长。

将日志文件移到具有足够空间的磁盘驱动器。

增加日志文件的大小。

在其他磁盘上添加日志文件。

完成或取消长时间运行的事务。

下列部分介绍了这些备选方法。请选择最适用于您情况的响应。

备份日志

在完整恢复模式或大容量日志恢复模式下,如果最近尚未备份事务日志,则请立即进行备份以免发生日志截断。如果从未备份日志,则必须创建两个日志备份,以允许数据库引擎将日志截断到上次的备份点。截断日志可释放空间以供新的日志记录使用。若要防止日志再次填满,请经常执行日志备份。  

创建事务日志备份

重要说明重要提示

如果数据库被损坏,请参阅结尾日志备份

如何备份事务日志 (SQL Server Management Studio)

如何创建事务日志备份 (Transact-SQL)

SqlBackup (SMO)

释放磁盘空间

您可以通过删除或移动其他文件的方法来释放包含数据库事务日志文件的磁盘驱动器上的磁盘空间。释放磁盘空间后,恢复系统将自动扩大日志文件。

将日志文件移至其他磁盘

如果在当前包含日志文件的驱动器上无法释放足够的磁盘空间,请考虑将该文件移至空间充足的其他驱动器上。

重要说明重要提示

日志文件决不要放在压缩文件系统中。

移动日志文件

移动数据库文件

增加日志文件的大小

如果日志磁盘上具有可用空间,则可以增加日志文件的大小。日志文件的最大大小是每个日志文件 2 TB。

增加文件大小

如果禁用自动增长,数据库处于联机状态,并且磁盘上有足够的可用空间,则可采用以下方法之一:

手动增加文件大小以生成单个增量。

使用 ALTER DATABASE 语句启用自动增长以针对 FILEGROWTH 选项设置非零增量。

注意注意

不管哪种情况,如果已达到当前大小限制,则应增加 MAXSIZE 值。

在其他磁盘上添加日志文件

使用 ALTER DATABASE <database_name> ADD LOG FILE,向具有足够空间的其他磁盘上的数据库中添加新日志文件。

添加日志文件

添加和删除数据文件和事务日志文件 (Transact-SQL)

如何向数据库中添加数据或日志文件 (SQL Server Management Studio)

标识和管理长时间运行的事务

有关详细信息,请参阅管理长时间运行的事务

请参阅


参考

ALTER DATABASE (Transact-SQL)
sp_add_log_file_recover_suspect_db (Transact-SQL)

概念

管理事务日志文件的大小
创建事务日志备份
可能延迟日志截断的因素
恢复模式概述
事务日志概述
使用事务日志备份

其他资源

管理事务日志