症状
假设你在 Microsoft SQL Server 2012 或 SQL Server 2014 数据库中使用 AlwaysOn 可用性组,并且存在大量打开的活动事务,并且需要额外的日志空间。 当日志文件由于以下原因之一而无法增长时,事务将失败。
-
缺少额外的文件空间
-
日志文件配置为不增长
-
日志文件已达到其配置的最大大小
此外,你还会收到以下错误消息:
错误:9002,严重性:17,状态: 9. 数据库 ' <数据库名称> "的事务日志因" LOG_BACKUP "已满。
运行日志备份后,收到另一个9002错误消息:
错误:9002,严重性:17,状态: 9. 数据库 ' <数据库名称> "的事务日志因" ACTIVE_TRANSACTION "已满。
在其他日志备份之后,你将收到另一个9002错误消息,后跟5901错误消息:
错误:9002,严重性:17,状态: 9. 数据库 ' <数据库名称> "的事务日志因" AVAILABILITY_REPLICA "已满。
无法在数据库 <数据库名称> 中写入检查点记录,因为日志空间不足。 请与数据库管理员联系以截断日志或为数据库日志文件分配更多空间。错误:5901,严重性:16,状态: 1. 属于数据库 ' <数据库名称> ' 的一个或多个恢复单元无法生成检查点。 这通常是由于缺少系统资源(如磁盘或内存)导致的,或者在某些情况下由于数据库损坏导致的。 有关此失败的详细信息,请查看错误日志中以前的条目。
在事务回滚期间执行后续的检查点或日志备份时,你可能会收到以下错误消息:
消息3052、级别16、状态1、行4BACKUP 日志无法记录数据库 ' <数据库名称> ' 的更新。 在将日志空间提供给日志空间供日志记录后,将需要进行后续的日志备份,以便将备份点从 "<lsn id 1>" 提升到 "<lsn id 2>"。
收到这些消息时,您将无法再向数据库提交任何新事务,也不能增大日志文件或添加其他日志文件。
解决方案
在以下 SQL Server 累积更新中首先修复此问题:
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 我们建议你下载并安装 SQL Server 的最新累积更新:
解决方法
你可以使用以下解决方法来截断日志和恢复活动。
-
检查每个辅助副本以验证辅助副本 last_hardened_lsn (请参阅 sys.dm_hadr_database_replica_states)是否与主副本 last_hardened_lsn相匹配。 你可以通过运行连接了主副本实例的以下查询来执行此操作
SELECT ags.name as AGGroupName, ar.replica_server_name as InstanceName, hars.role_desc, db_name(drs.database_id)as DBName, drs.last_hardened_lsn, drs.log_send_queue_size, drs.synchronization_state_desc as SyncState, ar.availability_mode_desc as SyncMode, CASE drs.is_local WHEN 1 THEN drs.database_id ELSE NULL END as database_id FROM sys.dm_hadr_database_replica_states drs LEFT JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id LEFT JOIN sys.availability_groups ags ON ar.group_id = ags.group_id LEFT JOIN sys.dm_hadr_availability_replica_states hars ON ar.group_id = hars.group_id and ar.replica_id = hars.replica_id WHERE db_name(drs.database_id) = '<database name>'
-
在主副本上
-
从可用性组中删除数据库。
-
将数据库重新添加到可用性组。
-
-
在每个辅助副本上
-
将数据库重新添加到可用性组。
-
通过从可用性组中删除数据库,它将立即截断其日志并释放日志空间。如果每个辅助副本上的 last_hardened_lsn 与主副本相同,并且在从可用性组中删除数据库并在每个辅助数据库上重新添加数据库期间未执行任何日志备份,则会成功重新添加辅助副本,而不会发生任何错误或必须在辅助数据库上还原日志备份。如果辅助副本与主副本不是最新的,并且你必须从可用性组中删除该数据库,然后才能将其从可用性组中删除,则该辅助副本可能必须在将日志备份重新添加到可用性组之前将其捕获,或者将数据库放在辅助副本上,然后使用完整的事务日志数据库备份重新播种它。
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。