Could not redo log record (410417:192254:28), for transaction ID (0:1838907632), on page (1:761914), allocation unit 72057594280869888, database '****' (database ID 5). Page: LSN = (410417:191949:3), allocation unit = 72057594280869888, type = 10. Log: OpCode = 7, context 10, PrevPageLSN: (410417:192254:26). Restore from a backup of the database, or repair the database.
Version:
Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation Enterprise Edition (64-bit)
on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393) (Hypervisor)
从日志上看这个错误经常出在Truncate 表后的 Insert 操作时的首页分配(Allocate First Page)。
SELECT *
FROM fn_dump_dblog ('410417:191949:3', '410417:192254:28', N'DISK', 1, N'E:\BackUp\dbname_2019_05_04_020310_6766368.trn',
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
WHERE [transaction ID] ='0000:6d9b80f0'
每次出现 3456 错误后,从日志上去查看对应的事务信息时,每次对应的对象都是两个物理表(Temp_Table1/Temp_Table2:这两个都用于将内存数据更新到DB时用到的中转表,会频繁的 Truncate—> Insert)。对应的操作都是在Truncate 表后的 Insert 操作时的首页分配(Allocate First Page)。
猜测是频繁 Truncate—> Insert 物理表造成的。将两个中转表改为临时表后问题解决了。
在这个错误之前没有更多可参考的Windows事件日志。我看了每次出错的事务都是在为一个表做第一个数据页分配空间,这个表我们会频繁的Truncate和Insert。我之前两天收缩一次数据库,辅助副本就一两天出一次3456,我现在不收缩数据库了它隔个七八天出一次3456.这都觉得是微软的产品有问题。但不知道怎么解决。这是他们修复3456的更新包在2016 的SP1,但我现在都在SP2了https://support.microsoft.com/en-us/help/3173471/fix-could-not-redo-log-record-error-and-replica-is-suspended-in-sql-se
@小小小蘑菇: 可能是数据库文件有损坏
@dudu: 用 DBCC CHECKDB 检查,没有错误信息返回。
@小小小蘑菇: 如果可行,建议重新安装一个 SQL Server ,然后将数据迁移过去