是否可以在日志传送方案中将辅助服务器设置为只读?

时间:2009-12-02 13:18:03

标签: sql-server sql-server-2005 log-shipping

我正在考虑在SQL Server 2005环境中使用日志传送。这个想法是设置频繁的日志传送到辅助服务器。目的:使用辅助服务器提供报告查询,从而卸载主数据库服务器。

我在sqlservercentral forum thread上看到了这个:

创建日志传送时,您有2个选择。您可以使用norecovery或备用选项配置还原日志操作。如果使用norecovery选项,则不能在其上发出select语句。如果您使用备用选项而不是norecovery,则可以在数据库上运行select查询。 在日志文件恢复发生时请记住备用选项,用户将在没有警告的情况下被恢复进程。当您配置带有备用选项的日志传送时,您也可以选择两种选择 - 终止辅助数据库中的所有进程并执行日志还原,或者如果正在使用数据库则不执行日志还原。当然,如果选择第二个选项,如果有人打开与数据库的连接并且没有关闭它,则恢复操作可能永远不会运行,因此最好使用第一个选项。

所以我的问题是:

  • 以上是真的吗?你真的不能按我想要的方式使用日志送货吗?
  • 如果确实如此,有人可以解释为什么在恢复事务日志时不能对数据库执行SELECT语句吗?

修改

第一个问题是this serverfault question的重复。但我还是想回答第二个问题:为什么在恢复事务日志时不能执行SELECT语句?

6 个答案:

答案 0 :(得分:7)

是的,没有。

您可以完全按照自己的意愿执行操作,因为您可以通过将日志传送配置为数据库的只读副本来将报告工作负载卸载到辅助服务器。我以前曾在很多场合设置过这种类型的架构,但确实非常有效。

需要注意的是,为了执行事务日志备份文件的还原,必须没有与该数据库的其他连接。因此,两个选择是,当恢复过程运行时,它将失败,从而优先考虑用户连接,或者通过断开所有用户连接以执行恢复来成功。

取决于您的恢复频率,这不一定是个问题。您只需教育您的用户,即每小时10点钟,您的报告可能会失败。如果发生这种情况,只需重新运行报告即可。

编辑:您可能还想根据业务需求评估替代的architeciture解决方案。例如,具有数据库快照的事务复制或数据库镜像

答案 1 :(得分:7)

  

有人可以解释为什么你不能   执行SELECT语句到   事务日志是的数据库   正在恢复?

简短回答是RESTORE语句对正在恢复的数据库进行独占锁定。

对于写作,我希望我没有必要解释为什么它们与恢复不兼容。为什么它不允许读取?首先,无法知道锁定数据库的会话是进行读取还是写入。但即使可能,恢复(日志或备份)也是直接更新数据库中数据页的操作。由于这些更新直接进入物理位置(页面)并且不遵循逻辑层次结构(metadata-partition-page-row),因此它们不会尊重来自其他数据读取器的可能意图锁定,因此可以更改结构正在阅读。页面next-prev指针后面的SELECT表扫描将被抛入混乱状态,导致读取损坏。

答案 2 :(得分:3)

如果您有企业版,则可以使用数据库镜像+快照创建数据库的只读副本,可用于报告等。镜像使用“连续”日志传送“引擎盖下”。它经常用于您描述的场景中。

答案 3 :(得分:2)

是的,这是真的。

我认为会发生以下情况:
在恢复事务日志时,数据库被锁定,因为大部分数据库正在更新 这是出于性能原因而不是其他任何原因。

我可以看到两个选项:

  1. 使用数据库镜像。
  2. 仅在报告系统未使用时才安排日志传送。

答案 4 :(得分:0)

稍有混淆,恢复上的norecovery标志意味着您的数据库不会退出恢复状态并进入联机状态 - 这就是select语句不起作用的原因 - 数据库处于脱机状态。无恢复标志允许您连续还原多个日志文件(在DR类型方案中),而无需使数据库重新联机。

如果您不想登录/有缺点,可以换成单向事务复制,但开销/设置总体上会更复杂。

答案 5 :(得分:0)

点对点复制是否有效。然后,您可以在一个实例上运行查询,从而节省原始实例的负载。