使用命令 XTP_DB_RECOVERY 的数据库卡在“恢复中”

InM*_*ips 8 sql-server recovery memory-optimized-tables

我们最近将表转换为内存优化数据。我们的备份已经全部膨胀(3x300GB 文件到 3x600GB 的完整文件,3x50GB 到 3x250GB 的差异文件),并且启动越来越慢。

为了避免这些问题,我们将有问题的表转换为 SCHEMA_ONLY 持久性,但现在数据库不会离开“恢复中”状态。

错误日志最初每 20 秒更新一次恢复状态,预测分析需要大约 9 天才能完成,但是大约一个小时后,更新停止了。

SP_WHO2 显示只有一个进程使用命令访问有问题的数据库XTP_DB_RECOVERY,但不SELECT * FROM sys.dm_db_xtp_checkpoint_files返回任何行。

我有什么办法吗?或者如何查看此XTP_DB_RECOVERY命令的估计剩余时间?

小智 -2

它处于恢复状态,因此您需要创建并记录备份。(见下文)

    BACKUP DATABASE [earnings] 
TO DISK = N'c:\sql\earnings.bak' 
    WITH NOFORMAT, NOINIT, NAME = N'earnings-Full Database Backup', 
SKIP, NOREWIND, NOUNLOAD, STATS = 10
    GO

    BACKUP LOG [earnings] 
TO DISK = N'C:\sql\earnings_LogBackup_2018-06-02_12-42-07.bak' 
    WITH NOFORMAT, NOINIT, NAME = N'earnings_LogBackup_2018-06-02_12-42-07', 
SKIP, NOREWIND, NOUNLOAD, STATS = 10
Run Code Online (Sandbox Code Playgroud)

一旦我们有了备份,我们就会恢复备份。

为了恢复完整备份和日志备份,我们需要使用 NORECOVERY 选项进行完整恢复。因此,如果我们只恢复完整备份,如下所示:

RESTORE DATABASE [earnings] 
FROM DISK = N'c:\sql\earnings.bak' WITH NORECOVERY, NOUNLOAD, STATS = 10
Run Code Online (Sandbox Code Playgroud)

数据库现在将处于恢复状态。如果我们忘记恢复额外的备份,数据库将陷入这种模式。

对象资源管理器要完成恢复并访问数据库,我们需要恢复日志备份,如下所示:

RESTORE LOG [earnings]
FROM DISK = N'c:\sql\earnings_LogBackup_2018-06-02_12-42-07.bak'
SQL Server database in RESTORING state after doing backup log with NORECOVERY
Run Code Online (Sandbox Code Playgroud)

数据库处于恢复状态的另一个原因是当您使用 NORECOVERY 选项备份日志尾部时,如下所示。

    BACKUP DATABASE [earnings] 
TO DISK = N'c:\sql\earnings.bak' 
    WITH NOFORMAT, NOINIT,  NAME = N'earnings-Full Database Backup', 
SKIP, NOREWIND, NOUNLOAD, STATS = 10
    GO

    BACKUP LOG [earnings] 
TO DISK = N'C:\sql\earnings_LogBackup_2018-06-02_12-42-07.bak' 
    WITH NOFORMAT, NOINIT, NAME = N'earnings_LogBackup_2018-06-02_12-42-07', 
SKIP, NOREWIND, NOUNLOAD, NORECOVERY, STATS = 10
Run Code Online (Sandbox Code Playgroud)

这将导致数据库更改为恢复状态。

要解决此问题,您可以恢复数据库备份,如上所示。

使处于 RESTORING 状态的 SQL Server 数据库可访问,无需恢复备份
如果数据库陷入恢复状态并且您没有其他备份可恢复,则可以使用以下命令恢复数据库:

RESTORE DATABASE [earnings] WITH RECOVERY
Run Code Online (Sandbox Code Playgroud)

发出此命令后,数据库将可用,但如果不重新开始完整备份,则无法恢复该数据库的任何其他备份。

另请阅读“SQL Server 数据库镜像”。