症状
请考虑以下情况:
-
您使用的是 Microsoft SQL Server 2016、2014或2012。
-
你有一个数据库,它是 AlwaysOn 可用性组的一部分。
-
在主副本上,收缩数据库文件以减小其大小。
-
主副本将事务日志中记录的所有更改发送到辅助副本。
-
在辅助副本上,"恢复" 线程将事务日志中的更改应用到属于可用性组的数据库。
在此方案中,副本已暂停。此外,你可能会收到类似于以下内容的错误消息:
<时间戳> spid41s 错误:3456,严重性:21,状态:1。 <时间戳> spid41s 无法恢复日志记录(#),对于事务 ID (#),在页面(#)上,数据库 ' <dbname> ' (数据库 ID #)。 Page: LSN = (#),分配单位 = #,type = #。 日志: OpCode = #、context #、PrevPageLSN:(#)。 从数据库备份还原或修复数据库。 <时间戳> spid41s AlwaysOn 可用性组数据库 ' <dbname> ' 的数据移动已暂停,原因如下: "system" (源 ID 2;源字符串: "SUSPEND_FROM_REDO")。 若要恢复数据库中的数据移动,需要手动恢复数据库。 有关如何恢复可用性数据库的信息,请参阅 SQL Server 联机丛书。 <时间戳> spid41s 错误:3313,严重性:21,状态: 2. 在数据库 ' <dbname> ' 中重做记录的操作期间,<的时间戳> spid41s,在日志记录 ID (#)处出现错误。 通常,特定故障以前作为 Windows 事件日志服务中的错误登录。 从完整备份还原数据库,或修复数据库。
原因
如果数据库引擎在系统页面(GAM、PFS)上遇到顺序 LSNs,则在恢复过程中应用更改时会出现此问题。
解决方案
在以下 SQL Server 累积更新中首先修复此问题:
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 我们建议你下载并安装 SQL Server 的最新累积更新:
此更新可防止出现此问题。 如果问题已出现,请按照以下步骤重新加入 AlwaysOn 可用性组:
-
删除现有的 AlwaysOn 辅助副本。
-
对受影响的数据文件运行以下命令以从数据库中删除未分配的空间:
DBCC SHRINKFILE(<file_id>, TRUNCATEONLY)
-
备份数据库和日志文件。
-
还原 AlwaysOn 辅助副本上的数据库和日志。
-
加入 "AlwaysOn 可用性" 组。
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。
参考
了解 Microsoft 用于描述软件更新的 术语 。