当前位置:17727 > 数据库信息 > 高可用镜像,的注意事项

高可用镜像,的注意事项

文章作者:数据库信息 上传时间:2019-12-09

一、什么是数据库镜像

    基本软件的高可用性解决方案

  快速的故障转移恢复(3秒转移),低硬件成本

  基于数据库级别的实现

一、准备工作:

最初在为公司设计SQLServer数据库镜像的时候,首先考虑的是高可用性(三台计算机,一台见证服务器,一台做主数据库,一台做镜像)

注意事项:

二、数据库镜像中的服务器角色

        主体服务器

    承载主体数据库

    接受用户连接和事务处理请求

        镜像服务器

    承载镜像数据库

    作为主体数据库的热备份(主体数据库的变化及时传到镜像数据库中)

    仅在故障转移后接受用户连接,事务处理请求。

        见证服务器(监视)

    监视服务器状态和连接性,实现自动自动故障转移

3台服务器同版本,硬盘分区大小相同,安装相同版本数据库软件。

在虚拟机环境下部署成功,一切都是那么的完美。 故障转移3秒之内就可以顺利完成。

  • Sqlserver 标准版企业版 才支持Mirror
  • Sp1之后默认是启用的(可用以生产),初始版必须打开1400跟踪选项(实验目的)
  • 工作组模式下windows的计算机名中必须带有DNS后缀, 默认是没有的.所以请修改计算机名称配置,重启!
  • 工作组模式下windows的hosts文件必须添加对计算机名的本地解析
  • 工作组模式下Sqlserver服务的启动账户必须是adminstrators的成员而不能是本地系统账户,且Mirror所涉及的实例必须采用相同的:账号密码
  • 工作组模式下Sqlserver服务的启动账户必须是adminstrators的成员而不能是本地系统账户,且Mirror所涉及的实例所采用的 账号密码 必须在所有windows中存在且相同,即可以采用多个账号,但是不是多余了?(看上一条注意点)
  • Mirror数据库必须和原始数据库同名
  • Mirror数据库必须处于 norecovery 状态
  • Mirror数据库必须应用了所有的Log备份(即必须和主数据库还原点相同), 特别注意,无论数据库备份是不是最新的备份,也要在主数据库上备份一个Log并应用的Mirror数据库上!!!!
  • 强烈推荐 Mirror数据库 和 主数据库的文件结构(目录结构,磁盘分区等)完全一致, 否则以后涉及到主数据库文件变更的操作会使镜像失败!!!
  • SMS的镜像向导总是使用windows身份验证方式创建endpoint连接

三、数据库镜像会话

  会话初始化

    镜像请求事务日志记录,与主体服务器实现同步

  会话过程

    主体服务器将日志记录传输给镜像服务器

    各个角色之间相互监视会话状态

       会话终结

    发生故障转移

    管理员终止数据库镜像

host中分别标注3台服务器IP和主机名称.

1.高可用性的实施代码:

特别提示:

四 数据库镜像三种模式

操作模式 事务安全 传输机制 是否需要仲裁 见证服务器 故障转移类型
高可用 Full 同步 Y Y 自动或手动
高级别保护 Full 同步 Y N 仅手动
高性能 OFF 异步 N N/A 仅强制

  高可用:要求高服务可用性, 要求实现自动故障转移,确保数据的完整。

  高级别保护模式: 数据完整性要求,不要求自动故障转移,对服务的可用性要求较低。

       高性能保护模式:主体服务器和镜像服务器距离很远,通讯链路有明显的延迟,对性能的事要求高于数据的完整性。

主体服务器上创建数据库,并进行完整备份数据库和数据库事务。

www.17727.com 1www.17727.com 2主体数据库
/********************************************************
此脚本在主体服务器执行
********************************************************/
--镜像只支持完全恢复模式,在备份数据库之前检查恢复的模式
--对要镜像的数据库进行完整备份后,复制到镜像数据库以NORECOVERNY选项进行恢复
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO
--为此服务器实例制作一个证书。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert 
   WITH SUBJECT = 'HOST_A certificate',START_DATE  = '01/01/2009';
GO 
--使用该证书为服务器实例创建一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_Mirroring
   STATE = STARTED
   AS TCP (
      LISTENER_PORT=5022
      , LISTENER_IP = ALL
   ) 
   FOR DATABASE_MIRRORING ( 
      AUTHENTICATION = CERTIFICATE HOST_A_cert
      , ENCRYPTION = REQUIRED ALGORITHM AES
      , ROLE = PARTNER
   );
GO

  1. 镜像建立后,主数据库可以执行 backup database backup log操作,而不用担心会是镜像中断
  2. 可以临时暂停镜像,稍后继续镜像. 暂停期间主数据库可以执行 backup database backup log操作,而不用担心会是镜像中断
  3. 可以取消镜像,然后从取消后(断点)重新设置镜像. 但切记主数据库 [不要执行] backup database backup log操作,否则你死了!
  4. ...

 五   配置演示

        环境: 数据库版本 sqlserver 2012  系统版本windows server 2008 R2 域管理

        mirroring测试场景

              主体服务器--FETCHINGDATA49MSSQLSERVERTWO   tcp 5022 端口

              镜像服务器--172.168.18.132MSSQLSERVER2012  tcp 5022 端口   

              见证服务器--FETCHINGDATA49 

            镜像操作模式: 高可用. 事务安全:Full,传输机制:同步,是否仲裁:Y,见证服务器:Y,故障转移:自动。

--步骤(1) 【主体服务器】设置为完整恢复模式,  做一次完整备份和日志备份
ALTER DATABASE Mirroring_Test SET  RECOVERY FULL 
backup database Mirroring_Test to disk='C:dataMirroring_Test.bak' with init
backup log  Mirroring_Test to disk='C:dataMirroring_Test.bak'  

  

--步骤(2) 【镜像服务器】还原到镜像库上(将备份文件复制到镜像服务器目录还原)
--运行下面语句,使之创建镜像数据库,处于正在还原状态并且是覆盖。
 restore database Mirroring_Test from disk='D:dataMirroring_Test.bak' 
 with file=1,
 move N'Mirroring_Test' To N'D:dataMirroring_Test.mdf',
  move N'Mirroring_Test_log' To N'D:dataMirroring_Test_log.ldf',
  norecovery, replace

 restore log Mirroring_Test  from disk='D:dataMirroring_Test.bak' with file=2,norecovery

    www.17727.com 3

      在各服务器创建各端口

--步骤(3) 创建端点  【主体服务器】创建端点用于伙伴通讯,激活端点
create endpoint Mirroring_Test
as TCP (listener_port=5022)
for database_mirroring(role=partner,Encryption=supported)

-- 【镜像服务器】创建端点用于伙伴通讯,激活端点
create endpoint Mirroring_Test
as TCP (listener_port=5022)
for database_mirroring(role=partner,Encryption=supported)

--【见证服务器】创建端点用于见证通讯,激活端点
create endpoint Mirroring_Test
as TCP (listener_port=5023)
for database_mirroring(role=witness,Encryption=supported)

   www.17727.com 4

     步骤4 创建connect(连接)权限。为三个数据库实例设置相同的账户名称和口令

           www.17727.com 5

       www.17727.com 6

        www.17727.com 7

         www.17727.com 8

         www.17727.com 9

           步骤(5) 【主体服务器】配置镜像向导

           www.17727.com 10

           www.17727.com 11

             www.17727.com 12

     

测试


 

--测试手动故障转移(在主体服务器上执行)

ALTER DATABASE Mirroring_Test SET PARTNER failover

--测试自动故障转移(如在主体数据库服务器切断网线,或停止实例)

--测试数据同步在主体服务器上改动数据,在镜像数据库上创建快照查询

CREATE DATABASE snap_Mirroring_Test

ON (NAME=Mirroring_Test,FILENAME='D:Snap_Mirroring_Test.snap')

   AS SNAPSHOT OF  Mirroring_Test

  

--删除快照

DROP DATABASE snap_Mirroring_Test

        

拷贝备份文件给镜像服务器进行还原,还原覆盖原有数据库、不对事务进行任何操作。

--备份 HOST_A 证书,并将其复制到其他机器,将 C:HOST_A_cert.cer 复制到 HOST_BHOST_C。
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'e:HOST_A_cert.cer';
GO
--为入站连接配置 Host_A
--在 HOST_A 上为 HOST_B 创建一个登录名。 
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
GO

附:微软官方资料

搭建成功后使用网站进行测试其可用性。(数据库在创建好数据库镜像后添加的话:先创建数据库、然后将数据库文件覆盖创建的数据库文件,使用脱机方式覆盖,创建连接数据库账户先删除原来账号再创建。)

--创建一个使用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert
   AUTHORIZATION HOST_B_user
   FROM FILE = 'e:HOST_B_cert.cer'
GO

SQL Server 2005

二、镜像服务器不能为连接数据库账号自动管理,需要在镜像服务器上执行:

--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO
 
--在 HOST_A 上为 HOST_C 创建一个登录名。 
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
GO

其他版本.aspx)

USE master ;

--创建一个使用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert
   AUTHORIZATION HOST_C_user
   FROM FILE = 'e:HOST_C_cert.cer'
GO

www.17727.com 13

exec sp_addlogin

--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
GO

更新日期: 2006 年 4 月 14 日

@loginame = 'sql_2_login',    //网站连接数据库账号

USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR CERTIFICATE HOST_A_www.17727.com,cert;
GO
--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO

数据库镜像发生在数据库镜像会话的上下文中。本主题假定您熟悉数据库镜像中的主体角色、镜像角色和见证服务器角色、运行模式以及角色切换。有关详细信息,请参阅数据库镜像概述.aspx)。

@passwd = 'qzmcc@139.com',    //网站连接数据库密码

--必须要在镜像数据库中先设置好伙伴后,才能在主体服务器执行
--在 HOST_A 的主体服务器实例上,将 HOST_B 上的服务器实例设置为伙伴(使其成为初始镜像服务器实例)。
ALTER DATABASE crm 
    SET PARTNER = 'TCP://192.168.1.205:5022';
GO

镜像数据库就绪且配置了服务器实例后,数据库所有者便可以启动数据库镜像。只要镜像开始,每个伙伴便开始在其数据库中维护有关该数据库以及其他伙伴和见证服务器的状态信息(如果有)。此状态信息允许服务器实例维护称为“数据库镜像会话”的关系。在整个数据库镜像会话期间,服务器实例相互监视。在数据库所有者停止会话之前,将一直维护状态信息。有关详细信息,请参阅镜像状态.aspx)和监视数据库镜像.aspx)。

@sid =  0xC28F0312BAFBE84AB553C40CFAD2A32A;  //主体服务器上配置的网站连接数据库账号SID号

--设置见证服务器
ALTER DATABASE crm SET WITNESS = N'TCP://192.168.1.204:5022';
GO

在数据库镜像会话开始时,镜像服务器将标识应用到镜像数据库的最新事务日志的日志序列号 (LSN),并要求主体服务器为所有后续事务(如果有)建立事务日志。作为响应,主体服务器将自上一个还原到镜像数据库或发送到镜像服务器的日志以来累积的所有活动日志记录发送到镜像服务器。在主体数据库的日志磁盘中累积的未发送日志称为“发送队列”。

主体服务器上:

 

镜像服务器立即将传入日志写入磁盘,传入日志在应用到镜像数据库之前一直保留在磁盘上。在镜像磁盘上等待的日志称为“重做队列”。重做队列中等待的未还原日志数指示将故障转移到镜像数据库所需的时间。有关详细信息,请参阅估计角色切换过程中的服务中断.aspx)。

USE master;

www.17727.com 14www.17727.com 15镜像数据库
/***********************************************
在镜像服务器执行此脚本
***********************************************/
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO
--为 HOST_B 服务器实例制作一个证书。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert 
   WITH SUBJECT = 'HOST_B certificate for database mirroring',START_DATE  = '01/01/2009';
GO
--在 HOST_B 中为服务器实例创建一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_Mirroring
   STATE = STARTED
   AS TCP (
      LISTENER_PORT=5022
      , LISTENER_IP = ALL
   ) 
   FOR DATABASE_MIRRORING ( 
      AUTHENTICATION = CERTIFICATE HOST_B_cert
      , ENCRYPTION = REQUIRED ALGORITHM AES
      , ROLE = PARTNER
   );
GO
--备份 HOST_B 证书,将 C:HOST_B_cert.cer 复制到 HOST_AHOST_C。
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'e:HOST_B_cert.cer';
GO 

主体服务器继续让客户端和客户端连接使用主体数据库。镜像开始后,每当客户端更新主体数据库,并将事务写入主体数据库的日志时,主体服务器便会将该日志记录发送到镜像服务器。同时,镜像服务器立即将日志记录写入磁盘,作为重做队列中的最新记录。

select sid,name from syslogins;     //查看登录账户

--为入站连接配置 Host_B
--在 HOST_B 上为 HOST_A 创建一个登录名。
USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert
   AUTHORIZATION HOST_A_user
   FROM FILE = 'e:HOST_A_cert.cer'
GO

在后台,镜像服务器从最早的日志记录开始,尽快在镜像数据库中逐个“重做”日志记录。重做日志涉及从最早的记录开始,将排队的日志记录按顺序应用到镜像数据库的操作。每条日志记录仅重做一次。当镜像服务器重做日志时,镜像数据库将继续前滚。当主体服务器截断或收缩主体数据库的日志时,镜像服务器也将在日志流的同一点收缩日志。

 

--授予对远程镜像端点的登录名的 CONNECT 权限。 
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO

通常,重做可加速镜像数据库与主体数据库的同步。镜像数据库是否完全与主体数据库保持同步取决于会话的运行模式。在同步、高安全性模式下,主体服务器等待确认新事务,直到将这些新事务写入镜像服务器的日志磁盘为止。将累积的日志记录发送到镜像服务器之后,镜像数据库便会与主体数据库保持同步。

主体服务器上执行的语句:

--在 HOST_B 上为 HOST_C 创建一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
GO

会话期间,如果主体服务器不能立即发送每个日志记录,则未发送日志记录会累积在发送队列中。在同步、高安全性模式下,执行同步后,仅当镜像暂停或挂起时才会累积新的未发送日志。相反,在异步、高性能模式下,只要镜像服务器在镜像期间滞后以及镜像暂停或挂起,便会累积未发送日志。未发送日志数指示主体服务器出现故障时可能造成的数据丢失。

USE master; 

--创建一个使用该登录名的用户。
--DROP USER HOST_C_user 
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert
   AUTHORIZATION HOST_C_user
   FROM FILE = 'e:HOST_C_cert.cer'
GO

注意:
如果重做失败,则镜像服务器通过将数据库置于 SUSPENDED 状态来暂停会话。数据库所有者必须找到失败的原因并解决问题才能继续会话。

create master key encryption by password = 'qzmcc@139.com';

--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
GO

www.17727.com 16并发会话.aspx)

create certificate sql_1_cert with subject ='sql_1 certificate',start_date='08/20/2014',Expiry_date ='08/20/3000';

--在 HOST_B 上为 HOST_B 创建一个登录名。 
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR CERTIFICATE HOST_B_cert;
GO
--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO
--在 HOST_B 的镜像服务器实例上,将 HOST_A 上的服务器实例设置为伙伴(使其成为初始主体服务器实例)。
ALTER DATABASE crm 
    SET PARTNER = 'TCP://192.168.1.203:5022';
GO


 

www.17727.com 17www.17727.com 18见证服务器
/****************************
见证服务器执行
*****************************/
--ALTER DATABASE MirrorDB SET PARTNER OFF
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
GO

给定的服务器实例可以参与到多个具有相同或不同服务器实例的并发数据库镜像会话(每个镜像数据库发生一次)中。通常,服务器实例专门用作其所有数据库镜像会话中的伙伴或见证服务器。但是,由于每个会话都独立于其他会话,因此服务器实例可以在某些会话中充当伙伴,而在其他会话中充当见证服务器。例如,请看三个服务器实例(SSInstance_1SSInstance_2 和 SSInstance_3)中的下列四个会话。每个服务器实例都可在某些会话中作为伙伴,而在其他会话中作为见证服务器:

CREATE ENDPOINT Endpoint_Mirroring  

--为此服务器实例制作一个证书。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert 
   WITH SUBJECT = 'HOST_C certificate',START_DATE  = '01/01/2009';
GO

服务器实例 数据库 A 的会话 数据库 B 的会话 数据库 C 的会话 数据库 D 的会话

SSInstance_1

见证服务器

伙伴

伙伴

伙伴

SSInstance_2

伙伴

见证服务器

伙伴

伙伴

SSInstance_3

伙伴

伙伴

见证服务器

见证服务器

下图说明了都作为伙伴参与两个镜像会话的两个服务器实例。一个会话用于名为 Db_1 的数据库,另一个会话用于名为 Db_2 的数据库。

www.17727.com 19

每个数据库独立于其他数据库。例如,服务器实例最初可能是两个数据库的镜像服务器。如果其中一个数据库发生故障转移,则服务器实例将变为已发生故障转移的数据库的主体服务器,同时为其他数据库保留镜像服务器。

再举一个例子,假设有一个服务器实例,它是两个或多个以具有自动故障转移功能的高安全性模式运行的数据库的主体服务器,如果此服务器实例失败,则所有数据库将自动故障转移到其相应的镜像数据库。

如果将一个服务器实例设置成既作为伙伴又作为见证服务器参与会话,请确保数据库镜像端点能够支持两种角色(有关详细信息,请参阅数据库镜像端点.aspx))。同时,还要确保系统具有足够资源以减少资源争用。

注意:
由于镜像数据库相互独立,因此这些数据库不能作为一个组来进行故障转移。

www.17727.com 20数据库镜像会话的必备条件.aspx)


开始镜像会话之前,数据库所有者或系统管理员必须创建镜像数据库,设置端点和登录名。在某些情况下,还要创建并设置证书。有关详细信息,请参阅设置数据库镜像.aspx)。

创建镜像数据库的最低要求是:执行主体数据库的完整备份和一个后续日志备份,并使用 WITH NORECOVERY 将这两个备份还原到镜像服务器实例上。此外,在开始镜像之前,如果在执行完必要的日志备份之后又执行了任何其他日志备份,则还必须手动应用其他每个日志备份(始终使用 WITH NORECOVERY)。应用最新的日志备份之后,便可开始镜像。有关详细信息,请参阅为镜像准备镜像数据库.aspx)。

www.17727.com 21暂停会话对主体事务日志的影响.aspx)


数据库所有者可以随时暂停会话。执行暂停操作将保留在删除镜像时的会话状态。暂停会话时,主体服务器不会向镜像服务器发送任何新的日志记录。所有这些记录将保持活动状态,并堆积在主体数据库的事务日志中。只要数据库镜像会话保持暂停状态,事务日志就不会被截断。因此,如果数据库镜像会话暂停时间过长,则可能会使该日志填满。

有关详细信息,请参阅暂停和恢复数据库镜像.aspx)。

www.17727.com 22客户端连接.aspx)


Microsoft .NET Data Provider for SQL Server 提供了对数据库镜像会话的客户端连接支持。有关详细信息,请参阅连接客户端与镜像数据库.aspx)。

www.17727.com 23请参阅.aspx)


  STATE = STARTED   

--使用该证书为服务器实例创建一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_Mirroring
   STATE = STARTED
   AS TCP (
      LISTENER_PORT=5022
      , LISTENER_IP = ALL
   ) 
   FOR DATABASE_MIRRORING ( 
      AUTHENTICATION = CERTIFICATE HOST_C_cert
      , ENCRYPTION = REQUIRED ALGORITHM AES
      , ROLE = WITNESS
   );
GO  

概念

异步数据库镜像(高性能模式).aspx) 
镜像状态.aspx) 
数据库镜像概述.aspx) 
仲裁:见证服务器如何影响数据库可用性.aspx) 
同步数据库镜像(高安全性模式).aspx) 

  AS TCP ( LISTENER_PORT=10000,LISTENER_IP = ALL )    

--备份 HOST_C 证书,并将其复制到其他系统,即 HOST_BHOST_A。
BACKUP CERTIFICATE HOST_C_cert TO FILE = 'e:HOST_C_cert.cer';
GO

其他资源

监视数据库镜像.aspx) 
设置数据库镜像.aspx) 

  FOR DATABASE_MIRRORING (

--为入站连接配置 Host_C
--在 HOST_C 上为 HOST_B 创建一个登录名。 
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'password';
GO

帮助和信息

获取 SQL Server 2005 帮助.aspx)

www.17727.com 24更改历史记录.aspx)


  AUTHENTICATION = certificate sql_1_cert

--创建一个使用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert
   AUTHORIZATION HOST_B_user
   FROM FILE = 'e:HOST_B_cert.cer'
GO

版本 历史记录

2006 年 4 月 14 日

新增内容:
  • 添加了发送队列的说明。
  • 添加了有关重做队列大小重要性的信息。
已更改的内容:
  • 扩展了“并发会话”部分的介绍。

2005 年 12 月 5 日

已更改的内容:
  • 记录了一条对创建镜像数据库要求的更改。
  • 扩展了角色切换的介绍。

SQL Server 2005

其他版本.aspx)

www.17727.com 25

更新日期: 2005 年 12 月 5 日

在镜像会话开始之前,数据库所有者或系统管理员必须确保已创建镜像数据库并可进行镜像。

www.17727.com 26创建镜像数据库.aspx)


创建新镜像数据库的最低要求是:执行主体数据库的完整备份和一个后续日志备份,并使用 WITH NORECOVERY 将这两个备份还原到镜像服务器实例上。为使镜像正常运行,镜像数据库必须处于 RESTORING 状态。

并且在开始镜像之前,如果在执行完必要的日志备份之后又执行了任何其他日志备份,则还必须手动应用其他每个日志备份(始终使用 WITH NORECOVERY)。如果计划在数据库中非常频繁地运行日志备份作业,则可能需要禁用备份作业,直到镜像启动为止。应用最新的日志备份之后,便可开始镜像并重新启用日志备份作业(如果已禁用)。

注意:
只能备份当前主体服务器,无法备份镜像数据库,因为它处于 RESTORING 状态。

www.17727.com 27为重新启动镜像准备镜像数据库.aspx)


如果已删除镜像,并且该镜像数据库仍处于 RECOVERING 状态,则可以重新启动镜像。但是,首先在主体数据库中必须至少执行一个日志备份。然后在该镜像数据库中,必须使用 WITH NORECOVERY 还原删除镜像后在主体数据库中执行的所有日志备份。

准备镜像数据库

  • 如何为镜像准备镜像数据库 (Transact-SQL).aspx) 

SQL Server 2005

其他版本.aspx)

www.17727.com 28

数据库所有者可以暂停并在以后随时恢复数据库镜像会话。执行暂停操作将保留在挂起镜像时的会话状态。当出现瓶颈时,暂停可能有利于提高主体服务器的性能。

会话暂停后,主体数据库仍然可用。暂停操作将镜像会话的状态设置为 SUSPENDED,并且镜像数据库不再与主体数据库保持一致,从而导致主体数据库公开运行。

由于在数据库镜像会话处于暂停时无法截断事务日志,因此建议您尽快恢复暂停的会话。因此,如果数据库镜像会话暂停的时间太长,事务日志将填满,导致数据库不可用。有关此现象产生原因的解释,请参阅本主题后面的“暂停和恢复如何影响日志截断”。

重要提示:
执行强制服务之后,当重新连接原始主体服务器时,镜像便会挂起。在这种情况下,恢复镜像可能会导致原始主体服务器上的数据丢失。有关管理潜在的数据丢失的信息,请参阅强制服务(可能造成数据丢失)

www.17727.com 29暂停和恢复如何影响日志截断.aspx)


通常,在数据库上执行自动检查点操作时,事务日志将在下一个日志备份后截断到该检查点。当数据库镜像会话处于暂停时,当前所有日志记录都保持为活动状态,因为主体服务器正等待将这些记录发送到镜像服务器。未发送的日志记录将堆积在主体数据库的事务日志中,直到会话恢复并且主体服务器将它们发送到镜像服务器为止。

会话恢复时,主体服务器立即开始将堆积的日志记录发送到镜像服务器。当镜像服务器确认与最早的自动检查点相对应的日志记录已排队后,主体服务器便会将主体数据库的日志截断到该检查点。镜像服务器会截断同一个日志记录的重做队列。随着对每个连续的检查点重复此过程,日志将对检查点逐个分阶段地截断。

注意:
有关检查点和日志截断的详细信息,请参阅检查点和日志的活动部分

www.17727.com 30避免出现已满事务日志.aspx)


如果填满该日志(因为它达到其最大大小或服务器实例耗尽空间),则数据库将无法再执行任何更新。若要避免出现这种问题,有两种选择:

  • 在该日志填满之前恢复数据库镜像会话,或添加更多的日志空间。恢复数据库镜像会使主体服务器将其累积的活动日志发送到镜像服务器,并将镜像数据库设置为 SYNCHRONIZING 状态。然后镜像服务器可将日志镜像到磁盘并开始重做。 
  • 通过删除镜像来停止数据库镜像会话。 
    和暂停会话不同,删除镜像将删除有关镜像会话的所有信息。每个伙伴服务器实例将保留其自己的数据库副本。如果前一个镜像副本已恢复,则它将与前一个主体副本分离,且滞后时间等于此会话暂停的时间。有关详细信息,请参阅删除数据库镜像.aspx)。 

  , ENCRYPTION = REQUIRED ALGORITHM AES

--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO
 
--在 HOST_C 上为 HOST_A 创建一个登录名。 
USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'password';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert
   AUTHORIZATION HOST_A_user
   FROM FILE = 'e:HOST_A_cert.cer'
GO

  , ROLE = partner

--授予对远程镜像端点的登录名的 CONNECT 权限。 
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO

)   

--在 HOST_C 上为 HOST_C 创建一个登录名。 
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'password';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR CERTIFICATE HOST_C_cert;
GO

backup certificate sql_1_cert to file='d:sql_1_cert.cer';

 可能有朋友们会比较有疑惑,你一下搞两个数据库出来,他们的ip地址都不一样,到时候数据库切换过去了,我的数据库的连接字符串可如何是好?难道还得在代码中去控制是连接哪个数据库吗?

 

其实这个问题是这样的,使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:

USE master;

ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;"

create login sql_2_login with password='qzmcc@139.com';

DataSource= A;这个就是我们常用的主数据库的ip地址,Failover Partner=B;这个填写的就是镜像数据库的ip地址,一旦出现了连接错误,ado.net会在超时以后自动去连接镜像数据库。

USE master;

2.高级别保护模式

create login sql_3_login with password='qzmcc@139.com';

在昨天晚上加班做实施的时候,才发现我的设计已经被修改了,由于以前的项目有java写的也有c#写的,全自动的故障转移不能够实现 。换句话说,由于老项目中的历史遗留问题,以及特殊模块的耦合性过高,无法解耦,只能在高级别保护模式或高性能模式中选择一种了。那么这两者有什么区别呢?

create user sql_2_user for login sql_2_login;

简单一点来说,区别就在与事务安全模式上跟应用场景上。

create user sql_3_user for login sql_3_login;

高级别保护模式采用的是同步镜像, SAFETY FULL。应用场景:通常在局域网中或对数据要求比较高的场景中。

create certificate sql_2_cert authorization sql_2_user from file='d:sql_2_cert.cer';

高性能保护模式采用的是异步镜像, SAFETY OFF。应用场景:通常在广域网或对数据要求不太高,丢失几条数据是允许的,但是必须保证它不中断服务。

create certificate sql_3_cert authorization sql_3_user from file='d:sql_3_cert.cer';

在微软的SQLServer2005的课程上是这么说的。如果是高级别保护模式的话,主、从数据库只要有一台不能正常保证服务,数据库就不能够对外进行服务了,我在开始的时候就没有打算采用这种模式,因为部门经理说了,丢失一两条数据是可以接受的,况且我们公司是做运营的,按照起先微软的课程的理论,高级别保护模式是不太适合我们公司的应用场景的,万一有一台数据库出问题了,整个服务就被中断,这是不能让人接受的。再说了,公司对数据要求不太苛刻,两台服务器都有内网线连接,由于内网传输速度非常的快,即使采用高性能模式,一般来说也是不会丢失数据的。于是我打算采用高性能模式来做数据库的镜像。由于公司服务器没有域环境,所以我就采用了证书验证来做SQLServer镜像。

grant connect on endpoint::Endpoint_Mirroring to sql_2_login;

意外收获:

grant connect on endpoint::Endpoint_Mirroring to sql_3_login;

两台服务器全部都安装了SQLServer2008,在设置事务安全模式的时候,才发现SQLServer2008不支持异步模式。提示大概如下:此SQLServer版本不支持修改事务安全模式,alter database失败。 我当时汗都出来了,忙活了一晚上,到最后居然是这个结果。

 

由于是服务器维护时间,我大胆的把镜像服务器停止了,结果却让我大吃一惊,主数据库依旧可以正常工作,正常对外提供服务。也就是说,起先微软的课程讲的知识是错误的,两台数据库做镜像,不管是哪台数据库出了问题,另外的一台数据库都可以保证正常对外提供服务。于是我反复试验反复切换了一下,结果依然是这样。

USE master;

由于高级别保护模式与高性能模式代码差不太多,只是在事务安全模式的设置上有些小区别,前面已经提到,这里就不再多解释了。实施的代码如下:

select sid,name from syslogins;     //查看登录账户

www.17727.com 31www.17727.com 32主体服务器
USE  master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
START_DATE = '01/01/2009';

 

CREATE  ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );

ALTER DATABASE mydb SET SAFETY FULL

BACKUP  CERTIFICATE HOST_A_cert TO  FILE  =  'e:HOST_A_cert.cer';

 

CREATE  LOGIN HOST_B_login WITH  PASSWORD  =  'password';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'e:HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];

Alter database mydb set partner='TCP://SQL-2:10000';    //在镜像服务器执行后再执行

ALTER  DATABASE crm SET  PARTNER  =  'TCP://10.10.10.8:5022';

 

www.17727.com 33www.17727.com 34镜像数据库
USE  master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
START_DATE = '01/01/2009';

Alter database mydb set witness='TCP://SQL-3:10000';    //执行上面的语句后执行

CREATE  ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );

 

BACKUP  CERTIFICATE HOST_B_cert TO  FILE  =  'e:HOST_B_cert.cer';

 

CREATE  LOGIN HOST_A_login WITH  PASSWORD  = 'password';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'e:HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];

 

ALTER  DATABASE crm SET  PARTNER  =  'TCP://10.10.10.6:5022';

镜像服务器执行的语句:

 可能有朋友会比较奇怪,你这里也没有使用ALTER DATABASE crm SET SAFETY FULL; 按理应该是高性能模式才对呀?

USE master; 

其实这个问题是这样的,我的这个SQLServer2008默认已经是将事务安全模式设置为full了,即使是手动设置也一样,并且我实施的时候SQLServer2008不支持将

create master key encryption by password = 'qzmcc@139.com';

 事务安全模式设置为OFF。

create certificate sql_2_cert with subject ='sql_2 certificate',start_date='08/20/2014',Expiry_date ='08/20/3000';

OK,一切都设置好了,那么就可以模拟服务器真的down机时候的操作了,后续的工作我也把代码做了总结,具体代码如下:

 

www.17727.com 35www.17727.com 36手动故障转移代码
--主备互换
--主机执行:

CREATE ENDPOINT Endpoint_Mirroring  

ALTER DATABASE crm SET PARTNER FAILOVER

  STATE = STARTED   

--主服务器Down掉,备机紧急启动并且开始服务
ALTER DATABASE crm SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS

  AS TCP ( LISTENER_PORT=10000,LISTENER_IP = ALL )    

原来的主服务器恢复,可以继续工作,需要重新设定镜像
--备机执行:
USE master
ALTER DATABASE crm SET PARTNER RESUME  --恢复镜像

  FOR DATABASE_MIRRORING (

ALTER DATABASE crm SET PARTNER FAILOVER; --切换主备

  AUTHENTICATION = certificate sql_2_cert

3.监视数据库镜像

  , ENCRYPTION = REQUIRED ALGORITHM AES

SQLServer提供了一些视图,可以供查询镜像的各种状态,到时候可以根据这个做一个监视,一旦发生故障转移群集,发邮件给系统管理员,好让系统管理员及时的知道数据库服务器发生了什么问题,即使的做故障分析、排查。有关这方面资料,MSDN上已经提供太多资料了。感兴趣的朋友可以去查这方面的资料。

  , ROLE = partner

在文章的最后提出一个有争议的问题:SQLServer(2008)高级别保护模式,只要有一台数据库能够保证正常运行,就可以正常对外提供服务。我的实验结果是这样的,这的确跟以往的理论知识有些出入。

)   

还等什么,赶快搭环境动手实验一下吧,体验一下SQLServer镜像带来的快感。 希望有兴趣的朋友们一起学习探讨。

backup certificate sql_2_cert to file='d:sql_2_cert.cer';

后话:

 

       在发布本文以后,有朋友问到说SQLServer镜像在实施过程中不知道开放什么端口,导致防火墙必须关闭掉的这个问题。因为我这里的环境已经没有了,搭建真实环境进行模拟测试也不太可能,简单看了下,SQLServer服务需要用到了如下端口如图所示:

USE master;

www.17727.com 37

create login sql_1_login with password='qzmcc@139.com';

另外,请参考msdn的这篇文章:

USE master;

数据库引擎使用的端口

下表列出了数据库引擎经常使用的端口。

应用场景 端口 注释

通过 TCP 运行的 SQL Server 默认实例

TCP 端口 1433

这是允许通过防火墙的最常用端口。它适用于与默认数据库引擎安装或作为计算机上唯一运行实例的命名实例之间的例行连接。(命名实例具有特殊的注意事项。请参阅本主题后面的动态端口)。

采用默认配置的 SQL Server 命名实例

此 TCP 端口是在启动数据库引擎时确定的动态端口。

请参阅下面动态端口部分中的描述。当使用命名实例时,SQL Server Browser 服务可能需要 UDP 端口 1434。

配置为使用固定端口的 SQL Server 命名实例

由管理员配置的端口号。

请参阅下面动态端口部分中的描述。

专用管理员连接

对于默认实例,为 TCP 端口 1434。其他端口用于命名实例。有关端口号,请查看错误日志。

默认情况下,不会启用与专用管理员连接 (DAC) 的远程连接。若要启用远程 DAC,请使用外围应用配置器方面。有关详细信息,请参阅了解外围应用配置器

SQL Server Browser 服务

UDP 端口 1434

SQL Server Browser 服务用于侦听指向命名实例的传入连接,并为客户端提供与此命名实例对应的 TCP 端口号。通常,只要使用数据库引擎的命名实例,就会启动 SQL Server Browser 服务。如果客户端配置为连接到命名实例的特定端口,则不必启动 SQL Server Browser 服务。

通过 HTTP 端点运行的 SQL Server 实例。

可以在创建 HTTP 端点时指定。对于 CLEAR_PORT 通信,默认端口为 TCP 端口 80,对于 SSL_PORT 通信,默认端口为 443。

用于通过 URL 实现的 HTTP 连接。

通过 HTTPS 端点运行的 SQL Server 默认实例。

TCP 端口 443

用于通过 URL 实现的 HTTPS 连接。HTTPS 是使用安全套接字层 (SSL) 的 HTTP 连接。

Service Broker

TCP 端口 4022。若要验证使用的端口,请执行下面的查询:

SELECT name, protocol_desc, port, state_desc

FROM sys.tcp_endpoints

WHERE type_desc = 'SERVICE_BROKER'

对于 SQL Server Service Broker,没有默认端口,不过这是联机丛书示例中使用的常规配置。

数据库镜像

管理员选择的端口。若要确定此端口,请执行以下查询:

SELECT name, protocol_desc, port, state_desc FROM sys.tcp_endpoints

WHERE type_desc = 'DATABASE_MIRRORING'

对于数据库镜像,没有默认端口,不过联机丛书示例使用 TCP 端口 7022。务必避免中断正在使用的镜像端点,尤其是处于带有自动故障转移功能的高安全模式下时。防火墙配置必须避免破坏仲裁。有关详细信息,请参阅指定服务器网络地址(数据库镜像)

复制

与 SQL Server 的复制连接使用典型的常规数据库引擎端口(供默认实例使用的 TCP 端口 1433 等)

复 制快照的 Web 同步和 FTP/UNC 访问要求在防火墙上打开其他端口。为了将初始数据和架构从一个位置传输到另一个位置,复制可以使用 FTP(TCP 端口 21)或者通过 HTTP(TCP 端口 80)或文件和打印共享(TCP 端口 137、138 或 139)进行的同步。

对于通过 HTTP 进行的同步,复制使用 IIS 端点(其端口可配置,但默认情况下为端口 80),不过 IIS 进程通过标准端口(对于默认实例为 1433)连接到后端 SQL Server。

在使用 FTP 进行 Web 同步期间,FTP 传输是在 IIS 和 SQL Server 发布服务器之间进行,而非在订阅服务器和 IIS 之间进行。

有关详细信息,请参阅Configuring Microsoft Internet Security and Acceleration Server for Microsoft SQL Server 2000 Replication over the Internet(为通过 Internet 进行的 Microsoft SQL Server 2000 复制配置 Microsoft Internet Security and Acceleration Server)。

Transact-SQL 调试器

TCP 端口 135

请参阅端口 135 的特殊注意事项

可能还需要 IPsec 例外。

如果使用 Visual Studio,则在 Visual Studio 主机计算机上,还必须将 Devenv.exe 添加到“例外”列表中并打开 TCP 端口 135。

如果使用 Management Studio,则在 Management Studio 主机计算机上,还必须将 ssms.exe 添加到“例外”列表中并打开 TCP 端口 135。有关详细信息,请参阅配置和启动 Transact-SQL 调试器

有关为数据库引擎配置 Windows 防火墙的分步说明,请参阅如何为数据库引擎访问配置 Windows 防火墙。

create login sql_3_login with password='qzmcc@139.com';

动态端口

默 认情况下,命名实例(包括 SQL Server Express)使用动态端口。也就是说,每次启动数据库引擎时,它都将确定一个可用端口并使用此端口号。如果命名实例是安装的唯一数据库引擎实例,则它 可能使用 TCP 端口 1433。如果还安装了其他数据库引擎实例,则它可能会使用其他 TCP 端口。由于所选端口可能会在每次启动数据库引擎时更改,因而很难配置防火墙以启用对正确端口号的访问。因此,如果使用防火墙,则建议重新配置数据库引擎以 每次都使用同一端口号。这称为固定端口或静态端口。有关详细信息,请参阅配置固定端口。

另一种配置命名实例以侦听固定端口的方法是在防火墙中为诸如 sqlservr.exe 之类的 SQL Server 程序创建例外(针对数据库引擎)。这会非常方便,但当使用高级安全 Windows 防火墙 MMC 管理单元时,端口号将不会显示在“入站规则”页的“本地端口”列中。这会使审核哪些端口处于打开状态变得更为困难。另一注意事项是 Service Pack 或累积的更新可能会更改 SQL Server 可执行文件的路径,这将使防火墙规则作废。

 

希望可以帮到那些困惑中的人们。祝:好运。

 

create user sql_1_user for login sql_1_login;

create user sql_3_user for login sql_3_login;

create certificate sql_1_cert authorization sql_1_user from file='d:sql_1_cert.cer';

create certificate sql_3_cert authorization sql_3_user from file='d:sql_3_cert.cer';

grant connect on endpoint::Endpoint_Mirroring to sql_1_login;

grant connect on endpoint::Endpoint_Mirroring to sql_3_login;

 

USE master ;

exec sp_addlogin

@loginame = 'sql_2_login',    //网站连接数据库账号

@passwd = 'qzmcc@139.com',    //网站连接数据库密码

@sid =  0xC28F0312BAFBE84AB553C40CFAD2A32A;  //主体服务器上配置的网站连接数据库账号SID号

 

Alter database mydb set partner='TCP://SQL-1:10000';

ALTER DATABASE mydb SET SAFETY FULL

 

见证服务器上执行的语句:

USE master; 

create master key encryption by password = 'qzmcc@139.com';

create certificate sql_3_cert with subject ='sql_3 certificate',start_date='08/20/2014',Expiry_date ='08/20/3000';

 

CREATE ENDPOINT Endpoint_Mirroring  

  STATE = STARTED   

  AS TCP ( LISTENER_PORT=10000,LISTENER_IP = ALL )    

  FOR DATABASE_MIRRORING (

  AUTHENTICATION = certificate sql_3_cert

  , ENCRYPTION = REQUIRED ALGORITHM AES

  , ROLE = WITNESS

)   

backup certificate sql_3_cert to file='d:sql_3_cert.cer';

 

USE master;

create login sql_1_login with password='qzmcc@139.com';

USE master;

create login sql_2_login with password='qzmcc@139.com';

create user sql_1_user for login sql_1_login;

create user sql_2_user for login sql_2_login;

create certificate sql_1_cert authorization sql_1_user from file='d:sql_1_cert.cer';

create certificate sql_2_cert authorization sql_2_user from file='d:sql_2_cert.cer';

grant connect on endpoint::Endpoint_Mirroring to sql_1_login;

grant connect on endpoint::Endpoint_Mirroring to sql_2_login;

 

 

有人会说,两个数据库,IP地址都不一样,怎么写连接代码呢?难道出现故障后要手动更改代码吗?其实使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:

 ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;" DataSource= A;

 这样设置之后,客户端就可以自动切换数据库了

 至此SQL Server 2008 的镜像高可用配置实例全部完成。

 <connectionStrings>

    <add name="DefaultDB" connectionString="Data Source=192.168.1.104;Failover Partner=192.168.1.106;Initial Catalog=ImageTest;User ID=sa;Password=1234;" providerName="System.Data.SqlClient"/>

  </connectionStrings>

192.168.1.104是主,192.168.1.106是镜像。

 

-------------------------测试------------------------------

--1、主备互换

 

--主机停掉SQL服务

 

 

--2、主服务器Down掉,备机紧急启动并且开始服务

--备机执行:

USE master;

ALTER DATABASE S_C_SC SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;

ALTER DATABASE S_C_SC SET ONLINE

 

 

--3、开启主机的SQL服务,原来的主服务器恢复,可以继续工作,需要重新设定镜像

--备机执行:

USE master;

ALTER DATABASE S_C_SC SET PARTNER RESUME; --恢复镜像

ALTER DATABASE S_C_SC SET PARTNER FAILOVER; --切换到主机

 

 

--4、原来的主服务器恢复,可以继续工作

对设置是否成功进行测试  

--------由于镜像 的缺点:在镜像服务器上无法查询数据。需要测试是否可以成功。(数据库复制功能则可以)  

--------通过在镜像数据库上创建数据库快照可以间接读取某一个时刻点的镜像数据库  

--------测试过程:  

--------主机上执行:  

 USE master;     

  

ALTER DATABASE TestMirroring SET SAFETY FULL;-----切换到高安全模式否则执行手动切换会失败  

  

GO  

 ALTER DATABASE TestMirroring SET PARTNER FAILOVER  ---手动进行主备切换  

------镜像服务器上执行:  

 USE master;     

 ALTER DATABASE TestMirroring SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS ---在镜像机上执行强制切换(当主服务器数据宕机时)  

  

  

-------如果原来的主服务器恢复,可以继续工作,需要重新设定镜像  

----备机(镜像服务器)上执行:  

--恢复镜像       

 USE master;     

 ALTER DATABASE TestMirroring SET PARTNER RESUME    

--切换主备  

 ALTER DATABASE TestMirroring SET PARTNER FAILOVER   

------------------------删除数据库镜像  

  ALTER DATABASE TestMirroring SET PARTNER OFF  

-----------暂停数据库镜像会话  

   ALTER DATABASE TestMirroring SET PARTNER SUSPEND   

-----恢复数据库镜像会话  

   ALTER DATABASE TestMirroring SET PARTNER RESUME  

   ALTER DATABASE TestMirroring SET PARTNER SUSPEND   

-----关闭见证服务器  

   ALTER DATABASE TestMirroring SET WITNESS OFF  

  

   

  

   

  

/*  

 默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。  

关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。  

*/  

--事务安全,同步模式    

 USE master;     

 ALTER DATABASE TestMirroring SET PARTNER SAFETY FULL   

--事务不安全,异步模式    

 ALTER DATABASE TestMirroring SET PARTNER SAFETY OFF;  

  

--------在高性能模式下,见证服务器对可用性会有不利影响。如果见证服务器是针对数据库镜像会话而配置,则主体服务器必须至少连接到一个其他服务器实例,  

--  即镜像服务器或见证服务器,或者是连接到这两个服务器。否则,将无法使用数据库,并且不能进行强制服务(可能丢失数据)。  

--  因此,对于高性能模式,建议始终将见证服务器设置为 OFF。  

--  见证服务器的唯一角色是支持自动故障转移。并不能用于数据库,是 SQL Server 的可选实例。  

--     它能使高安全性模式会话中的镜像服务器识别出是否要启动自动故障转移(见证服务器的角色就是启动自动故障转移)。  

  ALTER DATABASE TestMirroring SET PARTNER OFF  

    

/*  

 自动故障转移所需条件  

  

  A、数据库镜像会话必须在高安全性模式下运行,并且必须处理见证服务器。  

  B、镜像数据库必须已经同步。这将保证发送到镜像服务器的所有日志都已写入磁盘。  

  C、主体服务器已中断了与其余数据库镜像配置的通信,而镜像服务器和见证服务器将保留仲裁。但是,如果所有服务器实例都已中断通信,  

   而见证服务器和镜像服务器稍后重新建立通信,则不会发生自动故障转移。  

  D、镜像服务器已检测到丢失了主体服务器  

  E、镜像服务器检测主体服务器故障的方式取决于故障是硬故障还是软故障。  

  

 自动故障转移原理  

  

  A、如果主体服务器仍在运行中,则将主体数据库的状态更改为 DISCONNECTED 并断开所有客户端与主体数据库的连接。  

  B、见证服务器和镜像服务器将主体服务器注册为不可用。  

  C、如果重做队列中有任何等待的日志,则镜像服务器将完成前滚镜像数据库的操作  

  D、前一个镜像数据库作为新的联机主体数据库,恢复通过尽快回滚未提交的事务将这些事务全部清除。锁将隔离这些事务。  

  E、当前一个主体服务器重新联接到会话时,它将认定其故障转移伙伴现在拥有主体角色。前一个主体服务器接管镜像角色,并将其数据库作为镜像数据库。  

   新的镜像服务器会尽快将新的镜像数据库与主体数据库同步。新的镜像服务器重新同步数据库后,就可以再次执行故障转移,但按反向执行。。  

*/  

  

--------------------外延  

-----使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:  

  ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;   

  

--如果没有镜像服务器的建设,或环境无法实现镜像服务器的建设。通过下面的代码一样可以实现类似镜像的功能   

  

-----C# code  

Imports System.Data.SqlClient   

Imports System.Data   

   

Public Class dbConn   

Private primaryServerLocation As String="SERVER=primaryAddress;DATABASE=yourDB;User id=youruserID;Password=yourPassword;"   

Private secondaryServerLocationAsString="SERVER=secondaryAddress;DATABASE=yourDB;User id=youruserID;Password=yourPassword;"   

   

   

Public sqlConnection AsSqlConnection   

Public cmd AsSqlCommand   

   

Public Sub primaryConnection()   

    Try   

        sqlConnection = New System.Data.SqlClient.SqlConnection(primaryServerLocation)   

        cmd = NewSystem.Data.SqlClient.SqlCommand()   

   

        'test connection   

        sqlConnection.Open()   

        sqlConnection.Close()   

    Catch ex As Exception   

        secondaryConnection()   

    End Try   

End Sub   

   

Public Sub secondaryConnection()   

    'Used as the failover secondary serverif primaryis down.   

    Try   

        sqlConnection = New System.Data.SqlClient.SqlConnection(secondaryServerLocation)   

        cmd = NewSystem.Data.SqlClient.SqlCommand()   

   

        'test connection   

        sqlConnection.Open()   

        sqlConnection.Close()   

    Catch ex As Exception   

    End Try   

End Sub   

  

  

-----C# code  

  --=================查看数据库镜像的配置状态=================   

  

-- 1.通过Management studio 对象资源管理器,查看主体数据库、镜像数据库状态   

-- 2.通过Management studio 对象资源管理器中的数据库属性查看状态   

-- 3.通过系统目录视图查看数据库镜像配置情况   

  

 use master   

  go   

  SELECT * FROM sys.database_mirroring_endpoints   

  SELECT * FROM sys.database_mirroring   

  WHERE database_id =(SELECT database_id FROM sys.databases   

          WHERE name = 'TestMirroring')  

  SELECT * FROM sys.database_mirroring_witnesses  

   

  

  

  

   

  

镜像的运行模式有三种:  

  

1、 高性能(异步):先提交主服务器上的更改,然后将其传输到镜像服务器上。  

  

2、不带自动故障转移功能的高安全(同步): 过程始终提交主服务和镜像服务器上的更改。  

  

3、带自动故障转移功能的高安全(同步):需要见证服务器实例。如果主服务器和镜像服务器都可用,则提交在它们上面所做的更改并镜像。如果主服务器不可用,则见证服务器就会控制自动故障转移到镜像服务器上。  

本文由17727发布于数据库信息,转载请注明出处:高可用镜像,的注意事项

关键词: