背景
在此之前的测试中,将测试的3台机器加入同一域来搭建数据库镜像环境,但考虑到目前的生产环境中的服务器并没有全部加入域中,因此考虑使用证书设置数据库镜像,从而减少对生产环境的影响。
环境
VM | Rule | IP | MSSQL Version |
---|---|---|---|
node1 | Primary | 192.168.24.101 | SQL Server 2008 R2 |
node2 | Mirror | 192.168.24.102 | SQL Server 2008 R2 |
node1 和 node2 两个服务器实例在非信任的 Windows 域中运行,因此需要基于证书的身份验证。
node1 担当主服务器,node2 担当镜像角色。
使用证书设置数据库镜像涉及四个常规阶段,本示例演示其中的三个阶段:1、2、4。 这些阶段如下:
-
配置出站连接
本示例显示了下列操作的步骤
a.为出站连接配置 Host_A。
b.为出站连接配置 Host_B。
有关设置数据库镜像的本阶段信息,请参阅 允许数据库镜像端点使用证书进行出站连接 (Transact-SQL)。 -
配置入站连接
本示例显示了下列操作的步骤:
a.为入站连接配置 Host_A。
b.为入站连接配置 Host_B。
有关设置数据库镜像的本阶段信息,请参阅 允许数据库镜像端点将证书用于入站连接 (Transact-SQL)。 -
创建镜像数据库
有关如何创建镜像数据库的信息,请参阅 为镜像准备镜像数据库 (SQL Server)。
配置出站连接
为出站连接配置 node1
- 在 master 数据库中,创建数据库主密钥(如果需要的话)
use master;
create master key encryption by password = 'YC1Z@sym';
go
- 为该服务器实例制作一个证书
use master;
create certificate node1_cert
with subject = 'node1 certificate',
expiry_date = '01/01/2099';
go
重要
证书默认有效时间为1年,如果想要使用超过一年的证书,则通过在CREATE CERTIFICATE
语句中使用EXPIRY_DATE
选项,按UTC
时间指定到期日期。
若证书已存在,则先删除
drop certificate node1_cert
- 使用该证书为服务器实例创建一个镜像端点
- 若端点存在则删除
DROP ENDPOINT Endpoint_Mirroring
- 创建镜像端点
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=7024
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE node1_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
- 选项
STATE = { STARTED | STOPPED | DISABLED }
创建端点时的状态。如果在创建端点时未指定状态,则默认为STOPPED
。AS {TCP}
指定要使用的传输协议。LISTENER_PORT = listenerPort
指定服务代理TCP / IP
协议为连接侦听的端口号。按照惯例,1024
和32767
之间的任何数字都是有效的。LISTENER_IP = ALL | (4-part-ip ) | ( “ ip_address_v6 ” )
指定端点将侦听的IP
地址。默认值为ALL
。这意味着侦听器将接受任何有效IP
地址上的连接。AUTHENTICATION = <authentication_options>
指定此端点的连接的TCP/IP
身份验证要求。默认为WINDOWS
。CERTIFICATE certificate_name
指定端点使用certificate_name
指定的证书对连接进行身份验证,以建立授权标识。远端点必须具有证书,其公钥与指定证书的私钥匹配。ENCRYPTION = { DISABLED | SUPPORTED | REQUIRED } [ALGORITHM { AES | RC4 | AES RC4 | RC4 AES } ]
指定加密算法,默认为REQUIRED
。ROLE = { WITNESS | PARTNER | ALL }
指定端点支持的数据库镜像的角色
- 备份 node1 证书,并将其复制到 node2 服务器实例
BACKUP CERTIFICATE node1_cert TO FILE = 'E:\SQLServerBackUp\node1_cert.cer';
GO
- 使用任一安全的复制方法,将
E:\SQLServerBackUp\node1_cert.cer
复制到node2
。
为出站连接配置 node2
- 在 master 数据库中,创建数据库主密钥(如果需要的话)
use master;
create master key encryption by password = 'YC1Z@sym';
go
- 为该服务器实例制作一个证书
use master;
create certificate node2_cert
with subject = 'node1 certificate',
expiry_date = '01/01/2099';
go
若证书已存在,则先删除
drop certificate node1_cert
- 使用该证书为服务器实例创建一个镜像端点
- 若端点存在则删除
DROP ENDPOINT Endpoint_Mirroring
- 创建镜像端点
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=7024
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE node2_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
- 备份
node2
证书,并将其复制到node1
服务器实例
BACKUP CERTIFICATE node2_cert TO FILE = 'E:\SQLServerBackUp\node2_cert.cer';
GO
- 使用任一安全的复制方法,将
E:\SQLServerBackUp\node2_cert.cer
复制到node2
。
配置入站连接
为入站连接配置 node1
- 在 node1 上为 node2 创建一个登录名
use master;
create login node2_login with password = 'YC1Z@sym';
go
- 创建一个使用该登录名的用户
create user node2_user for login node2_login;
go
- 使证书与该用户关联
CREATE CERTIFICATE node2_cert
AUTHORIZATION node2_user
FROM FILE = 'E:\SQLServerBackUp\node2_cert.cer'
GO
- 授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO node2_login;
GO
为入站连接配置 node2
- 在 node2 上为 node1 创建一个登录名
use master;
create login node1_login with password = 'YC1Z@sym';
go
- 创建一个使用该登录名的用户。
create user node1_user for login node1_login;
go
- 使证书与该用户关联。
create certificate node1_cert
authorization node1_user
from file = 'E:\SQLServerBackUp\node1_cert.cer';
go
- 授予对远程镜像端点的登录名的 CONNECT 权限。
create certificate node1_cert
authorization node1_user
from file = 'E:\SQLServerBackUp\node1_cert.cer';
go
重要
如果打算在具有自动故障转移功能的高安全性模式下运行,则必须重复相同的设置步骤为出站连接和入站连接配置见证服务器。 设置入站连接时,如果涉及到见证服务器,则需要为两个伙伴的见证服务器和见证服务器的两个伙伴设置登录名和用户。
创建镜像数据库
配置镜像伙伴
- 在 node2 的镜像服务器实例上,将 node1 上的服务器实例设置为伙伴(使其成为初始主体服务器实例)。 将
TCP://HOST_A.Mydomain.Corp.Adventure-Works.com:7024
替换为有效的网络地址。 有关详细信息,请参阅 指定服务器网络地址(数据库镜像)。
--At node2, set server instance on node1 as partner (principal server):
ALTER DATABASE AdventureWorks
SET PARTNER = 'TCP://HOST_A.Mydomain.Corp.Adventure-Works.com:7024';
GO
如:
alter database test
set partner = 'tcp://192.168.24.101:7024';
go
- 在 ndoe1 的主体服务器实例上,将 node2 上的服务器实例设置为伙伴(使其成为初始镜像服务器实例)。 将
TCP://HOST_B.Mydomain.Corp.Adventure-Works.com:7024
替换为有效的网络地址。
--At node1, set server instance on node2 as partner (mirror server).
ALTER DATABASE AdventureWorks
SET PARTNER = 'TCP://HOST_B.Mydomain.Corp.Adventure-Works.com:7024';
GO
alter database test
set partner = 'tcp://192.168.24.102:7024';
go
- 此示例假设会话将在高性能模式下运行。 若要在高性能模式下配置此会话,在主体服务器实例上(位于 node1 上),将事务安全性设置为
OFF
。
--Change to high-performance mode by turning off transacton safety.
ALTER DATABASE AdventureWorks
SET PARTNER SAFETY OFF
GO