可用性グループを作成し、アクティブなセカンダリレプリカのデータベースユーザーにログインをマップする必要があります。 (Node2)残念ながら、exec sp_change_users_login
またはalter user with login
、データベースが読み取り専用であることを通知するエラーメッセージが表示されます。当然のことですが、どのように修正すればよいかわかりません。昨夜フェイルオーバーして、Node2のログインを修正してから、Node1にフェイルバックしようとしましたが、Node1でのログイン/ユーザーマッピングが間違っています。それらを修正すると、Node2のログインは再びうまくいきません。
これは本番システムなので、今夜遅くまでやりたいことができません。テストラボではこの問題に遭遇しませんでした。違いは、以前にデータベースに参加する前にログインを作成したのに対し、今回は後で作成しようとし、プロセスを正しく文書化できなかったことです。 AGを停止して再構築することは、できれば避けたいものです。
問題は私には理にかなっています、私はそれを修正する方法を本当に知りません。
SIDが一致しないインスタンスに接続するだけで、ログインを再作成し、SIDを明示的に指定する必要があります。たとえば、孤立したユーザーがいるインスタンスでは、次のようにするとユーザーが返されます。
exec sp_change_users_login 'report';
go
列UserSID
からSIDをコピーします。そして、そのインスタンスの名前を保持したい既存のログインがすでにある場合はできません。 ALTER LOGIN
を使用してSIDを変更する方法はありません。したがって、ログインを削除して再作成する必要があります。
drop login YourLogin;
go
create login YourLogin
with
password = 'password',
check_policy = off, -- simple password and no check policy for example only
sid = 0xC26909...................;
go
ここでも、CREATE LOGIN
のsid
パラメータを、UserSID
でsp_change_users_login
を実行して取得したreport
に設定します。
注:レプリカ間でパスワードが一致しないように、この/これらのレプリカのパスワードを同じに設定する必要があります。
ここでの問題のログインはSQL Serverログインであると想定しています。これは、Windows Authドメインアカウントでは問題にならないためです。SIDは各インスタンスで同じであるべきだからです。
ここで含まれるデータベースを利用して、データベースプリンシパルをデータベースレベルで認証することもできます。そうすれば、孤立したユーザーについて心配する必要がなくなります。
これに関するいくつかのドキュメントがあります:
可用性グループのデータベースのログインとジョブの管理に関するBOLリファレンス
SQL Serverのインスタンス間でログインとパスワードを転送する方法に関するKB記事
また、これは言うまでもありませんが、開発/ QA環境でテストして、本番稼働前に適切な機能を確認および確認してください。