数据库镜像和数据库快照 (SQL Server)
适用于: SQL Server
可以利用为了实现可用性目标而维护的镜像数据库来减轻报表的负载。 若要将镜像数据库用于报表,可以在镜像数据库中创建数据库快照,并将客户端连接请求定向到最新的快照。 由于数据库快照只在创建快照时存在,因此,它是一个静态的、只读的并与其源数据库保持事务一致的快照。 若要在镜像数据库中创建数据库快照,数据库必须处于同步镜像状态。
与镜像数据库本身不同,客户端可以访问数据库快照。 只要镜像服务器与主体服务器进行通信,就可以将报表客户端连接定向到快照。 注意,由于数据库快照是静态的,因此没有新数据可用。 为了让用户能够使用相对较新的数据,必须定期创建新的数据库快照,并通过应用程序将传入客户端连接定向到最新的快照。
新的数据库快照几乎是空的,但是它会随着越来越多的数据页的首次更新而增长。 由于数据库中的每个快照都以这种方式增长,因此,每个数据库快照与常规数据库使用同样多的资源。 根据镜像服务器和主体服务器的配置,在镜像数据库中保留过多的数据库快照可能会降低主体数据库的性能。 因此,我们建议在镜像数据库中仅保留少量相对较新的快照。 一般情况下,在创建替换快照之后,应重新将传入查询定向到新的快照,并在完成所有当前的查询之后删除较早的快照。
注意
有关数据库快照的详细信息,请参阅数据库快照 (SQL Server)。
如果出现角色切换,则数据库及其快照将重新启动并暂时断开与用户的连接。 然后,数据库快照保留在创建时所在的服务器实例中,并成为新的主体数据库。 用户可以在故障转移后继续使用快照。 但是,这样会给新的主体服务器带来额外的负荷。 如果在您的环境中性能是一个关注点,则我们建议您应在新镜像数据库成为可用后,在其中创建快照,并将客户端重新定向到新快照,同时从以前的镜像数据库中删除所有数据库快照。
注意
对于能很好地向外扩展的专用报告解决方案,可以考虑复制。 有关详细信息,请参阅 SQL Server Replication。
示例
下面的示例将对镜像数据库创建快照。
假定数据库镜像会话的数据库为 AdventureWorks2022
。 此示例在 AdventureWorks
数据库(位于驱动器 F
中)的镜像副本中创建了三个数据库快照。 分别将这些快照命名为 AdventureWorks_0600
、 AdventureWorks_1200
和 AdventureWorks_1800
,以标识它们的近似创建次数。
在
AdventureWorks2022
的镜像中创建第一个数据库快照。CREATE DATABASE AdventureWorks_0600 ON (NAME = 'datafile', FILENAME = 'F:\AdventureWorks_0600.SNP') AS SNAPSHOT OF AdventureWorks2022
在
AdventureWorks2022
的镜像中创建第二个数据库快照。 仍在使用AdventureWorks_0600
的用户可以继续使用它。CREATE DATABASE AdventureWorks_1200 ON (NAME = 'datafile', FILENAME = 'F:\AdventureWorks_1200.SNP') AS SNAPSHOT OF AdventureWorks2022
此时,可以用编程的方式将新客户端连接定向至最新的快照。
在
AdventureWorks2022
的镜像中创建第三个快照。 仍在使用AdventureWorks_0600
或AdventureWorks_1200
的用户可以继续使用它们。CREATE DATABASE AdventureWorks_1800 ON (NAME = 'datafile', FILENAME = 'F:\AdventureWorks_1800.SNP') AS SNAPSHOT OF AdventureWorks2022
此时,可以用编程的方式将新客户端连接定向至最新的快照。