在将 1.8 TB 大型数据库恢复到另一台服务器时,当恢复完成大约 90% 时,我遇到了此错误消息:
90%已处理完毕。
消息 3013,级别 16,状态 1,第 52 行
RESTORE DATABASE 异常终止。
消息 1204,级别 19,状态 4,第 52 行
SQL Server 数据库引擎实例此时无法获取 LOCK 资源。当活跃用户较少时重新运行您的语句。要求数据库管理员检查该实例的锁和内存配置,或者检查长时间运行的事务。
SELECT [instance]=@@servername,[setting name]=name, value, value_in_use, [description]
FROM sys.configurations
where name in ('min server memory (MB)',
'min memory per query (KB)',
'max server memory (MB)',
'optimize for ad hoc workloads')
SELECT [instance]=@@servername,
cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
CONVERT(decimal(12,2),physical_memory_kb/1024.00/1024.00) AS [Physical Memory (GB)],
affinity_type_desc,
virtual_machine_type_desc,
sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK)
用它来检查sql错误日志,我找不到任何明确的迹象表明上述原因。
EXEC xp_readerrorlog 1
这是我发现的:
Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node. This is an informational message only. No user action is required.
Node configuration: node 0: CPU mask: 0x000000000000000f:0 Active CPU mask: 0x000000000000000f:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
怎样做才能让我的恢复彻底进行而不是中途停止?
我记得我在数据库恢复期间遇到了类似的问题,在我的例子中,它报告每 15-20 分钟运行一次的查询,并占用数十 GB RAM 用于内存授予,以及一些额外的内存用于锁定。这似乎会造成内存压力并破坏数据库恢复。
我的解决方案是暂时禁用报告查询使用的 SQL 帐户,直到数据库恢复完成。
对于您的情况,我建议要么增加到
max server memory
更大的数字,要么阻止用户或应用程序或报告在恢复期间运行大量查询。