使用证书设置SQL Server数据库镜像详解

 数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像不能直接访问;它只用在错误恢复的情况下才可以被访问。

要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“主机”,第二个服务器被称作“备机”。主机数据库就是你实际用着的数据库,镜像数据库就是你的数据库的备用拷贝。当事务写入你的基本服务器的时候,他们也同样被传送到并写入你的镜像数据库中。

除了基本和镜像之外,你还可以引入另一个可选的组件,名为“见证”。见证服务器是第三个SQL Server 2005/2008运行实例,它是在判断什么时候进行错误恢复的时候,用于基本和镜像之间内部交流。只有当你想实现自动错误恢复的时候用到这个选项。它实现了2比1投票的能力,当我的一个组件不可达,并因此需要进行错误恢复的时候。见证服务器只有在你想实现自动错误恢复的时候才需要用到。

实现互通可以使用域或证书来实现,非域环境下使用证书配置数据库镜像(如不需要见证服务器,省略掉主体服务器和镜像服务器建立见证服务器的登录、见证服务器的配置、主体服务器设置见证服务器三个环节即可)。

 

1、 环境

 主机名  主机操作系统 主机SQL配置 主机IP   初始镜像角色
 host_A  Windows Server 2003  Sql Server 2005  SP3 192.168.1.21  主体服务器
 host_B Windows Server 2003  Sql Server 2005  SP3 192.168.1.254 镜像服务器
 host_C Windows Server 2003  Sql Server 2005  SP3 192.168.1.22 见证服务器

 

2、 配置出站连接

       主要工作是为服务器实例制作证书:

(一)为主机配置出站连接:

[c-sharp]  view plain copy
  1. /******************************************************** 
  2.  
  3. 此脚本在主体服务器执行 
  4.  
  5. ********************************************************/  
  6.   
  7. USE master;  
  8.   
  9. --DROP MASTER KEY  
  10. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'OA@asp.net';  
  11. GO  
  12.   
  13. --为主体服务器 host_A 实例制作一个证书。  
  14.   
  15. --DROP CERTIFICATE host_A_cert  
  16. CREATE CERTIFICATE host_A_cert   
  17. WITH SUBJECT = 'host_A certificate',START_DATE = '05/01/2010',EXPIRY_DATE = '01/01/2099';  
  18. GO   
  19.   
  20. --使用该证书为服务器实例创建一个镜像端点。  
  21.   
  22. --DROP ENDPOINT Endpoint_Mirroring  
  23. CREATE ENDPOINT Endpoint_Mirroring  
  24. STATE = STARTED  
  25. AS TCP (  
  26. LISTENER_PORT=5022  
  27. , LISTENER_IP = ALL  
  28. )   
  29. FOR DATABASE_MIRRORING (   
  30. AUTHENTICATION = CERTIFICATE host_A_cert  
  31. , ENCRYPTION = REQUIRED ALGORITHM AES  
  32. , ROLE = PARTNER  
  33. );  
  34. GO  
  35.   
  36. --备份host_A 证书,并将其复制到镜像服务器 host_B 和见证服务器 host_C  
  37.   
  38. BACKUP CERTIFICATE host_A_cert TO FILE = 'D:/dbmirror/host_A.cer';  
  39. GO  

 

(二)为镜像服务器配置出站连接

 

[c-sharp]  view plain copy
  1. /*********************************************** 
  2. 在镜像服务器 host_B 执行此脚本 
  3. ***********************************************/  
  4.   
  5. USE master;  
  6.   
  7. --DROP MASTER KEY  
  8. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'OA@asp.net';  
  9. GO  
  10.   
  11. --为镜像服务器 host_B 实例制作一个证书。  
  12. --DROP CERTIFICATE host_B_cert  
  13. CREATE CERTIFICATE host_B_cert  
  14. WITH SUBJECT = 'host_B certificate',START_DATE = '05/01/2010',EXPIRY_DATE = '01/01/2099';  
  15. GO  
  16.   
  17. --在 host_B 中为服务器实例创建一个镜像端点。  
  18. --DROP ENDPOINT Endpoint_Mirroring  
  19. CREATE ENDPOINT Endpoint_Mirroring  
  20. STATE = STARTED  
  21. AS TCP (  
  22. LISTENER_PORT=5022  
  23. , LISTENER_IP = ALL  
  24. )   
  25.   
  26. FOR DATABASE_MIRRORING (  
  27. AUTHENTICATION = CERTIFICATE host_B_cert  
  28. , ENCRYPTION = REQUIRED ALGORITHM AES  
  29. , ROLE = PARTNER  
  30. );  
  31. GO  
  32.   
  33. --备份 host_B 证书,并将其复制到主体服务器 host_A 和见证服务器 host_C 上  
  34.   
  35. BACKUP CERTIFICATE oa-canoe_cert TO FILE = 'D:/dbmirror/host_B.cer';  
  36. GO  

 

(三)为见证服务器配置出站连接

[c-sharp]  view plain copy
  1. /**************************** 
  2. 见证服务器 host_C 执行 
  3. *****************************/  
  4.   
  5. --ALTER DATABASE MirrorDB SET PARTNER OFF  
  6. USE master;  
  7. --DROP MASTER KEY  
  8. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'OA@asp.net';  
  9. GO  
  10.   
  11. --为此服务器实例制作一个证书。  
  12. --DROP CERTIFICATE host_C_cert  
  13. CREATE CERTIFICATE host_C_cert  
  14. WITH SUBJECT = 'host_C certificate',START_DATE = '05/01/2010',EXPIRY_DATE = '01/01/2099';  
  15. GO  
  16.   
  17. --使用该证书为服务器实例创建一个镜像端点。  
  18. --DROP ENDPOINT Endpoint_Mirroring  
  19. CREATE ENDPOINT Endpoint_Mirroring  
  20. STATE = STARTED  
  21. AS TCP (  
  22. LISTENER_PORT=5022  
  23. , LISTENER_IP = ALL  
  24. )  
  25.   
  26. FOR DATABASE_MIRRORING (   
  27. AUTHENTICATION = CERTIFICATE host_C_cert  
  28. , ENCRYPTION = REQUIRED ALGORITHM AES  
  29. , ROLE = WITNESS  
  30. );  
  31. GO  
  32.   
  33. --备份 host_C 证书,并将其复制到主体服务器 host_A 和镜像服务器 host_C 上  
  34.   
  35. BACKUP CERTIFICATE oa-tjcfw_cert TO FILE = 'D:/dbmirror/host_C.cer';  
  36. GO  

 

注意:

       1. 证书必须指定过期时间,如果未指定,则将 EXPIRY_DATE 设置为 START_DATE 一年之后的日期。

       2. 如果出现 “默认情况下,数据库镜像是被禁用的。当前提供的数据库镜像仅供评估使用,并不应使用于生产环境中。若要以评估为目的启用数据库镜像,请在启动过程中使用跟踪标志1400。有关跟踪标志和启动选项的详细信息,请参阅SQL Server 联机丛书”错误,请执行  DBCC TRACEON(1400,-1)  并安装SP3补丁即可

3、 配置入站连接

(一)为主体服务器配置入站连接:

[c-sharp]  view plain copy
  1. --在 host_A 上为镜像服务器 host_B 创建一个登录名。  
  2.   
  3. USE master;  
  4. --DROP LOGIN host_B_login  
  5. CREATE LOGIN host_B_login WITH PASSWORD = 'OA@asp.net';  
  6. GO  
  7.   
  8. --创建一个使用该登录名的用户。  
  9. --DROP USER host_B_user  
  10. CREATE USER host_B_user FOR LOGIN host_B_login;  
  11. GO  
  12.   
  13. --使证书与该用户关联。  
  14. --DROP CERTIFICATE host_B_cert  
  15. CREATE CERTIFICATE host_B_cert  
  16. AUTHORIZATION host_B_user  
  17. FROM FILE = 'D:/dbmirror/host_B.cer'  
  18. GO  
  19.   
  20. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  21. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_B_login];  
  22. GO  
  23.   
  24. --在主体服务器 host_A 上为见证服务器 host_C 创建一个登录名。  
  25. USE master;  
  26. --DROP LOGIN host_C_login  
  27. CREATE LOGIN host_C_login WITH PASSWORD = 'OA@asp.net';  
  28. GO  
  29.   
  30. --创建一个使用该登录名的用户。  
  31. --DROP USER host_C_user  
  32. CREATE USER host_C_user FOR LOGIN host_C_login;  
  33.   
  34. GO  
  35.   
  36. --使证书与该用户关联。  
  37. --DROP CERTIFICATE host_C_cert  
  38. CREATE CERTIFICATE host_C_cert  
  39. AUTHORIZATION host_C_user  
  40. FROM FILE = 'D:/dbmirror/host_C.cer'  
  41. GO  
  42.   
  43. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  44. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_C_login];  
  45. GO  
  46.   
  47. --主体服务器上创建用于本机的登录名(MS可以省略)  
  48. USE master;  
  49. --DROP LOGIN host_A_login  
  50. CREATE LOGIN host_A_login WITH PASSWORD= 'OA@asp.net';  
  51. GO  
  52.   
  53. --创建一个使用该登录名的用户。  
  54. --DROP USER host_A_user  
  55. CREATE USER host_A_user FOR CERTIFICATE host_A_cert;  
  56. GO  
  57.   
  58. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  59. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_A_login];  
  60. GO  

 

(二)为镜像服务器配置入站连结:

[c-sharp]  view plain copy
  1. --在镜像服务器 host_B 上为主体服务器 host_A 创建一个登录名。  
  2.   
  3. USE master;  
  4. --DROP LOGIN host_A_login  
  5. CREATE LOGIN host_A_login WITH PASSWORD = 'OA@asp.net';  
  6. GO  
  7.   
  8. --创建一个使用该登录名的用户。  
  9. --DROP USER host_A_user  
  10. CREATE USER host_A_user FOR LOGIN host_A_login;  
  11. GO  
  12.   
  13. --使证书与该用户关联。  
  14. --DROP CERTIFICATE host_A_cert  
  15. CREATE CERTIFICATE host_A_cert  
  16. AUTHORIZATION host_A_user  
  17. FROM FILE = 'D:/dbmirror/host_A.cer'  
  18. GO  
  19.   
  20. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  21. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_A_login];  
  22. GO  
  23.   
  24. --在镜像服务器 host_B 上为见证服务器 host_C 创建一个登录名。  
  25.   
  26. USE master;  
  27. --DROP LOGIN host_C_login  
  28. CREATE LOGIN host_C_login WITH PASSWORD = 'OA@asp.net';  
  29. GO  
  30.   
  31. --创建一个使用该登录名的用户。  
  32. --DROP USER host_C_user   
  33. CREATE USER host_C_user FOR LOGIN host_C_login;  
  34. GO  
  35.   
  36. --使证书与该用户关联。  
  37. --DROP CERTIFICATE host_C_cert  
  38. CREATE CERTIFICATE host_C_cert  
  39. AUTHORIZATION host_C_user  
  40. FROM FILE = 'D:/dbmirror/host_C.cer'  
  41. GO  
  42.   
  43. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  44. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_C_login];  
  45. GO  
  46.   
  47. --在镜像服务器 host_B 上为本机创建一个登录名(MS可以省略)  
  48. USE master;  
  49. --DROP LOGIN host_B_login  
  50. CREATE LOGIN host_B_login WITH PASSWORD = 'OA@asp.net';  
  51. GO  
  52.   
  53. --创建一个使用该登录名的用户。  
  54. --DROP USER host_B_user  
  55. CREATE USER host_B_user FOR CERTIFICATE host_B_cert;  
  56. GO  
  57.   
  58. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  59. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_B_login];  
  60. GO  

 

(三)为见证服务器配置入站连接:

[c-sharp]  view plain copy
  1. --在见证服务器 host_C 上为主体服务器 host_A 创建一个登录名。  
  2.   
  3. USE master;  
  4. --DROP LOGIN host_A_login  
  5. CREATE LOGIN host_A_login WITH PASSWORD = 'OA@asp.net';  
  6. GO  
  7.   
  8. --创建一个使用该登录名的用户。  
  9. --DROP USER host_A_user  
  10. CREATE USER host_A_user FOR LOGIN host_A_login;  
  11. GO  
  12.   
  13. --使证书与该用户关联。  
  14. --DROP CERTIFICATE host_A_cert  
  15. CREATE CERTIFICATE host_A_cert  
  16. AUTHORIZATION host_A_user  
  17. FROM FILE = 'D:/dbmirror/host_A.cer'  
  18. GO  
  19.   
  20. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  21. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_A_login];  
  22. GO  
  23.   
  24. --在见证服务器 host_C 上为镜像服务器 host_B 创建一个登录名。  
  25.   
  26. USE master;  
  27. --DROP LOGIN host_B_login  
  28. CREATE LOGIN host_B_login WITH PASSWORD = 'OA@asp.net';  
  29. GO  
  30.   
  31. --创建一个使用该登录名的用户。  
  32. --DROP USER host_B_user  
  33. CREATE USER host_B_user FOR LOGIN host_B_login;  
  34. GO  
  35.   
  36. --使证书与该用户关联。  
  37. --DROP CERTIFICATE host_B_cert  
  38. CREATE CERTIFICATE host_B_cert  
  39. AUTHORIZATION host_B_user  
  40. FROM FILE = 'D:/dbmirror/host_B.cer'  
  41. GO  
  42.   
  43. --授予对远程镜像端点的登录名的 CONNECT 权限。  
  44. GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_B_login];  
  45. GO  

 

4、 配置镜像数据库用户信息
数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。
通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用 'uhost' 作为登录名访问数据库,但是在

备机中没有 'uhost' 这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户".

 

在主数据库中执行如下语句

[c-sharp]  view plain copy
  1. USE master;  
  2. select sid,name from syslogins;  

 

查找出相应的用户名和sid,例如:上述的 'uhost'

在备数据库中执行如下语句:

[c-sharp]  view plain copy
  1. USE master;  
  2. exec sp_addlogin   
  3. @loginame = '<LoginName>',   
  4. @passwd = '<Password>',   
  5. @sid = <sid> ;  

 

这里的 'LoginName' 即主数据库中的登录名,sid即是上述通过SQL语句查找出的sid。

例如,查询得到的sid和name如下所示。

sid name
---------------------------------- -----------------
50x074477739DCA0E499C29394FFFC4ADE4 uhost

则建立登录名的SQL语句:

[c-sharp]  view plain copy
  1. USE master;  
  2. exec sp_addlogin   
  3. @loginame = 'uhost',  
  4. @passwd = 'OA@asp.net',   
  5. @sid = 0x074477739DCA0E499C29394FFFC4ADE4;  

 

到此为止可以认为备机数据库的环境已经与主机同步了

在主体服务器 host_A 上备份数据库,镜像只支持完全恢复模式,在备份数据库之前检查恢复的模式,需要同时完整备份数据库和事务日志。

[c-sharp]  view plain copy
  1. USE MASTER;   
  2. GO   
  3. BACKUP DATABASE DBMirror  
  4. TO DISK = 'D:/dbmirror/DB.bak'   
  5. WITH INIT   
  6. GO   
  7. BACKUP LOG Credit   
  8. TO DISK = 'D:/dbmirror/DB_log.bak'   
  9. WITH INIT   
  10. GO  

 

将DB.bak、DB_log.bak复制到镜像服务器 host_B 上,复制到 host_B 的镜像服务器实例上以NORECOVERNY选项进行恢复.
注意:这里数据库必须备份两次,一次全备份和一次事务日志备份,在镜像服务器上还原数据库必须使用NORECOVERNY选项进行恢复.

 

5、 配置镜像伙伴

(一)在镜像服务器上配置

[c-sharp]  view plain copy
  1. --在镜像服务器 host 实例上设置其伙伴,使其伙伴成为主体服务器  
  2.   
  3. ALTER DATABASE DBMirror  
  4. SET PARTNER = 'TCP://192.168.1.21:5022';  
  5. GO  

 

(二)在主体服务器上配置

[c-sharp]  view plain copy
  1. --必须要在镜像数据库中先设置好伙伴后,才能在主体服务器执行  
  2. --在主体服务器 host_A 实例上设置镜像服务器为伙伴  
  3. ALTER DATABASE DBMirror  
  4. SET PARTNER = 'TCP://192.168.1.254:5022';  
  5. GO  

 

(三)在主体服务器上配置见证服务器

[c-sharp]  view plain copy
  1. --设置见证服务器,在主体服务器 host_A 实例上设置见证服务器  
  2. ALTER DATABASE DBMirror   
  3. SET WITNESS = 'TCP://192.168.1.22:5022';  
  4. GO  

 

至此,镜像服务器配置成功,测试操作:
1、主备互换

[c-sharp]  view plain copy
  1. --主机执行:  
  2. USE master;  
  3. ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER;  

 

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

[c-sharp]  view plain copy
  1. --备机执行:  
  2. USE master;  
  3. ALTER DATABASE <DatabaseName> SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;  

 


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

[c-sharp]  view plain copy
  1. --备机执行:  
  2. USE master;  
  3. ALTER DATABASE <DatabaseName> SET PARTNER RESUME; --恢复镜像  
  4. ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --切换主备  

 

默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。
关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。

[c-sharp]  view plain copy
  1. USE master;  
  2. ALTER DATABASE <DatabaseName> SET PARTNER SAFETY FULL; --事务安全,同步模式  
  3. ALTER DATABASE <DatabaseName> SET PARTNER SAFETY OFF; --事务不安全,异步模式  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值