SQLserver 可以把镜像和复制同时部署,结合了双方的高可用性,可以使数据库得到更好的高可用性和容灾的保证。
关于镜像:数据库镜像
关于复制:SQL Server 复制
本章的复制为事务可更新订阅:事务复制的可更新订阅
关于复制和数据库镜像:复制和数据库镜像
理论的东西参考官方文档吧,这里主要是部署配置过程。
下图为本章参考部署的架构图:

本章模拟的服务器:
?
| kk-ad |
192.168.2.1 |
DC(域控) |
| kk-db1 |
192.168.2.10 |
主机(Replication + Mirror) |
| kk-db2 |
192.168.2.11 |
镜像(Mirror) |
| kk-db3 |
192.168.2.12 |
见证机(WITNESS)+ 分发 |
| kk-db4 |
192.168.2.13 |
订阅(测试1个) |
?
将复制与数据库镜像一起使用时,注意以下要求和注意事项:
?
1. 主体数据库和镜像数据库必须共享分发服务器。 建议此处使用远程分发服务器,如果发布服务器有意外故障转移,则远程分发服务器可以提供较大的容错能力。
?
2. 对于合并复制,以及对于使用只读订阅服务器或排队更新订阅服务器的事务复制,复制支持对发布数据库进行镜像。 不支持即时更新对等拓扑中的订阅服务器、Oracle 发布服务器、发布服务器并重新发布。
?
3. 存在于数据库外部的元数据和对象不复制到镜像数据库,包括登录名、作业、链接服务器等等。 如果要求镜像数据库中有元数据和对象,则必须手动复制它们。
配置复制和数据库镜像主要步骤:
1. 配置数据库镜像;(参考 SQLServer 数据库镜像(二)域环境中完整镜像脚本配置)
2. 配置分发服务器;(参考 如何配置发布和分发 , 如何在分发服务器上启用远程发布服务器)
3. 配置发布和订阅;(参考 如何创建事务性发布的可更新订阅 ,SqlServer 使用脚本创建分发服务及事务复制的可更新订阅)
说明及注意修改的地方:
本测试使用域账号作为数据库登录账号:[KK\UserReplMirror]
对应数据库用户:[UserReplMirror]
测试数据库:[DemoDB]
确保各服务器能相互访问
数据库 [DemoDB] 恢复模式为完整模式(镜像必须)
数据库 [DemoDB] 所有者改为 [sa]
账号 [KK\UserReplMirror] 授予 sysadmin 权限;或者在数据库 [DemoDB] 中授予用户 [UserReplMirror] 数据库角色为 [db_owner]
复制的代理作业的所有者都改为[sa]
1. 配置数据库镜像:
?
--主体创建数据库 USE [master] GO CREATE DATABASE [DemoDB] GO ALTER DATABASE [DemoDB] SET RECOVERY FULL WITH NO_WAIT GO --主体:创建证书 和 备份 USE master; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'kk_2012@'; GO CREATE CERTIFICATE Cert_kk_db1_mssqlserver WITH SUBJECT = 'Cert_kk_db1_mssqlserver', START_DATE = '2015-06-01',EXPIRY_DATE = '2018-06-01'; GO BACKUP CERTIFICATE Cert_kk_db1_mssqlserver TO FILE = 'C:\Databases\Cert_kk_db1_mssqlserver.cer'; GO --镜像:创建证书 和 备份 USE master; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'kk_2012@'; GO CREATE CERTIFICATE Cert_kk_db2_mssqlserver WITH SUBJECT = 'Cert_kk_db2_mssqlserver', START_DATE = '2015-06-01',EXPIRY_DATE = '2018-06-01'; GO BACKUP CERTIFICATE Cert_kk_db2_mssqlserver TO FILE = 'C:\Databases\Cert_kk_db2_mssqlserver.cer'; GO --见证:创建证书 和 备份 USE master; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'kk_2012@'; GO CREATE CERTIFICATE Cert_kk_db3_mssqlserver WITH SUBJECT = 'Cert_kk_db3_mssqlserver', START_DATE = '2015-06-01',EXPIRY_DATE = '2018-06-01'; GO BACKUP CERTIFICATE Cert_kk_db3_mssqlserver TO FILE = 'C:\Databases\Cert_kk_db3_mssqlserver.cer'; GO -- 交换证书(相互拷贝证书): /* 主体证书(拷贝到)————>镜像、见证 镜像证书(拷贝到)————>主体、见证 见证证书(拷贝到)————>主体、镜像 */ -- 主体(创建用户、还原证书、创建端点): USE master GO CREATE LOGIN [KK\UserReplMirror] FROM WINDOWS; GO CREATE USER [UserReplMirror] FOR LOGIN [KK\UserReplMirror]; GO CREATE CERTIFICATE [Cert_kk_db2_mssqlserver] AUTHORIZATION [UserReplMirror] FROM FILE = 'C:\Databases\Cert_kk_db2_mssqlserver.cer'; GO CREATE CERTIFICATE [Cert_kk_db3_mssqlserver] AUTHORIZATION [UserReplMirror] FROM FILE = 'C:\Databases\Cert_kk_db3_mssqlserver.cer'; GO CREATE ENDPOINT [Endpoint_For_Mirror] AUTHORIZATION [KK\UserReplMirror] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = CERTIFICATE Cert_kk_db1_mssqlserver, ENCRYPTION = REQUIRED ALGORITHM AES) GO --GRANT CONNECT ON ENDPOINT::Endpoint_For_Mirror TO [KK\UserReplMirror]; --GO -- 镜像(创建用户