我正在configuration两个SQL 2008命名实例(主机服务器不是域成员)之间的WAN链路上的数据库镜像,并使用证书进行身份validation。 经过许多尝试让我自己工作,我已经从头开始,并按照BOL http://technet.microsoft.com/en-us/library/ms191140.aspx一步一步,但是我试图解决的问题解决仍然存在。
问题出现在设置每台服务器上的合作伙伴状态的最后一步,当我执行步骤#2将合作伙伴状态设置为“HOST_A”时,出现以下错误:
Msg 1418,Level 16,State 1,Line 2
服务器networking地址“TCP://server-b.our-domain.com:5022”无法到达或不存在。 检查networking地址名称以及本地和远程端点的端口是否可用。
不过有趣的是,我可以看到防火墙上的stream量(TCPDUMP)在两台服务器之间来回传输大约15秒,然后错误就回吐给我。
在这一点上,我不知道如何继续,因为我可以连接到SERVER-B上SSMS的SERVER-A \ BLUE实例,我可以连接到SERVER-A上SSMS的SERVER-B \ RED实例,没有问题。 我很困惑,为什么我现在得到这个错误。 两端的端点都列在sys.tcp_endpoints和sys.endpoints中。
另一个值得注意的事情是, 在尝试执行第2步之前 ,我可以通过5022 Telnet从SERVER-A到SERVER-B,然后从SERVER-B到SERVER-A通过5022,但是在步骤2失败后,我无法再通过任何一个方向远程login。 TCPDUMP将显示从任一到另一个的stream量,但在步骤2失败后没有返回stream量。
我的主要问题是,这个错误似乎有任何实际发生的错误描述,因为清楚的networking地址存在,可以达到和端点也是可操作的(至less直到操作失败[Rolleyes])我有也尝试在相反的方向做configuration(做一个完整的备份/恢复没有恢复等走向另一个方向),并以同样的方式提供相同的错误,但仍然显示在防火墙上的所有通信失败。
最后,在SQL日志中,我也得到错误“错误:1443,严重性:16,状态:2。 这似乎是直接相关的,我在网上find的一些build议与Windows身份validation问题,但不应该是这样,因为我的terminalconfiguration证书。
任何帮助,将不胜感激。
下面是用于设置的实际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附加到两个实例(如果有证人,则全部三个)并监视事件审计数据库镜像login事件类和代理:连接事件类 。
错误1418只是说明在一个特定的超时时间内,无论出于何种原因,mirroirng会话都没有启动和运行。 在主体上发出ALTER DATABASE … SET PARTNER ='tcp:// ..'时,主体将连接到镜像,镜像将连接到主体作为响应。 这意味着既定的主要“合作伙伴”价值和镜像“合作伙伴”的价值,都必须是正确的,并且底层基础设施(路由,DNS,IPSEC,防火墙)必须全部连接到合作伙伴所需的地址:端口。 如果你有一个证人,那么你可以把证件扔进去,而且你必须validationTCP连接是否非常复杂。
如果问题是证书安全问题,则审计数据库镜像login事件将清楚地说明原因和问题(证书无效,过期,使用的证书不正确等)。 如果问题是TCP协议(路由,DNS,IPSEC,防火墙等),则Broker:Connection事件实际上会显示问题。
如果您想明白基于证书的身份validation是如何工作的,请参阅基于证书的身份validation如何工作 。