我正在设计一个包含两个 SQL Server 的 SQL Server 架构,并计划在两者之间实现数据库镜像。我需要在服务器发生故障时尽量减少数据丢失(无论出于何种原因)。我正在研究不带自动故障转移的 SQL Server 2008 高安全模式。只有一个需要镜像的运行数据库,并且两个服务器将位于同一站点。
在线文档指出,在这种模式下,当主服务器发生故障时,我可以强制镜像成为新的主服务器,但存在丢失数据的风险。那么我的问题是,如果可能发生数据丢失(最小化数据丢失),镜像的意义何在?我该怎么做才能消除(而不是最小化)这种损失?是否有一种模式,主服务器在数据成功写入镜像之前不会提交数据?
此外,SQL 服务器通常由客户端应用程序访问,客户端应用程序将配置为通过名称连接到特定服务器。如果有数据库镜像,应该使用什么服务器名称来访问镜像,客户端是否应该知道镜像服务器的存在?
编辑:应该支持以下场景:
- 主体已关闭 -> 客户端收到 FAIL,我们收到通知,手动中断镜像并使用该镜像作为新的主体,然后在线时建立新的镜像。
- 镜像已关闭 -> 客户端收到 FAIL,我们收到通知,手动中断镜像并在线建立新的镜像。
答案1
SQL Server 2008 有两种操作模式:一种是高安全模式,其中镜像是同步的:事务只有在写入镜像后才会提交。在该模式下,唯一可能丢失的数据是来自未提交的事务。
第二种模式是高性能的。在该模式下,事务会尽快在主服务器上标记为已提交,而无需等待镜像。即使主服务器和镜像服务器之间的连接暂时中断,它也允许系统继续工作,但是,当然,如果您执行手动故障转移,您将丢失尚未复制的所有事务。
请参阅此链接了解详情: http://technet.microsoft.com/en-us/library/ms189852.aspx
答案2
至于允许数据丢失的镜像设置,其代价是性能。也就是说,如果允许数据丢失,客户端应用程序不必等待事务在镜像伙伴处提交,然后才将其视为“完成”。而且,对于许多镜像拓扑,伙伴与主体位于不同的地理区域。因此延迟可能不小。事务在主体处排队,并在可以时交付。但这种交付是异步的。