我正在通过两个 SQL 2008 命名实例之间的 WAN 链接配置数据库镜像,这些实例的主机服务器不是域成员,使用证书进行身份验证。经过多次尝试自己完成这项工作后,我从头开始并根据 BOL http://technet.microsoft.com/en-us/library/ms191140.aspx逐步进行,但是我正在尝试的问题解决仍然存在。
问题在于在每台服务器上设置合作伙伴状态的最终步骤集,当我执行步骤 #2 以在“HOST_A”上设置合作伙伴状态时,我收到以下错误:
消息 1418,第 16 层,状态 1,第 2 行
服务器网络地址“TCP://server-b.our-domain.com:5022”无法访问或不存在。检查网络地址名称以及本地和远程端点的端口是否可操作。
然而,有趣的是,我可以看到防火墙上的流量(TCPPDUMP)在两台服务器之间来回传输大约 15 秒,然后该错误被吐回给我。
此时我不确定如何继续,因为我可以从 SERVER-B 上的 SSMS 连接到 SERVER-A\BLUE 实例,并且可以从 SERVER-A 上的 SSMS 连接到 SERVER-B\RED 实例而没有问题。我很困惑为什么我会在这个时间点收到错误。两侧的端点在 sys.tcp_endpoints 和 sys.endpoints 中被列为启动。
另一个有趣的注意事项是,在尝试第 2 步之前,我可以通过 5022 从 SERVER-A 远程登录到 SERVER-B,并且可以通过 5022 从 SERVER-B 远程登录到 SERVER-A,但是在第 2 步失败后,我无法再从任一方向远程登录。TCPDUMP 将显示从任何一个到另一个的流量,但在第 2 步失败后没有返回流量。
对我来说主要问题是这个错误似乎对实际发生的任何事情都有错误的描述,因为显然网络地址存在并且可以到达并且端点也可以运行(至少直到操作失败 [Rolleyes] )我有还尝试以相反的方向进行配置(进行完全备份/恢复而没有恢复等)并且它以完全相同的方式失败,提供相同的错误,但所有流量再次显示在防火墙上。
最后,在 SQL 日志中,我还收到错误“错误:1443,严重性:16,状态:2”。这似乎是直接相关的,我在网上发现的一些内容表明 Windows 身份验证存在问题,但情况并非如此,因为我的端点配置了证书。
对此的任何帮助将不胜感激。
这是用于设置的实际 T-SQL,它遵循 BOL 文章中的内容。
--ON SERVER-A\BLUE
use master
go
create master key encryption by password = 'password123!'
go
create certificate CA_cert
With subject = 'CA_cert Certificate'
go
create endpoint Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE CA_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
)
go
BACKUP CERTIFICATE CA_cert TO FILE = 'c:\sql\CA_cert.cer'
go
--ON SERVER-B\RED
use master
go
create master key encryption by password = 'password123!'
go
create certificate NJ_cert
With subject = 'NJ_cert Certificate'
go
create endpoint Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE NJ_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
)
go
BACKUP CERTIFICATE NJ_cert TO FILE = 'c:\sql\NJ_cert.cer'
go
--ON SERVER-A\BLUE
create login NJ_login WITH PASSWORD = 'password123!'
go
CREATE USER NJ_user FOR LOGIN NJ_login
go
CREATE CERTIFICATE NJ_cert
AUTHORIZATION NJ_user
FROM FILE = 'C:\sql\NJ_cert.cer'
go
GRANT CONNECT ON ENDPOINT::Mirroring TO NJ_login
go
--ON SERVER-B\RED
create login CA_login WITH PASSWORD = 'password123!'
go
CREATE USER CA_user FOR LOGIN CA_login
go
CREATE CERTIFICATE CA_cert
AUTHORIZATION CA_user
FROM FILE = 'C:\sql\CA_cert.cer'
go
GRANT CONNECT ON ENDPOINT::Mirroring TO CA_login
go
--ON SERVER-B\RED
alter database testdb
set partner = 'TCP://server-a.our-domain.com:5022'
go
--ON SERVER-A\BLUE
alter database testdb
set partner = 'TCP://server-b.our-domain.com:5022'
go
-- Everything works fine up until this point at which time I get the previously mentioned errors
将 Profiler 附加到两个实例(如果有见证,则全部三个)并监视事件Audit Database Mirroring Login Event Class和Broker:Connection Event Class。
错误 1418 只是说明在特定超时内,无论出于何种原因,mirroirng 会话都没有启动和运行。当您在主体上发出 ALTER DATABASE ... SET PARTNER = 'tcp://..' 时,主体将连接到镜像,并且镜像将连接到主体作为响应。这意味着先前设置的主要“合作伙伴”值和镜像“合作伙伴”值都会出现,它们都必须正确,并且底层基础设施(路由、DNS、IPSEC、防火墙)必须允许连接从两个合作伙伴到所需的地址:端口。如果你有一个见证人,你就给自己一个相当复杂的 TCP 连接毛球,必须验证它。
如果问题是证书安全,那么 Audit Database Mirroring Login 事件将清楚地说明原因和问题(证书无效、过期、使用了错误的证书等)。如果问题是底层 TCP 结构(路由、DNS、IPSEC、防火墙等),那么 Broker:Connection 事件实际上会显示问题。
如果您想准确了解基于证书的身份验证是如何工作的,请继续阅读基于证书的身份验证如何工作。