トラブルシューティング ツール: SQL Server トランザクション レプリケーションでのエラーを見つける
適用対象: SQL Server Azure SQL Managed Instance
トランザクション レプリケーションがどのように動作するのかを基本的に理解していないと、レプリケーション エラーのトラブルシューティングはフラストレーションを感じることがあります。 パブリケーション作成の最初のステップは、スナップショット エージェントでスナップショットを作成し、スナップショット フォルダーにそれを保存することです。 次に、ディストリビューション エージェントがサブスクライバーにスナップショットを適用します。
このプロセスでは、パブリケーションが作成されて、"同期" 状態にされます。 同期は次の 3 つのフェーズで動作します。
- レプリケートされるオブジェクトでトランザクションが発生し、トランザクション ログで "レプリケーション用" とマークされます。
- ログ リーダー エージェントがトランザクション ログをスキャンし、"レプリケーション用" とマークされたトランザクションを探します。これらのトランザクションは、ディストリビューション データベースに保存されます。
- ディストリビューション エージェントは、リーダー スレッドを使用してディストリビューション データベースをスキャンします。 次に、ライター スレッドを使用することにより、このエージェントはサブスクライバーに接続して、変更をサブスクライバーに適用します。
このプロセスのどのステップにおいてもエラーが発生する可能性があります。 これらのエラーを見つけることは、同期に関する問題のトラブルシューティングの最も困難な側面です。 レプリケーション モニターを使うとこのプロセスが簡単になります。
Note
- このトラブルシューティング ガイドの目的は、トラブルシューティングの手法を説明することです。 特定のエラーを解決することではなく、レプリケーションでのエラーの発見に関する一般的なガイダンスを提供することを目的として作成されています。 具体的な例がいくつか示されていますが、それらの解決方法は環境によって異なる場合があります。
- このガイドで例として提供されているエラーは、トランザクション レプリケーションの構成に関するチュートリアルが基になっています。
トラブルシューティングの手法
確認事項
- 同期プロセスのどこでレプリケーションが失敗するか。
- どのエージェントでエラーが発生するか。
- レプリケーションが最後に正常に動作したのはいつか。 その後で何か変更したか。
実行する手順
- レプリケーション モニターを使用して、レプリケーションでエラーが発生した箇所 (どのエージェントか) を特定します。
- パブリッシャーからディストリビューターまでセクションでエラーが発生している場合は、ログ リーダー エージェントに関する問題です。
- ディストリビューターからサブスクライバーまでセクションでエラーが発生している場合は、ディストリビューション エージェントに関する問題です。
- ジョブの利用状況モニターでそのエージェントのジョブ履歴を調べて、エラーの詳細を明らかにします。 ジョブ履歴では十分な詳細がわからない場合は、その特定のエージェントで詳細ログを有効にすることができます。
- エラーの解決方法の決定を試みます。
スナップショット エージェントでエラーを見つける
スナップショット エージェントは、スナップショットを生成し、それを指定されたスナップショット フォルダーに書き込みます。
スナップショット エージェントの状態を表示します。
a. オブジェクト エクスプローラーで、[レプリケーション] の下の [ローカル パブリケーション] ノードを展開します。
b. AdvWorksProductTrans パブリケーションを右クリックして、[スナップショット エージェントの状態の表示] をクリックします。
スナップショット エージェントの状態でエラーが報告された場合は、スナップショット エージェントのジョブ履歴で詳細を確認することができます。
a. オブジェクト エクスプローラーで [SQL Server エージェント] を展開し、[ジョブの利用状況モニター] を開きます。
b. [カテゴリ] で並べ替えて、カテゴリ REPL-Snapshot でスナップショット エージェントを識別します。
c. そのスナップショット エージェントを右クリックして、[履歴の表示] を選択します。
スナップショット エージェントの履歴で、関連するログ エントリを選択します。 これは、通常、エラーが報告されているエントリの 1 または 2 行 "前" にあります。 (赤い X はエラーを示します。) ログの下にあるボックス内のメッセージ テキストを確認してください。
The replication agent had encountered an exception. Exception Message: Access to path '\\node1\repldata.....' is denied.
スナップショット フォルダーに Windows のアクセス許可が正しく構成されていない場合は、スナップショット エージェントに "アクセスが拒否されました" エラーが表示されます。 スナップショットが格納されているフォルダーへのアクセス許可を確認し、スナップショット エージェントの実行に使用しているアカウントに共有にアクセスするためのアクセス許可があることを確認する必要があります。
ログ リーダー エージェントでエラーを見つける
ログ リーダー エージェントは、パブリッシャー データベースに接続し、トランザクション ログをスキャンして、"レプリケーション用" とマークされているトランザクションを探します。 次に、それらのトランザクションをディストリビューション データベースに追加します。
SQL Server Management Studio でパブリッシャーに接続します。 サーバー ノードを展開して [レプリケーション] フォルダーを右クリックし、[レプリケーション モニターの起動] を選択します。
レプリケーション モニターが開きます。
赤い X 印は、パブリケーションが同期していないことを示します。 左側で [マイ パブリッシャー] を展開し、関連するパブリッシャー サーバーを展開します。
左側で AdvWorksProductTrans パブリケーションを選択し、いずれかのタブで赤い X 印を探して、どこに問題があるかを特定します。 この場合、赤い X 印は [エージェント] タブにあるので、エージェントの 1 つでエラーが発生しています。
[エージェント] タブを選択し、どのエージェントでエラーが発生しているかを特定します。
この表示では、スナップショット エージェントとログ リーダー エージェントの 2 つのエージェントが示されています。 エラーが発生しているものに赤い X 印が付いています。この例ではログ リーダー エージェントです。
エラーが報告されている行をダブルクリックして、ログ リーダー エージェントのエージェント履歴を開きます。 この履歴では、エラーに関する詳細情報が提供されます。
Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'. The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'. Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'. Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
エラーは、通常、パブリッシャー データベースの所有者が正しく設定されていないときに発生します。 これは、データベースが復元されるときに発生することがあります。 これを確認するには、次のようにします。
a. オブジェクト エクスプローラーで [データベース] を展開します。
b. [AdventureWorks2022] を右クリックして、[Properties] をクリックします。
c. [ファイル] ページの下に所有者が存在することを確認します。 このボックスが空白の場合は、これが問題の原因と考えられます。
[ファイル] ページで所有者が空白の場合は、
AdventureWorks2022
データベースのコンテキスト内の [新しいクエリ] ウィンドウを開きます。 次の T-SQL コードを実行します。-- set the owner of the database to 'sa' or a specific user account, without the brackets. EXECUTE sp_changedbowner '<useraccount>' -- example for sa: exec sp_changedbowner 'sa' -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
ログ リーダー エージェントの再起動が必要な場合があります。
a. オブジェクト エクスプローラーで [SQL Server エージェント] ノードを展開し、ジョブの利用状況モニターを開きます。
b. [カテゴリ] で並べ替え、REPL-LogReader カテゴリによってログ リーダー エージェントを識別します。
c. ログ リーダー エージェント ジョブを右クリックし、[Start Job at Step]\(ステップでジョブを開始\) を選択します。
レプリケーション モニターをもう一度開いて、パブリケーションが現在同期されていることを確認します。 まだ開いていない場合は、オブジェクト エクスプローラーで [レプリケーション] を右クリックして見つけることができます。
AdvWorksProductTrans パブリケーション、[エージェント] タブの順に選択し、ログ リーダー エージェントをダブルクリックして、エージェントの履歴を開きます。 これで、ログ リーダー エージェントが実行中で、コマンドをレプリケートしているか、"レプリケートされたトランザクションが存在しない" のいずれかが示されるはずです。
ディストリビューション エージェントでエラーを見つける
ディストリビューション エージェントは、ディストリビューション データベースでデータを見つけて、それをサブスクライバーに適用します。
SQL Server Management Studio でパブリッシャーに接続します。 サーバー ノードを展開して [レプリケーション] フォルダーを右クリックし、[レプリケーション モニターの起動] を選択します。
[レプリケーション モニター] で、[AdvWorksProductTrans] パブリケーションを選択し、[すべてのサブスクリプション] タブを選択します。サブスクリプションを右クリックして [詳細表示] を選択します。
[ディストリビューターからサブスクライバーまで] 履歴ダイアログ ボックスが開き、エージェントで発生しているエラーの内容を明確にします。
Error messages: Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
このエラーは、ディストリビューション エージェントが再試行していることを示します。 詳細情報を探すには、ディストリビューション エージェントのジョブ履歴を確認します。
a. オブジェクト エクスプローラーで [SQL Server エージェント] を展開し、[ジョブの利用状況モニター] を開きます。
b. [カテゴリ] でジョブを並べ替えます。
c. カテゴリ REPL-Distribution でディストリビューション エージェントを識別します。 エージェントを右クリックして、[履歴の表示] を選択します。
いずれかのエラー エントリを選択し、ウィンドウの下部にエラー テキストを表示します。
Message: Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
このエラーは、ディストリビューション エージェントで使用されたパスワードが正しくないことを示しています。 これを解決するには次のようにします。
a. オブジェクト エクスプローラーで [レプリケーション] のノードを展開します。
b. サブスクリプションを右クリックして、[プロパティ] をクリックします。
c. [エージェント プロセス アカウント] の横にある省略記号 [...] を選択して、パスワードを変更します。
オブジェクト エクスプローラーで [レプリケーション] を右クリックして、レプリケーション モニターをもう一度確認します。 [すべてのサブスクリプション] の下の赤い X 印は、ディストリビューション エージェントでまだエラーが発生していることを示します。
[レプリケーション モニター] でサブスクリプションを右クリックして [詳細表示] を選択し、[ディストリビューターからサブスクライバーまで] の履歴を開きます。 ここでは、異なるエラーが表示されるようになります。
Connecting to Subscriber 'NODE2\SQL2016' Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'. Number: 18456 Message: Login failed for user 'NODE2\repl_distribution'.
このエラーは、ユーザー NODE2\repl_distribution のログインが失敗したため、ディストリビューション エージェントがサブスクライバーに接続できなかったことを示しています。 さらに詳しく調べるには、サブスクライバーに接続して、オブジェクト エクスプローラーで [管理] ノードの下の現在の SQL Server エラー ログを開きます。
このエラーが表示される場合は、ログインがサブスクライバー上にありません。 このエラーを解決するには、レプリケーションのためのアクセス許可に関するページをご覧ください。
ログイン エラーが解決された後、もう一度レプリケーション モニターを確認してください。 すべての問題が解決されると、[パブリケーション名] の横に緑色の矢印が表示され、[すべてのサブスクリプション] の下の状態が [実行中] になります。
サブスクリプションを右クリックして [ディストリビューターからサブスクライバーまで] 履歴をもう一度開き、成功したことを確認します。 ディストリビューション エージェントを初めて実行する場合は、スナップショットがサブスクライバーに一括コピーされます。
エージェントで詳細ログを有効にする
詳細ログを使用して、レプリケーション トポロジ内のエージェントで発生したエラーに関する詳細な情報を見ることができます。 手順はどのエージェントでも同じです。 ジョブの利用状況モニターで正しいエージェントを選択していることだけを確認してください。
Note
プル サブスクリプションかプッシュ サブスクリプションかに応じて、エージェントはパブリッシャーかサブスクライバーのどちらにある可能性もあります。 調査中のサーバーでエージェントを使用できない場合は、もう一方のサーバーをチェックします。
詳細ログを保存するかどうかを決めて、フォルダーが存在することを確認します。 この例では c:\temp を使います。
オブジェクト エクスプローラーで [SQL Server エージェント] ノードを展開し、ジョブの利用状況モニターを開きます。
[カテゴリ] で並べ替えて、関心のあるエージェントを見つけます。 この例では、ログ リーダー エージェントを使います。 関心のあるエージェントを右クリックして、[プロパティ] をクリックします。
[ステップ] ページを選択し、[エージェントを実行します] ステップを強調表示にします。 [編集] を選択します。
[コマンド] ボックスで新しい行を開始し、次のテキストを入力して、[OK] を選択します。
-Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
必要に応じて、場所と詳細レベルを変更できます。
Note
詳細出力パラメーターを追加するとき、次のような問題があると、エージェントが失敗したり、outfile ファイルが作成されない可能性があります。
- 書式設定に問題があり、ダッシュがハイフンになっています。
- ディスク上に場所が存在しません。または、エージェントを実行しているアカウントに、指定した場所に書き込むアクセス許可がありません。
- 最後のパラメーターと
-Output
パラメーターの間にスペースがありません。 - エージェントにより、サポートされる詳細さのレベルが異なります。 詳細ログを有効にしてもエージェントが起動しない場合は、指定した詳細レベルを 1 つ下げて再試行してください。
エージェントを右クリックして [Stop Job at Step] (ステップでジョブを停止) を選択し、ログ リーダー エージェントを再起動します。 ツール バーの [更新] アイコンを選択して更新します。 エージェントを右クリックして、[Start Job at Step] (ステップでジョブを開始) を選択します。
ディスクで出力を確認します。
詳細ログを無効にするには、前と同じ手順に従い、前に追加した
-Output
行全体を削除します。
関連するコンテンツ
ヘルプの参照
- SQL に対するご意見:SQL Serverの改善に関するご提案がある場合
- Microsoft Q & A (SQL Server)
- DBA Stack Exchange (tag sql-server):SQL Server に関する質問
- スタック オーバーフロー (tag sql-server):SQL 開発に関する質問とその回答
- Reddit:SQL Server に関する一般的なディスカッション
- MicrosoftSQL Serverライセンス条項および情報
- 法人のお客様向けサポート オプション
- Microsoft へのお問い合わせ
- その他の SQL Serverのヘルプとフィードバック
SQL ドキュメントへの投稿
SQL コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。
詳細については、「SQL Server のドキュメントに投稿する方法」を参照してください。