数据库状态可疑,但 Ola Hallengren 备份作业已成功完成

Dev*_*ava 2 sql-server backup ola-hallengren

我们在我们的 SQL Server 环境中使用Ola Hallengren的SQL Server 备份解决方案。今天,有 2 个数据库处于SUSPECT模式,无法对它们进行备份。一项作业计划备份这些数据库(其中两个处于可疑模式)和另一个数据库。在线数据库的备份已完成,因为它是按字母顺序排列的第一个,对于其他两个,它失败了。但是,作业并没有失败,并且显示作业成功!如果该作业无法备份任何数据库,则该作业应该失败

在此处输入图片说明https://i.stack.imgur.com/n8Ww1.png

来自日志的消息

Date and time: 2018-03-18 03:12:55
Database: [ABC]
Status: SUSPECT
Standby: No
Updateability: READ_WRITE
User access: MULTI_USER
Recovery model: FULL
Differential base LSN: 5334862000009909000054
Last log backup LSN: N/A

Date and time: 2018-03-18 03:12:55
Database: [CDE]
Status: SUSPECT
Standby: No
Updateability: READ_WRITE
User access: MULTI_USER
Recovery model: FULL
Differential base LSN: 4543119000022597000098
Last log backup LSN: N/A

Date and time: 2018-03-18 03:12:55
Run Code Online (Sandbox Code Playgroud)

另一种情况,数据库备份失败但它没有在日志中将其报告为[FAILED],这与在数据库备份成功时记录时不同 - 结果:成功。

我们如何从日志中获取失败备份的信息?没有标签或关键字,可搜索寻找,当备份失败的记录。只有不完整的命令语句可以告诉备份已失败,为此您必须搜索整个日志,并且在我们可以在日志内容中使用关键字搜索失败的概念的情况下,不可能进行任何类型的报告。

如果您能告诉我们这些问题的解决方案,那就太好了。

Sco*_*red 5

您的问题很容易重现。

我使用了创建可疑数据库中的代码在suspect我的本地实例上创建了一个数据库,然后运行了 Ola 的backup脚本。脚本执行没有错误(如您所述)。输出确实将数据库报告为suspect,但脚本没有错误。

Date and time: 2018-03-18 06:20:07
Database: [DemoSuspect]
Status: SUSPECT
Standby: No
Updateability: READ_WRITE
User access: MULTI_USER
Recovery model: SIMPLE
Encrypted: No
Differential base LSN: N/A
Last log backup LSN: N/A
Run Code Online (Sandbox Code Playgroud)

除了不备份suspect数据库之外,Ola Hallengren 的维护解决方案在至少三种情况下不会备份数据库

一个主要由这个职位外卖是:

您应该始终仔细检查msdb 备份历史记录master.dbo.CommandLog表,以确保进行了任何重要的备份。

有多种方法可以使用脚本中的示例来查询成功备份,以检索 SQL Server 数据库备份历史记录和无备份。例如,查找今天尚未备份的任何数据库。

SELECT d.NAME
    ,bck.last_db_backup_date
FROM sys.databases d
LEFT JOIN (
    SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SERVER
        ,msdb.dbo.backupset.database_name
        ,MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date
    FROM msdb.dbo.backupmediafamily
    INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
    WHERE msdb..backupset.type = 'D'
    GROUP BY msdb.dbo.backupset.database_name
    ) bck ON bck.database_name = d.NAME
WHERE bck.last_db_backup_date IS NULL
    OR convert(DATE, bck.last_db_backup_date) <> convert(DATE, sysdatetime())
Run Code Online (Sandbox Code Playgroud)

我的建议是添加一个额外的作业步骤来验证所有数据库都已备份,并在检测到问题情况时强制中止作业。