Sql 将恢复设置为“简单”然后再设置为“完全”是否有害?

Sql 将恢复设置为“简单”然后再设置为“完全”是否有害?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个巨大的交易,涉及超过200万条记录,产生超过400万条记录。为了在失败时回滚,我很犹豫是否将其拆分为多个事务。但是,在测试该事务时,我遇到了一个“log_backup”错误 在做了一些研究之后,这似乎与使用“完整”恢复模型有关,我可以用一个简单的命令将其设置为“简单”。我在交易开始时放置了以下消息: ALTER数据库集恢复简单 在交易结束时,我通过以下方式扭转了这一局面: ALTER数据库集恢复已满 有几个问题: 这是正确的做法吗 这会阻止恢复到该事务之前的状态吗 有没有更好的方法来防

我有一个巨大的交易,涉及超过200万条记录,产生超过400万条记录。为了在失败时回滚,我很犹豫是否将其拆分为多个事务。但是,在测试该事务时,我遇到了一个“log_backup”错误

在做了一些研究之后,这似乎与使用“完整”恢复模型有关,我可以用一个简单的命令将其设置为“简单”。我在交易开始时放置了以下消息:

ALTER数据库集恢复简单

在交易结束时,我通过以下方式扭转了这一局面:

ALTER数据库集恢复已满

有几个问题:

  • 这是正确的做法吗
  • 这会阻止恢复到该事务之前的状态吗
  • 有没有更好的方法来防止对这种大小的事务进行“日志备份”

恢复的两个措施之一是恢复点目标(RPO)†。本质上,这是对数据所有者的一种义务,即“如果我们必须从备份中恢复,我们会丢失多少数据?”。完全恢复模式允许在计划外恢复的情况下几乎不丢失数据,方法是使用日志备份使您尽可能接近导致需要恢复的事件

通过将数据库进行简单恢复,您就消除了安全网。如果在操作过程中发生了一些事情,您唯一的补救办法是在更改恢复模型之前从备份中恢复。 我的建议是将您的操作分成更小的批,并确保您可以执行逻辑回滚。我的意思是,例如,如果您正在更新数据,请在单独的表中跟踪主键和预更新值。这样,如果需要,您可以使用该单独的表将数据恢复到原始状态。类似地,对于插入(跟踪主键值以便可以删除)和删除(移动整行)


†另一个是恢复时间目标(RTO),它是衡量您实际执行恢复所需时间的指标。

恢复的两个指标之一是恢复点目标(RPO)†。本质上,这是对数据所有者的一种义务,即“如果我们必须从备份中恢复,我们会丢失多少数据?”。完全恢复模式允许在计划外恢复的情况下几乎不丢失数据,方法是使用日志备份使您尽可能接近导致需要恢复的事件

通过将数据库进行简单恢复,您就消除了安全网。如果在操作过程中发生了一些事情,您唯一的补救办法是在更改恢复模型之前从备份中恢复。 我的建议是将您的操作分成更小的批,并确保您可以执行逻辑回滚。我的意思是,例如,如果您正在更新数据,请在单独的表中跟踪主键和预更新值。这样,如果需要,您可以使用该单独的表将数据恢复到原始状态。类似地,对于插入(跟踪主键值以便可以删除)和删除(移动整行)


†另一个是恢复时间目标(RTO),它是衡量您实际执行恢复所需时间的指标。

在完整和简单之间切换本身并不有害,但它具有破坏性

从“完全”切换到“简单”将基本上使事务日志无效并清除,因此自上次事务日志备份以来进行的任何事务都将不再可恢复。如果必须这样做,那么我将在更改为“简单”之前进行事务日志备份和数据库备份,以及在更改为“完全”之后立即进行数据库备份

这种情况正是政府的目的。您可以切换到大容量日志模式,运行语句并利用最小日志记录,然后在不中断事务日志备份链的情况下切换回完全恢复(当然,对于最小日志记录的操作,您会丢失一些时间点恢复)。如果您能够满足批量日志记录的要求,这可能是最好的解决方案,但通常是不可能的

如果您不能做到这一点,并且仍然希望使用简单恢复,那么还需要考虑其他因素

如果您运行的是一条涉及200万条记录并创建400万条记录的语句,那么就您将消耗的磁盘空间而言,切换到简单恢复基本上没有任何好处。在简单恢复模式下运行该语句将在事务期间消耗等量的事务日志空间。简单恢复下的事务仍将完全记录,因为整个事务可能会回滚。只是一旦事务被提交并且出现了检查点,日志页就会被标记为空。如果您不关心临时使用的磁盘空间,只是不希望事务显示在事务日志备份中,那么这不是一个大问题

如果您运行的是一个存储过程或一组语句,而不是将整个事务包装在一个事务中,那么您可能会从简单恢复模式中获益,但您可能希望定期发出一个命令来控制日志的使用量。默认情况下,在简单恢复模式下,当日志已满70%时,系统应该发出自动检查点,但根据我的经验,当服务器负载较重时,这并不总是立即发生。如果您只是尽可能快地运行所有内容,服务器可能不会停下来花时间清除日志以便重用,因此它将只使用整个简单文件,展开它,然后继续使用它。完全一样的问题