SQL Server事务日志管理阶梯 - 级别5:以完全恢复模式管理日志

原文链接:Stairway to Transaction Log Management in SQL Server, Level 5: Managing the Log in Full Recovery Mode

作者: Tony Davis,2012年1月27日

文章系列
本文是阶梯系列(Stairway Series)的一部分:SQL Server中事务日志管理的阶梯( Stairway to Transaction Log Management in SQL Server
当事务进展顺利时,没有必要特别注意事务日志的功能或工作方式。 您只需要确信每个数据库都有正确的备份机制。 当出现问题时,了解事务日志对于采取纠正措施非常重要,尤其是在需要对数据库进行时间点恢复时!Tony Davis给出了每个DBA应该知道的正确的细节。

在这一级别中,我们将查看在完全恢复模式下工作时,如何进行日志备份,以及如何使用这些日志备份文件,以及完整数据库备份执行数据库还原。 完全恢复模式支持将数据库恢复到可用日志备份中的任何时间点,并假设可以在故障发生之前直到上次提交事务的时间,进行尾部日志备份。

日志记录了什么?

在完全恢复模式下,所有操作都被完全记录。 对于INSERT,UPDATE和DELETE操作,这意味着对于每个被修改的行,都会有一个日志记录,描述执行该语句的事务的ID,当该事务开始和结束时,哪些页面被更改,数据的更改制作,等等。

对于可以最小化记录的操作SELECT INTO,BULK INSERT和CREATE INDEX在完全恢复模式下工作时,仍然完全记录,但操作略有不同。 受这些操作影响的行不会单独记录; 相反,因为它们被填满,只有数据库页面被记录, 这样可以减少此类操作的日志记录,而同时能确保仍然存在执行回滚,关于重做和时间点恢复所需的所有相同信息。 Kalen Delaney发布了一些关于SELECT INTO(http://sqlblog.com/blogs/kalen_delaney/archive/2011/03/15/what-gets-logged-for-select-into.aspx))和索引重建的日志记录的调查(http://sqlblog.com/blogs/kalen_delaney/archive/2011/03/08/what-gets-logged-for-index-rebuilds.aspx)操作,包括FULL和BULK_LOGGED恢复模式。在BULK_LOGGED模式下工作时,记录最小日志的操作的差异将在第6级 - 管理BULK LOGGED恢复模式中的日志中详细讨论。

为什么要备份事务日志?

在完全恢复模式下,只有日志备份可能导致截断日志。 因此,事务日志将保存自上次备份事务日志以来执行的事务的完整记录。 由于所有操作都被完全记录,因此在繁忙的系统中,日志文件会非常快速地增长。

因此,在完全恢复模式下工作时,除了完全备份和差异备份(可选)之外,还必须执行常规事务日志备份。 许多新手或兼职DBA虽然在其数据库上执行完全备份,但不执行事务日志备份。 因此,事务日志不会被截断,并且它会不断增长,直到它所在的驱动器用完磁盘空间,从而导致SQL Server停止工作。

一旦进行日志备份,就会发生日志截断,假设自上次备份以来发生了检查点,并且没有其他因素延迟截断,例如数据备份或恢复操作。 有关可能延迟截断可恢复VLF的因素的完整列表,以及保留大量日志活动的因素,例如“流氓”,长时间运行的未提交事务或数据库镜像或复制进程,请参阅:http://msdn.microsoft.com/en-gb/library/ms345414.aspx

COPY_ONLY备份事务日志
COPY_ONLY事务日志备份不会截断事务日志。 COPY_ONLY日志备份“独立”存在于正常日志备份方案中; 它不会破坏日志备份链。

简而言之,事务日志备份执行双重目的,即允许还原和恢复到以前的某个时间点,以及控制事务日志的大小。 可能导致事务日志相关问题的最常见原因是:在完全恢复模式下工作,并且根本不进行日志备份,或者不经常使用日志备份来控制事务日志文件的大小。

如果您不确定是否在给定数据库上进行事务日志备份,那么您可以使用类似于下列代码中所示的查询来查询MSDB数据库中的backupset表。

USE msdb ;
SELECT   backup_set_id ,
         backup_start_date ,
         backup_finish_date ,
         backup_size ,
         recovery_model ,
         [type]
FROM     dbo.backupset
WHERE    database_name = 'TestDB'

代码清单:是否正在进行日志备份?

在类型列中,D表示数据库备份,L表示日志备份,I表示差异备份。

请注意,由于可以在不影响备份和还原行为的情况下操作此备份集表中的数据,因此您可能需要通过查询sys.database_recovery_status以查看last_log_backup_lsn 的值,或通过查询sys.databases表查看log_reuse_wait_desc的值(如果需要备份,将返回LOG_BACKUP)。

如何备份事务日志

如前所述,如果没有首先进行至少一次的完整备份,则无法执行事务日志备份。 实际上,如果您的数据库处于完全恢复模式但从未进行过备份,那么它实际上不会在完全恢复模式下工作。 数据库将处于自动截断模式,直到执行第一次完全备份。

使用BACKUP命令执行所有数据库的备份,完整,日志或其他。 该命令接受了许多选项,这些选项在此处记录:http://msdn.microsoft.com/en-us/library/ms186865.aspx 但是,最基本的,通常是如何使用它,执行磁盘完全备份的命令如下:

BACKUP DATABASE DatabaseNameTO DISK ='FileLocation\DatabaseName.bak';

如果这是要执行的第一个备份,将会在指定的目录中创建DatabaseName.bak文件。 如果此类文件已存在,则默认行为是将后续备份附加到该文件。 要覆盖此行为,并规定应覆盖任何现有文件,我们可以使用INIT选项,如下所示:

BACKUP DATABASE DatabaseNameTO DISK ='FileLocation\DatabaseName.bak'WITH INIT;

但最常见的是,每个后续备份都有一个唯一的名称; 更多关于这一点的内容,会在接下来的部分作介绍:恢复到失败点(Restore to Point of failure)。

在每次定期(例如每天)完整备份之后,将会有频繁(例如每小时)的日志备份,其基本命令非常相似:

BACKUP LOG DatabaseNameTO DISK ='FileLocation\DatabaseName_Log.bak';

存储日志备份

显然,备份的数据和日志文件不应存储在托管实时文件的同一驱动器上。 如果该驱动器遭受硬件故障,那么所有副本将与实时文件一起丢失,备份将是徒劳的。 这些文件应备份到单独的设备,或备份到本地镜像驱动器。

日志备份的频率

如前面的级别所述,您可能每15分钟或甚至更频繁地进行日志备份。 在这种情况下,为了避免恢复大量事务日志文件的需要,您可以选择采用备份方案,其中包含着散布有差异备份的完整备份,其中散布着事务日志备份。

实际上,备份方案通常在理想和实际之间,在评估数据丢失的真实风险,公司成本以及降低风险所涉及的成本之间做出妥协。 许多非常重要的业务应用程序使用稍微简单但仍然严格的备份方案,可能涉及定期夜间完整备份以及每小时事务日志备份。

日志备份的频率也可以由数据库所处的事务数量决定。 对于非常繁忙的数据库,可能需要经常备份以控制日志的大小。

没有简单的方法来计算日志备份的频率。 大多数DBA会对日志备份的频率进行最佳估计,然后观察文件的增长特性,然后根据需要,调整备份方案,以防止它们变得过大。

日志链以及如何打破它

如上所述,如果没有首先进行至少一次的完整备份,则无法执行事务日志备份。 为了将数据库恢复到某个时间点,或者在特定日志备份结束时或者在特定日志备份中的某个时间点,必须存在完整的不间断的日志记录链,从第一次日志备份开始,在完整(或差异)备份之后,直到故障点。 这称为日志链。

有许多方法可以打破日志链,如果这样做,则意味着您只能将数据库恢复到在破坏链的事件发生之前进行的日志备份时间点。 简而言之,如果您关心恢复数据的能力,打破链条并不是一个好主意。 打破链条的两种最常见的方法包括:

  • 事务日志备份文件丢失或损坏 - 您只能恢复到上一个良好的日志备份。 日志链将在下一个良好的完整或差异备份时再次启动。
  • 切换到SIMPLE恢复模式 - 如果您从FULL切换到SIMPLE恢复模式,这将打破日志链,因为这将启动检查点,并会立即截断事务日志。 当您返回FULL模式时,您需要进行另一次完整备份以重新启动日志链。 实际上,在进行完全备份之前,数据库将保持自动截断模式,您将无法备份日志文件。

在SQL Server 2008之前,有一些命令,即BACKUP LOG WITH NO_LOGBACKUP LOG WITH TRUNCATE_ONLY(它们在功能上等效),当发出命令时,会强制执行日志文件截断,从而破坏日志链。 您不应该在任何版本的SQL Server中发出这些命令,但是我在这里提到这些命令,因为当他们试图处理“失控的日志文件”时,在不了解这些命令对于数据库恢复的能力的影响的情况下,他们仍然会使用这些命令, 恢复这些版本的SQL Server的数据库的有关更多详细信息,请参阅第8级 - 帮助,我的日志已满

尾部日志备份

只要您拥有最近的完整备份和完整的日志链,就可以在发生任何故障之前将数据库恢复到最近一次日志备份结束时存在的状态。 但是,假设您按小时,每小时进行事务日志备份,并在下午1:45发生故障。 您可能会丢失45分钟的数据; 事实上,如果失败是如此灾难性以至于实时交易日志无法恢复,那么这就是您将失去的数据量。

但是,有时即使数据文件不可用,实时事务日志仍然可用,特别是如果事务日志存储于单独的专用驱动器上。 如果是这种情况,则应备份实时事务日志,即执行自上次日志备份以来生成的日志记录的最终备份。 这将捕获实时日志文件中的剩余日志记录,直至故障点。 这称为尾部日志备份,是在开始还原和恢复操作之前应执行的最后一个操作。

  • 尾部日志备份和最少日志记录的操作
    如果数据文件由于数据库故障而不可用,并且日志的尾部包含最少日志记录的操作,那么将不可能执行尾部日志备份,因为这将需要访问数据文件中更改的数据区段。这将在*第6级(在批量日志模式下管理事务日志)*中详细介绍。

如果您希望恢复的数据库是联机的,那么日志的尾部将备份如下:

BACKUP LOG DatabaseNameTO DISK ='FileLocation\DatabaseName_Log.bak'WITH NORECOVERY

NORECOVERY选项将数据库置于恢复状态,并假设您希望执行的下一个操作是恢复。如果数据库处于脱机状态且无法启动,您仍然应该尝试像刚才描述的那样备份日志尾部(尽管可以省略NORECOVERY选项,因为没有事务在进行中)。

如果您确定日志文件已损坏,则文档建议您尝试使用以下命令执行尾部日志备份作为最后的处理手段:

BACKUP LOG DatabaseNameTO DISK ='FileLocation\DatabaseName_Log.bak'WITH CONTINUE_AFTER_ERROR

如果主数据库和数据文件已损坏,但日志可用,Microsoft建议重新构建主数据库,然后备份最后一个活动日志。 但是,这些主题超出了这个阶层的讨论范围,我建议您参阅文档了解更多细节。见:http://msdn.microsoft.com/en-us/library/ms190952.aspx

执行还原和恢复

执行了尾部日志备份之后,如果可能,下一步是恢复最后一次完整备份(如果合适,后面是差异备份),然后恢复日志备份文件的完整序列,包括尾部日志备份。此还原操作序列的基本语法如下:

RESTORE {DATABASE | LOG} DatabaseNameFROM DISK ='FileLocation\FileName.bak'WITH NORECOVERY;

如果在恢复时省略WITH NORECOVERY选项,那么默认情况下,RESTORE命令将继续恢复。换句话说,SQL Server将尝试协调数据和日志文件,前滚已完成的事务,然后根据需要回滚未完成的事务。通过使用NORECOVERY进行指定,我们向SQL Server指示我们正在进入一个恢复序列,并且在执行回滚之前,必须前滚更多的操作。在还原序列中还原最后一个备份后,数据库可以做如下恢复:

RESTORE DATABASE DatabaseName WITH RECOVERY

一个常见的需求是将数据库恢复到不同的位置,在这种情况下,您可以作为恢复过程的一部分,简单地移动文件,如下所述:http://msdn.microsoft.com/en-us/library/ms190255.aspx

数据库故障后的恢复

下面的示例将描述如何在数据库数据文件不再可访问的情况下恢复数据库。

完全恢复到故障点

假设可能由于硬件故障导致数据库故障后可以访问“实时”事务日志,那么理论上应该可以通过使用以下步骤恢复数据库直到故障点:

  1. 备份日志的尾部
  2. 恢复最近的完整备份(加上差异,如果适用)
  3. 在完全备份(或差异备份)之后,依次执行在失败之前完成的每个事务日志备份的恢复
  4. 还原尾日志备份
  5. 恢复数据库

在线书籍上的许多示例演示了从“备份集”(即存储所有备份的单一“设备”)上的不断恢复。实际上,这意味着,当备份到磁盘时,备份设备是位于磁盘上某个位置的单个.bak文件。

因此,例如在下面代码中显示的简单示例,使用一个由一个完整备份和一个事务日志备份组成的备份集,展示了如何执行完整还原。为了运行这段代码,您首先需要重新创建TestDB数据库,然后插入一些数据行示例(为了方便起见,执行此操作的脚本CreateAndPopulateTestDB.sql,包含在这个阶段级的代码下载中)。您还需要在数据库服务器的本地C:驱动器上创建一个“备份”目录,或者根据需要修改文件路径。

-- Perform a full backup of the Test database
-- The WITH FORMAT option starts a new backup set
-- Be careful, as it will overwrite any existing sets
-- The full backup becomes the first file in the set
BACKUP DATABASE TestDB
TO DISK = 'C:\Backups\TestDB.bak'
WITH FORMAT;
GO

-- Perform a transaction log backup of the Test database
-- This is the second file in the set
BACKUP Log TestDB
TO DISK = 'C:\Backups\TestDB.bak'
GO

-- ....<FAILURE OCCURS HERE>....

-- The RESTORE HEADERONLY command is optional.
-- It simply confirms the files that comprise 
-- the current set
RESTORE HEADERONLY
FROM DISK = 'C:\Backups\TestDB.bak'
GO

-- Back up the tail of the log to prepare for restore
-- This will become the third file of the bakup set
BACKUP Log TestDB
TO DISK = 'C:\Backups\TestDB.bak'
WITH NORECOVERY;
GO

-- Restore the full backup
RESTORE DATABASE TestDB
FROM DISK = 'C:\Backups\TestDB.bak'
WITH FILE=1, NORECOVERY;

-- Apply the transaction log backup
RESTORE LOG TestDB
FROM DISK = 'C:\Backups\TestDB.bak'
WITH FILE=2, NORECOVERY;

-- Apply the tail log backup
RESTORE LOG TestDB
FROM DISK = 'C:\Backups\TestDB.bak'
WITH FILE=3, NORECOVERY;

-- Recover the database
RESTORE DATABASE TestDB
WITH RECOVERY;
GO

代码清单:备份到备份集并从中恢复;不推荐

然而,使用备份集似乎是数据库备份到磁带时代的遗留问题。当备份到磁盘时,使用这种方案是一个坏主意,因为,备份文件当然会迅速增长到非常大。

在实践中,更常见的情况是,每个完整的备份和事务日志备份文件都将单独命名,并且可能会标记备份的时间和日期。例如,大多数第三方备份工具、流行的社区生成的脚本,以及SSMS中的维护计划向导/设计器,都将创建独立的日期戳文件,例如AdventureWorks_FULL_20080904_000001.bak

因此,更常见的备份和恢复方案将使用名称独特的备份,如下列代码所示。

USE master;
BACKUP DATABASE TestDB
TO DISK ='C:\Backups\TestDB.bak'
WITH INIT;
GO

-- Perform a transaction log backup of the Test database
BACKUP Log TestDB
TO DISK ='C:\Backups\TestDB_log.bak'
WITH INIT;
GO

-- ....<FAILURE OCCURS HERE>....

-- Back up the tail of the log to prepare for restore
BACKUP Log TestDB
TO DISK ='C:\Backups\TestDB_taillog.bak'
WITH NORECOVERY, INIT;
GO

-- Restore the full backup
RESTORE DATABASE TestDB
FROM DISK = 'C:\Backups\TestDB.bak'
WITH NORECOVERY;

-- Apply the transaction log backup
RESTORE LOG TestDB
FROM DISK = 'C:\Backups\TestDB_log.bak'
WITH NORECOVERY;

-- Apply the tail log backup
RESTORE LOG TestDB
FROM DISK = 'C:\Backups\TestDB_taillog.bak'
WITH NORECOVERY;

-- Recover the database
RESTORE DATABASE TestDB
WITH RECOVERY;
GO

代码清单:备份和恢复名称独特的备份文件

及时恢复到上次良好的日志备份

不幸的是,有时可能无法执行完全的恢复;例如,如果活动事务日志由于失败而不可用。在这种情况下,我们只需要恢复到最近一次日志备份的末尾。需要为这种可能发生的情况做好准备,即包含事务日志的驱动器出现故障,这决定了日志备份的频率。如果您每15分钟备份一次,那么您将面临15分钟数据丢失的风险。

假设我们已经执行了以下代码中所示的备份序列。为了演示这个示例,我们覆盖了以前的备份文件,备份序列显然比实际要短得多。

-- FULL BACKUP at 2AM
USE master ;
BACKUP DATABASE TestDB
TO DISK = 'C:\Backups\TestDB.bak'
WITH INIT ;
GO

-- LOG BACKUP 1 at 2.15 AM
USE master ;
BACKUP LOG TestDB
TO DISK = 'C:\Backups\TestDB_log.bak'
WITH INIT ;
GO

-- LOG BACKUP 2 at 2.30 AM
USE master ;
BACKUP LOG TestDB
TO DISK = 'C:\Backups\TestDB_log2.bak'
WITH INIT ;
GO

代码清单:一系列简短的日志备份

如果在凌晨2:30之后不久发生灾难性故障,我们可能需要将数据库恢复到日志备份2结束时的状态,即凌晨2:30。

这个例子中的恢复序列与我们之前在备份和恢复名称独特的备份文件的代码中看到的非常相似,但是由于不可能进行尾部备份,而且我们只能恢复到某个点,因此需要使用STOPAT选项,如下列代码所示

--RESTORE Full backup
RESTORE DATABASE TestDB
FROM DISK = 'C:\Backups\TestDB.bak'
WITH NORECOVERY;

--RESTORE Log file 1
RESTORE LOG TestDB
FROM DISK = 'C:\Backups\TestDB_log.bak'
WITH NORECOVERY, STOPAT = 'Jan 01, 2020 12:00 AM';

--RESTORE Log file 2
RESTORE LOG TestDB
FROM DISK = 'C:\Backups\TestDB_Log2.bak'
WITH NORECOVERY, STOPAT = 'Jan 01, 2020 12:00 AM';

--Recover the database
RESTORE DATABASE TestDB
WITH RECOVERY;
GO

代码清单:使用STOPAT恢复到某个时间点

由于我们在将来指定了一个STOPAT时间,因此此代码将前滚所有已完成的事务,直到第二个事务日志结束。

或者,也可以指定一个STOPAT时间,该时间位于特定日志文件中记录的事务的时间范围内。在这种情况下,数据库将恢复到指定时间的最后提交事务。当您知道要恢复到什么时间,但不知道日志备份包含的具体时间时,这种方法非常有用。

也可以恢复到特定的标记事务。例如,当您需要将某个应用程序访问的多个数据库恢复到逻辑一致的点时,这是非常有用的。本文不再进一步讨论这个主题,但是您可以在网上找到更多相关书籍(http://msdn.microsoft.com/en-us/library/ms187014.aspx)并且Mladen Prajdic在这里提供了一个很好的工作示例:(http://weblogs.sqlteam.com/mladenp/archive/2010/10/20/sql-server-transaction-marks-restoring-multi -database -to-a-common.aspx)

“坏事务”后的恢复

在任何数据库失败的上下文之外,可能需要恢复数据库备份和事务日志,以便在进行错误的数据修改(如删除或截断表)之前将数据库及时返回到特定的时间点。

你对这种情况的反应将取决于问题的性质。如果可能,您可以断开所有用户与数据库的连接(在通知他们之后),并评估刚刚发生的事情的影响。在某些情况下,您可能需要估计问题发生的时间,然后使用时间恢复点对数据库和日志进行完全恢复。恢复完成后,您必须通知用户一些事务可能已经丢失,并请求原谅。

当然,通常您无法以这种方式中断正常的业务操作,以修复意外的数据丢失。由于活动数据库仍在运行和被访问,您可以尝试在备用模式下恢复数据库的备份。这允许恢复进一步的日志备份,但与使用NORECOVERY时不同,数据库仍然是可读的。恢复方案可能是这样的:

  1. 在备用模式下,在活动数据库旁边恢复数据库的备份
  2. 将日志前滚到错误事务发生之前的位置,并且数据已丢失
  3. 将丢失的数据复制到活动数据库中,并删除恢复的副本

当然,这个过程不一定是直接的,而且可能相当耗时。除非您购买了专门的日志读取工具,并且可以直接查询日志备份,否则前滚日志可能意味着一系列艰苦的步骤,包括恢复日志、检查数据、进一步恢复等等,直到您确切地知道错误事务发生在哪里。步骤3也可能很困难,因为您将向活动系统中引入不一定与数据库当前状态一致的数据,因此可能存在引用完整性问题。

让我们看一下实现上面步骤1和2的示例。首先,让我们从头开始运行CreateAndPopulateTestDB重新创建TestDB数据库的sql脚本,并将10行测试数据插入新的LogTest表中。在下面代码中,我们只是做了一个完整的数据库备份(覆盖以前的任何备份文件)。如果还没有创建“备份”目录,则需要创建“备份”目录,或者根据需要调整路径。

-- full backup of the database
BACKUP DATABASE TestDB
TO DISK ='C:\Backups\TestDB.bak'
WITH INIT;
GO

代码清单:完整的TestDB备份

然后,我们将一行新的数据插入LogTest表

USE TestDB
GO
INSERT INTO [TestDB].[dbo].[LogTest]
           ([SomeInt]
           ,[SomeLetters2])
     VALUES
           (66666,
           'ST')
           
SELECT * FROM dbo.LogTest

代码清单:向TestDB插入第11行
因此,现在我们有了一个LogTest表中有11行活动TestDB数据库,以及一个有10行备份的版本。现在让我们在日志备份中捕获额外的修改,如以下代码所示

USE master
GO
BACKUP Log TestDB
TO DISK ='C:\Backups\TestDB_log.bak'
WITH INIT;
GO

代码清单:TestDB的日志备份

现在,我们要模拟一个错误的“坏事务”,只需删除LogTest表,然后执行最后的日志备份。

USE TestDB
GO
DROP TABLE dbo.LogTest ;

USE master
GO
BACKUP Log TestDB
TO DISK ='C:\Backups\TestDB_log2.bak'
WITH INIT;
GO

清代码单:灾难!

为了在不中断正常业务操作的情况下检索丢失的数据,我们将在备用模式下恢复TestDB数据库的副本。备用数据库的数据和日志文件(称为ANewTestDB)会被移动到一个“备用”目录(您需要预先创建这个目录)。

-- restore a copy of the TestDB database, called
-- ANewTestDB, in STANDBY mode
USE master ;
GO
RESTORE DATABASE ANewTestDB
   FROM DISK ='C:\Backups\TestDB.bak'
   WITH STANDBY='C:\Backups\ANEWTestDB.bak',
   MOVE 'TestDB_dat' TO 'C:\Standby\ANewTestDB.mdf', 
   MOVE 'TestDB_log' TO 'C:\Standby\ANewTestDB.ldf'
GO

代码清单:在待机模式下恢复TestDB的一个副本

现在我们有了一个新的数据库,名为ANewTestDB,它处于“备用/只读”模式,下如图所示
在这里插入图片描述
图:备用数据库

ANewTestDB数据库中的LogTest表的查询将显示10行。但是,我们希望将表恢复到它被错误删除之前的状态。因此,下一步是将日志备份还原到备用数据库。

USE master
GO
RESTORE LOG ANewTestDB
FROM DISK = 'C:\Backups\TestDB_log.bak'
   WITH STANDBY='C:\Backups\ANewTestDB_log.bak'

代码清单:在备用模式下,将日志备份恢复到ANewTestDB数据库

现在,对ANewTestDB的查询显示了11行,我们现在可以准备将这些数据复制回活动数据库。如果我们进一步恢复第二次日志备份,就会意识到我们做得太过分了,备用数据库中也会丢失表。

另一种备用恢复方法是考虑使用第三方工具,比如Red Gate的SQL Virtual restore,它提供了一种方法,可以将备份挂载为活动的、功能齐全的数据库,而无需物理恢复。

不管DBA喜欢与否,开发人员通常都可以访问生产数据库来执行特定的数据加载和更改。DBA和开发人员的共同责任是确保这些工作顺利进行,从而避免导致需要刚才描述的那种操作的问题。我们将在第6级稍后讨论这个主题—处理批量操作

当然,所需要的赔偿行为的确切性质取决于不良交易的性质。如果表“意外丢失”,那么很可能您将使用备用路由执行恢复。在其他时候,您可能只需要创建一个脚本来“反转”恶意修改即可。

如果损坏只影响到单个列或有限数量的行,那么可以使用SQL Data Compare等工具作为替代,它可以直接与备份文件进行比较,并可以进行行级恢复。

或者,如果您运行SQL Server 2005企业版(或更高版本),并提供最近的数据库快照,您可以运行一个查询检索数据的快照,当它查看当时数据库快照后,然后会写一个更新(UPDATE)或插入(INSERT)命令将数据从数据库快照引入活动,源数据库。

最后,作为最后一种手段,一个专门的日志读取工具可能帮助您逆转事务的影响,尽管我不知道在SQL Server 2005和更高版本中有任何可靠的日志读取工具。

总结

在这个阶段级别中,我们介绍了在完全恢复模式下运行的数据库备份和恢复日志文件的基础知识,这将会是许多生产数据库的标准。

对于大多数DBA来说,执行时间点恢复的需求很少,但是如果有必要,那么执行时间点恢复是非常重要的;DBA的声誉取决于它。

在损坏、驱动器故障等情况下,如果幸运的话,时间点恢复可能涉及备份事务日志的尾部,并且恢复故障点的权限。如果事务日志不可用,或者您正在恢复以便在“坏事务”发生之前恢复到某个时间点,那么情况将变得更加复杂,但希望本步骤中介绍的一些技术将有所帮助。

本文是SQL Server Stairway中的事务日志管理的一部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值