私は、ドメイン メンバーではないホスト サーバーである 2 つの SQL 2008 名前付きインスタンス間の WAN リンクを介してデータベース ミラーリングを構成しています。認証には証明書を使用します。これを自分で動作させるために何度も試行した後、私は最初から始め、BOL に従ってステップ バイ ステップで実行しました。http://technet.microsoft.com/ja-jp/library/ms191140.aspx よりしかし、解決しようとしていた問題はまだ存在しています。
問題は、各サーバーのパートナー ステータスを設定する一連の最終手順にあります。手順 2 を実行して「HOST_A」のパートナー ステータスを設定すると、次のエラーが発生します。
メッセージ 1418、レベル 16、状態 1、行 2
サーバー ネットワーク アドレス「TCP://server-b.our-domain.com:5022」にアクセスできないか、存在しません。ネットワーク アドレス名を確認し、ローカルおよびリモート エンドポイントのポートが動作していることを確認してください。
しかし興味深いのは、そのエラーが返される前に、ファイアウォール上のトラフィック (TCPDUMP) が 2 つのサーバー間で約 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 へ Telnet できますが、手順 2 が失敗した後は、どちらの方向にも Telnet できなくなります。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
答え1
プロファイラーを両方のインスタンス(監視対象がある場合は3つすべて)に接続し、イベントを監視します。監査データベースミラーリングログインイベントクラスそしてブローカー:接続イベントクラス。
エラー 1418 は、何らかの理由で、特定のタイムアウト内にミラーリング セッションが起動しなかったことを示しています。プリンシパルで ALTER DATABASE ... SET PARTNER = 'tcp://..' を発行すると、プリンシパルはミラーに接続します。そしてミラーは応答としてプリンシパルに接続します。つまり、以前に設定されたプリンシパルの「パートナー」値とミラーの「パートナー」値の両方が関係し、両方とも正しくなければならず、基盤となるインフラストラクチャ(ルーティング、DNS、IPSEC、ファイアウォール)が目的のアドレス:ポートへの接続を許可する必要があります。両方パートナー。証人がいる場合は証人も追加すると、検証が必要な TCP 接続の非常に複雑なヘアボールが作成されます。
問題が証明書のセキュリティである場合、Audit Database Mirroring Login イベントに原因と問題 (証明書が無効、期限切れ、不正な証明書が使用されているなど) が明確に示されます。問題が下位の TCP ファブリック (ルーティング、DNS、IPSEC、ファイアウォールなど) である場合、Broker:Connection イベントに実際に問題が表示されます。
証明書ベースの認証がどのように機能するかを正確に理解したい場合は、以下をお読みください。証明書ベースの認証はどのように機能するか。