数据库镜像为用户级数据库提供了高可用性,使得SQL Server数据库只有很少或没有非计划的停机时间,其它时间都处于可用状态。


数据库镜像通过将一个服务器上的主数据库,和另一个服务器上的数据库副本的同步,允许数据库冗余,来实现高可用性。这个数据库副本可以用作热备用服务器,使用它可以在任何原因下当主库离线时,做一个快速的故障转移。


与故障转移集群不同,数据库镜像不需要像共享磁盘阵列或SAN那样昂贵的硬件,最低限度下,所需要的就是在同一个网络中的两个SQL Server实例。不过,数据库镜像只能处理用户级数据库,不能镜像系统数据库(master、msdb)。


在SQL Server 2008中引入了数据流压缩、自动页恢复功能,这些新增的功能不需要改变已有的语法,也就是说这些功能都是内置的。

数据库镜像的特点:

1.通过T-SQL完成数据库镜像的安装

2.提供用户数据库级别的保护

3.允许瞬间故障转移

 

其他几种高可用性技术的特点

一、故障转移集群

1.使用两个或更多连接到共享磁盘的节点,专用硬件。将SQL Server实例安装到故障转移集群时,用户数据库、系统数据库文件被安装到共享磁盘,并且常规二进制安装文件被写入参与集群的所有节点(服务器).

2.实例级别的保护

3.由一个物理节点控制SQL Server实例服务,如果这个节点发生故障,导致节点不可用时,集群上的另一个及诶单可以接管SQL Server实例服务,故障转移只需几秒钟

 

二、日志传送

1.需要手动配置

2.数据库级别的保护,包含在一个SQL Server实例中的主在线数据库,以及持续在另一个SQL Server实例上进行恢复的数据库。当在主数据库执行了事务日志备份,事务日志备份被复制到另一个SQL Server实例上,并持续的应用到这个数据库副本中。在主数据库或所在的服务器出现故障的情况下,可以通过对数据库副本,应用最后传送过来的事务日志备份,来使数据库副本联机。

3.故障之后需要调整、切换需要几分钟

 

三、数据库复制

1.根据复制类型,可以通过具体的时间表去推动数据的变化,在数据变化时进行数据迁移,或者在多个数据源中同步数据变化。但只以较小形式提供高可用性,只关注特定的数据库对象和数据,不允许自动传送所有的数据库对象类型

2.只能对特定的对象、数据提供保护,无法体统相同的数据库副本

3.通过去拉或推特定的数据库对象

 

数据库镜像体系结构

数据库镜像提供了主服务器角色、镜像服务器角色、一个可选的见证服务器。

 

主体服务器角色和镜像服务器角色的转换:主体服务器中的数据库是实际被使用的,并且事务应用在主体服务器的数据库上,它们也被提交到镜像服务器的数据库上。镜像服务器数据库被置为恢复状态,在数据库副本上接收更新,但在主体数据库仍然可用的情况下,是不能使用镜像服务器的。当主体数据库发生了问题,引起了故障,那么镜像服务器可以转换为主数据库角色。当另一个数据库,也就是原来的主体数据库,回到联机状态,那么会转换为镜像数据库角色,接收现在的主体服务器发送的事务。

 

见证服务器:从主体数据库到镜像数据库的故障转移可以通过手动或自动的方式来初始化,这是由数据库的镜像模式决定的。如果需要自动故障转移,必须将第三个服务器作为见证服务器加入到镜像会话中。见证服务器监视主体服务器、镜像服务器。在数据库镜像会话中包括了主体、镜像、见证,两个或3个相连接的服务器就可以生成关于是否进行自动故障转移的决策,称为仲裁。

 

数据库镜像会话运行模式:可以在通过或异步模式下运行。当处于同步模式时,写入主体服务器数据库的事务,在任何包含的事务被提交之前,也必须写入镜像服务器数据库,这个选项保证了数据的冗余,当然,也带来了潜在的性能降低。异步模式在真正将事务写入镜像服务器数据库之前,允许主体数据库镜像会话提交事务,这个选项允许主体数据库更快的完成事务,但在更新被映射到镜像数据库之前,如果主体服务器发生故障,就会引发丢失事务的危险。

 

当发生故障时,SQL Server保留了应用程序和客户端到主体数据库的连通性,允许.NET应用程序重定向。在.net中使用SQL Native Client去连接镜像数据库,也就是被配置为知道镜像数据库的位置。可以在连接字符串中同时指定主体和镜像SQLServer实例来使用SQL Native Client,当主数据库不可用时,可以使应用程序连接,透明的重定向到新的的主体服务器。

 

最近在设置数据库镜像时遇到了验证的问题,我有2台笔记本,一台是windows xp,一台是win 7,这时不能通过windows ntlm,也就是windows身份验证来登录到另一台机器上。

 

由此我想到,在进行远程桌面登录,比如平时工作时,通过远程桌面登录到远程服务器上时,可以通过输入远程服务器的ip地址、用户名、密码来登录,为什么数据库镜像在连接远程的数据库实例时,不能通过提供一个用户名和密码,就能登录到远程的数据库镜像呢?

 

而必须要建立一个域,用域用户来登录呢? 似乎不太灵活,如果只需要提供对方数据库镜像的用户名和密码,这样就会很灵活,也就是绕过windows操作系统本身的验证,只要有相应的端口在监听,对方只需要有正确的用户名和密码,就可以登录,这样才更加灵活。

 

配置数据库镜像,一般都通过证书来进行验证。