適用対象:SQL Server
Azure SQL Managed Instance
トランザクション レプリケーションがどのように動作するのかを基本的に理解していないと、レプリケーション エラーのトラブルシューティングはフラストレーションを感じることがあります。 パブリケーション作成の最初のステップは、スナップショット エージェントでスナップショットを作成し、スナップショット フォルダーにそれを保存することです。 次に、ディストリビューション エージェントがサブスクライバーにスナップショットを適用します。
このプロセスでは、パブリケーションが作成されて、"同期" 状態にされます。 同期は次の 3 つのフェーズで動作します。
レプリケートされるオブジェクトでトランザクションが発生し、トランザクション ログで "レプリケーション用" とマークされます。
ログ リーダー エージェントがトランザクション ログをスキャンし、"レプリケーション用" とマークされたトランザクションを探します。これらのトランザクションは、ディストリビューション データベースに保存されます。
ディストリビューション エージェントは、リーダー スレッドを使用してディストリビューション データベースをスキャンします。 次に、ライター スレッドを使用することにより、このエージェントはサブスクライバーに接続して、変更をサブスクライバーに適用します。
このプロセスのどのステップにおいてもエラーが発生する可能性があります。 これらのエラーを見つけることは、同期に関する問題のトラブルシューティングの最も困難な側面です。 レプリケーション モニターを使うとこのプロセスが簡単になります。
注
このトラブルシューティング ガイドの目的は、トラブルシューティングの手法を説明することです。 特定のエラーを解決することではなく、レプリケーションでのエラーの発見に関する一般的なガイダンスを提供することを目的として作成されています。 具体的な例がいくつか示されていますが、それらの解決方法は環境によって異なる場合があります。 エラーの例は、「 チュートリアル: 完全に接続された 2 つのサーバー (トランザクション) 間のレプリケーションを構成する」 チュートリアルに基づいています。
トラブルシューティングの手法
確認事項
- 同期プロセスのどこでレプリケーションが失敗するか。
- どのエージェントでエラーが発生するか。
- レプリケーションが最後に正常に動作したのはいつか。 その後で何か変更したか。
実行する手順
レプリケーション モニターを使用して、レプリケーションでエラーが発生した時点 (どのエージェントか) を特定します。
- パブリッシャーからディストリビューターまでセクションでエラーが発生している場合は、ログ リーダー エージェントに関する問題です。
- ディストリビューターからサブスクライバーまでセクションでエラーが発生している場合は、ディストリビューション エージェントに関する問題です。
ジョブの利用状況モニターでそのエージェントのジョブ履歴を調べて、エラーの詳細を明らかにします。 ジョブ履歴に十分な詳細が表示されない場合は、その特定のエージェントで 詳細ログを有効にすることができます 。
エラーの解決方法の決定を試みます。
スナップショット エージェントでエラーを見つける
スナップショット エージェントは、スナップショットを生成し、それを指定されたスナップショット フォルダーに書き込みます。
スナップショット エージェントの状態を表示します。
オブジェクト エクスプローラーで、[レプリケーション] の下の [ローカル パブリケーション] ノードを展開します。
AdvWorksProductTrans パブリケーションを右クリックして、> をクリックします。
スナップショット エージェントの状態でエラーが報告された場合は、スナップショット エージェントのジョブ履歴で詳細を確認することができます。
オブジェクト エクスプローラーで [SQL Server エージェント] を展開し、[ジョブの利用状況モニター] を開きます。
[カテゴリ] で並べ替えて、カテゴリ REPL-Snapshot でスナップショット エージェントを識別します。
そのスナップショット エージェントを右クリックして、[履歴の表示] を選択します。
スナップショット エージェントの履歴で、関連するログ エントリを選択します。 これは、通常、エラーが報告されているエントリの 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'.'.
このエラーは通常、パブリッシャー データベースの所有者が正しく設定されていない場合に発生します。 これは、データベースが復元されるときに発生することがあります。 これを確認するには、次のようにします。
オブジェクト エクスプローラーで [データベース] を展開します。
[AdventureWorks2022] を右クリックして、> をクリックします。
[ファイル] ページの下に所有者が存在することを確認します。 このボックスが空白の場合は、これが問題の原因と考えられます。
[ファイル] ページで所有者が空白の場合は、 データベースのコンテキスト内の
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'
ログ リーダー エージェントの再起動が必要な場合があります。
オブジェクト エクスプローラーで [SQL Server エージェント] ノードを展開し、ジョブの利用状況モニターを開きます。
[カテゴリ] で並べ替え、REPL-LogReader カテゴリによってログ リーダー エージェントを識別します。
ログ リーダー エージェント ジョブを右クリックし、[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.
このエラーは、ディストリビューション エージェントが再試行していることを示します。 詳細情報を探すには、ディストリビューション エージェントのジョブ履歴を確認します。
オブジェクト エクスプローラーで [SQL Server エージェント] を展開し、> を開きます。
[カテゴリ] でジョブを並べ替えます。
カテゴリ 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.)
このエラーは、ディストリビューション エージェントで使用されたパスワードが正しくないことを示しています。 これを解決するには次のようにします。
オブジェクト エクスプローラーで [レプリケーション] のノードを展開します。
サブスクリプションを右クリックして、> をクリックします。
[エージェント プロセス アカウント] の横にある省略記号 [...] を選択して、パスワードを変更します。
オブジェクト エクスプローラーで [レプリケーション] を右クリックして、レプリケーション モニターをもう一度確認します。 [すべてのサブスクリプション] の下の赤い 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 エラー ログを開きます。
このエラーが表示される場合は、ログインがサブスクライバー上にありません。 このエラーを解決するには、「 レプリケーションのセキュリティ ロールの要件」を参照してください。
ログイン エラーが解決された後、もう一度レプリケーション モニターを確認してください。 すべての問題が解決されると、[パブリケーション名] の横に緑色の矢印が表示され、[すべてのサブスクリプション] の下の状態が [実行中] になります。
サブスクリプションを右クリックして [ディストリビューターからサブスクライバーまで] 履歴をもう一度開き、成功したことを確認します。 ディストリビューション エージェントを初めて実行する場合は、スナップショットがサブスクライバーに一括コピーされていることがわかります。
マージ エージェントでエラーを見つける
マージ エージェントは、変更のレプリケートに長い時間がかかる場合があります。 マージ レプリケーション同期プロセスのどのステップに最も時間がかかるかを判断するには、 トレース フラグ 101 とマージ エージェントのログ記録を使用します。 これを行うには、マージ エージェント パラメーターとして次のパラメーターを使用して、エージェントを再起動します:
-T 101
-output
-outputverboselevel
注
<distribution-server>..msmerge_history
テーブルに統計を書き込む必要がある場合は、トレース フラグ 102 を使用します。
マージ レプリケーションの同期が完了した後のマージ エージェントの出力例を次に示します。
**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS) 2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2': DBCC SQLPERF (NETSTATS) 2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2': DBCC SQLPERF (NETSTATS) NETWORK STATISTICS Server Reads Writes Bytes Read Bytes Written Publisher 74 74 19112 37526 Subscriber 73 73 19032 36931 Distributor 75 75 19192 38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming Outgoing Publisher Unreachable Unreachable Subscriber Unreachable Unreachable Distributor Unreachable Unreachable
**************************************************************
エージェントで詳細ログを有効にする
詳細ログを使用して、レプリケーション トポロジ内のエージェントで発生したエラーに関する詳細な情報を見ることができます。 手順はどのエージェントでも同じです。 ジョブの利用状況モニターで正しいエージェントを選択していることだけを確認してください。
注
プル サブスクリプションかプッシュ サブスクリプションかに応じて、エージェントはパブリッシャーかサブスクライバーのどちらにある可能性もあります。 調査中のサーバーでエージェントを使用できない場合は、もう一方のサーバーをチェックします。
詳細ログを保存するかどうかを決めて、フォルダーが存在することを確認します。 この例では c:\temp を使います。
オブジェクト エクスプローラーで [SQL Server エージェント] ノードを展開し、ジョブの利用状況モニターを開きます。
[カテゴリ] で並べ替えて、関心のあるエージェントを見つけます。 この例では、ログ リーダー エージェントを使います。 関心のあるエージェントを右クリックして、> をクリックします。
[ステップ] ページを選択し、[エージェントを実行します] ステップを強調表示にします。 編集を選択します。
[コマンド] ボックスで新しい行を開始し、次のテキストを入力して、[OK] を選択します。
-Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
必要に応じて、場所と詳細レベルを変更できます。
詳細出力パラメーターを追加すると、次の問題が発生してエージェントが失敗したり、アウトファイル ファイルが見つからない可能性があります。
書式設定に問題があり、ダッシュがハイフンになっています。
ディスク上に場所が存在しません。または、エージェントを実行しているアカウントに、指定した場所に書き込むアクセス許可がありません。
最後のパラメーターと
-Output
パラメーターの間にスペースがありません。エージェントにより、サポートされる詳細さのレベルが異なります。 詳細ログを有効にしてもエージェントが起動しない場合は、指定した詳細レベルを 1 つ下げて再試行してください。
エージェントを右クリックして > (ステップでジョブを停止) を選択し、ログ リーダー エージェントを再起動します。 ツール バーの [更新] アイコンを選択して更新します。 エージェントを右クリックして、> (ステップでジョブを開始) を選択します。
ディスクで出力を確認します。
詳細ログを無効にするには、前と同じ手順に従い、前に追加した
-Output
行全体を削除します。
関連するコンテンツ
ヘルプの参照
- SQL に対するご意見:SQL Serverの改善に関するご提案がある場合
- Microsoft Q & A (SQL Server)
- DBA Stack Exchange (tag sql-server):SQL Server に関する質問
- スタック オーバーフロー (tag sql-server):SQL 開発に関する質問とその回答
- MicrosoftSQL Serverライセンス条項および情報
- 法人のお客様向けサポート オプション
- その他の SQL Serverのヘルプとフィードバック
SQL ドキュメントへの投稿
SQL コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。
詳細については、 Microsoft Learn ドキュメントの編集を参照してください。