BACKUP LOG 无法执行,因为当前没有数据库备份

Art*_*rty 5 sql-server-2005 sql-server backup transaction-log

我有一个使用完整恢复模型的 SQL Server 2005 数据库。如果我执行以下命令:

ALTER DATABASE test SET RECOVERY SIMPLE;
ALTER DATABASE test SET RECOVERY FULL;
Run Code Online (Sandbox Code Playgroud)

或者

BACKUP LOG test WITH  truncate_only;
Run Code Online (Sandbox Code Playgroud)

然后尝试运行日志备份:

BACKUP LOG test TO  DISK = 'backupfile.bak'
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

无法执行 BACKUP LOG,因为当前没有数据库备份。

问题

如何在不运行备份日志命令的情况下检查我是否无法进行日志备份?

Rem*_*anu 9

last_log_backup_lsn将在sys.database_recovery_status.


Kin*_*hah 8

您需要先对数据库进行完整备份,然后才能进行日志备份。

执行下面的T-SQL查看是否可以进行日志备份:

SELECT db_name(database_id) as 'database', last_log_backup_lsn 
FROM sys.database_recovery_status
Run Code Online (Sandbox Code Playgroud)

注意: sys.database_recovery_status是一个未记录的系统视图。如果last_log_backup_lsn 的值为 NULL,则表示数据库未维护日志备份序列并处于自动截断模式。请参阅以下 Microsoft 知识库文章:

在备份数据库的事务日志之前,您必须执行完整的数据库备份

下面是来自 SQLSkills脚本,用于检查您的数据库是否处于“伪简单”模式。

USE [msdb];
GO

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = N'SQLskillsIsReallyInFullRecovery')
    DROP FUNCTION [SQLskillsIsReallyInFullRecovery];
GO

CREATE FUNCTION [SQLskillsIsReallyInFullRecovery] (
    @DBName sysname)
RETURNS BIT
AS
BEGIN
    DECLARE @IsReallyFull&nbsp BIT;
    DECLARE @LastLogBackupLSN  NUMERIC (25,0);
    DECLARE @RecoveryModel  TINYINT;

    SELECT
        @LastLogBackupLSN = [last_log_backup_lsn]
    FROM
        sys.database_recovery_status
    WHERE
        [database_id] = DB_ID (@DBName);

    SELECT
        @RecoveryModel = [recovery_model]
    FROM
        sys.databases
    WHERE
        [database_id] = DB_ID (@DBName);

    IF (@RecoveryModel = 1 AND @LastLogBackupLSN IS NOT NULL)
        SELECT @IsReallyFull = 1
    ELSE
        SELECT @IsReallyFull = 0;

    RETURN (@IsReallyFull);
END;
GO
Run Code Online (Sandbox Code Playgroud)