基于证书的MS SQL2005数据库镜像搭建

一、准备工作:

3台服务器同版本,硬盘分区大小相同,安装相同版本数据库软件。
host中分别标注3台服务器IP和主机名称.
主体服务器上创建数据库,并进行完整备份数据库和数据库事务。
拷贝备份文件给镜像服务器进行还原,还原覆盖原有数据库、不对事务进行任何操作。
搭建成功后使用网站进行测试其可用性。(数据库在创建好数据库镜像后添加的话:先创建数据库、然后将数据库文件覆盖创建的数据库文件,使用脱机方式覆盖,创建连接数据库账户先删除原来账号再创建。)
二、镜像服务器不能为连接数据库账号自动管理,需要在镜像服务器上执行:
USE master ;
exec sp_addlogin
@loginame = 'sql_2_login',    //网站连接数据库账号
@passwd = 'qzmcc@139.com',    //网站连接数据库密码
@sid =  0xC28F0312BAFBE84AB553C40CFAD2A32A;  //主体服务器上配置的网站连接数据库账号SID号
主体服务器上:
USE master;
select sid,name from syslogins;     //查看登录账户
 
主体服务器上执行的语句:
USE master; 
create master key encryption by password = 'qzmcc@139.com';
create certificate sql_1_cert with subject ='sql_1 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_1_cert
  , ENCRYPTION = REQUIRED ALGORITHM AES
  , ROLE = partner
)   
backup certificate sql_1_cert to file='d:\sql_1_cert.cer';
 
USE master;
create login sql_2_login with password='qzmcc@139.com';
USE master;
create login sql_3_login with password='qzmcc@139.com';
create user sql_2_user for login sql_2_login;
create user sql_3_user for login sql_3_login;
create certificate sql_2_cert authorization sql_2_user from file='d:\sql_2_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_2_login;
grant connect on endpoint::Endpoint_Mirroring to sql_3_login;
 
USE master;
select sid,name from syslogins;     //查看登录账户
 
ALTER DATABASE mydb SET SAFETY FULL
 
Alter database mydb set partner='TCP://SQL-2:10000';    //在镜像服务器执行后再执行
 
Alter database mydb set witness='TCP://SQL-3:10000';    //执行上面的语句后执行
 
 
 
镜像服务器执行的语句:
USE master; 
create master key encryption by password = 'qzmcc@139.com';
create certificate sql_2_cert with subject ='sql_2 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_2_cert
  , ENCRYPTION = REQUIRED ALGORITHM AES
  , ROLE = partner
)   
backup certificate sql_2_cert to file='d:\sql_2_cert.cer';
 
USE master;
create login sql_1_login with password='qzmcc@139.com';
USE master;
create login sql_3_login with password='qzmcc@139.com';
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、带自动故障转移功能的高安全(同步):需要见证服务器实例。如果主服务器和镜像服务器都可用,则提交在它们上面所做的更改并镜像。如果主服务器不可用,则见证服务器就会控制自动故障转移到镜像服务器上。  

posted on 2014-11-27 21:37  rhceguo  阅读(256)  评论(0编辑  收藏  举报

导航