トラブルシューティング ツール:トラブルシューティング ツール: SQL Server トランザクション レプリケーション エラーを検出するTroubleshooter: Find errors with SQL Server transactional replication

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance

トランザクション レプリケーションがどのように動作するのかを基本的に理解していないと、レプリケーション エラーのトラブルシューティングはフラストレーションを感じることがあります。Troubleshooting replication errors can be frustrating without a basic understanding of how transactional replication works. パブリケーション作成の最初のステップは、スナップショット エージェントでスナップショットを作成し、スナップショット フォルダーにそれを保存することです。The first step in creating a publication is having the Snapshot Agent create the snapshot and save it to the snapshot folder. 次に、ディストリビューション エージェントがサブスクライバーにスナップショットを適用します。Next, the Distribution Agent applies the snapshot to the subscriber.

このプロセスでは、パブリケーションが作成されて、"同期" 状態にされます。This process creates the publication and puts it in the synchronizing state. 同期は次の 3 つのフェーズで動作します。Synchronization works in three phases:

  1. レプリケートされるオブジェクトでトランザクションが発生し、トランザクション ログで "レプリケーション用" とマークされます。Transactions occur on objects that are replicated, and are marked "for replication" in the transaction log.
  2. ログ リーダー エージェントがトランザクション ログをスキャンし、"レプリケーション用" とマークされたトランザクションを探します。The Log Reader Agent scans through the transaction log and looks for transactions that are marked "for replication." これらのトランザクションはディストリビューション データベースに保存されます。These transactions are then saved to the distribution database.
  3. ディストリビューション エージェントは、リーダー スレッドを使用してディストリビューション データベースをスキャンします。The Distribution Agent scans through the distribution database by using the reader thread. 次に、ライター スレッドを使用することにより、このエージェントはサブスクライバーに接続して、変更をサブスクライバーに適用します。Then, by using the writer thread, this agent connects to the subscriber to apply those changes to the subscriber.

このプロセスのどのステップにおいてもエラーが発生する可能性があります。Errors can occur in any step of this process. これらのエラーを見つけることは、同期に関する問題のトラブルシューティングの最も困難な側面です。Finding those errors can be the most challenging aspect of troubleshooting synchronization issues. レプリケーション モニターを使うとこのプロセスが簡単になります。Thankfully, the use of Replication Monitor makes this process easy.

注意

  • このトラブルシューティング ガイドの目的は、トラブルシューティングの手法を説明することです。The purpose of this troubleshooting guide is to teach troubleshooting methodology. 特定のエラーを解決することではなく、レプリケーションでのエラーの発見に関する一般的なガイダンスを提供することを目的として作成されています。It's designed not to solve your specific error, but to provide general guidance in finding errors with replication. 具体的な例がいくつか示されていますが、それらの解決方法は環境によって異なる場合があります。Some specific examples are provided, but the resolution to them can vary depending on the environment.
  • このガイドで例として提供されているエラーは、トランザクション レプリケーションの構成に関するチュートリアルが基になっています。The errors that this guide provides as examples are based on the Configuring transactional replication tutorial.

トラブルシューティングの手法Troubleshooting methodology

質問することQuestions to ask

  1. 同期プロセスのどこでレプリケーションが失敗するか。Where in the synchronization process is replication failing?
  2. どのエージェントでエラーが発生するか。Which agent is experiencing an error?
  3. レプリケーションが最後に正常に動作したのはいつか。When was the last time replication worked successfully? その後で何か変更したか。Has anything changed since then?

実施手順Steps to take

  1. レプリケーション モニターを使用して、レプリケーションでエラーが発生した箇所 (どのエージェント) をあきらかにします。Use Replication Monitor to identify at which point replication is encountering the error (which agent?):
    • パブリッシャーからディストリビューターまで セクションでエラーが発生している場合は、ログ リーダー エージェントに関する問題です。If errors are occurring in the Publisher to Distributor section, the issue is with the Log Reader Agent.
    • ディストリビューターからサブスクライバーまで セクションでエラーが発生している場合は、ディストリビューション エージェントに関する問題です。If errors are occurring in the Distributor to Subscriber section, the issue is with the Distribution Agent.
  2. ジョブの利用状況モニターでそのエージェントのジョブ履歴を調べて、エラーの詳細を明らかにします。Look through that agent's job history in Job Activity Monitor to identify details of the error. ジョブ履歴では十分な詳細がわからない場合は、その特定のエージェントで詳細ログを有効にすることができます。If the job history is not showing enough details, you can enable verbose logging on that specific agent.
  3. エラーの解決方法の決定を試みます。Try to determine a solution for the error.

スナップショット エージェントでエラーを見つけるFind errors with the Snapshot Agent

スナップショット エージェントは、スナップショットを生成し、それを指定されたスナップショット フォルダーに書き込みます。The Snapshot Agent generates the snapshot and writes it to the specified snapshot folder.

  1. スナップショット エージェントの状態を表示します。View the status of your Snapshot Agent:

    a.a. オブジェクト エクスプローラーで、 [レプリケーション] の下の [ローカル パブリケーション] ノードを展開します。In Object Explorer, expand the Local Publication node under Replication.

    b.b. AdvWorksProductTrans パブリケーションを右クリックして、 [スナップショット エージェントの状態の表示] をクリックします。Right-click your publication AdvWorksProductTrans > View Snapshot Agent Status.

    ショートカット メニューの [スナップショット エージェントの状態の表示] コマンド

  2. スナップショット エージェントの状態でエラーが報告された場合は、スナップショット エージェントのジョブ履歴で詳細を確認することができます。If an error is reported in the Snapshot Agent status, you can find more details in the Snapshot Agent job history:

    a.a. オブジェクト エクスプローラーで [SQL Server エージェント] を展開し、[ジョブの利用状況モニター] を開きます。Expand SQL Server Agent in Object Explorer and open Job Activity Monitor.

    b.b. [カテゴリ] で並べ替えて、カテゴリ REPL-Snapshot でスナップショット エージェントを識別します。Sort by Category and identify the Snapshot Agent by the category REPL-Snapshot.

    c.c. そのスナップショット エージェントを右クリックして、 [履歴の表示] を選択します。Right-click the Snapshot Agent and then select View History.

    スナップショット エージェントの履歴を開くための選択

  3. スナップショット エージェントの履歴で、関連するログ エントリを選択します。In the Snapshot Agent history, select the relevant log entry. これは、通常、エラーが報告されているエントリの 1 または 2 行 "" にあります。This is usually a line or two before the entry that's reporting the error. (赤い x 印がエラーを示します。)ログの下のボックスでメッセージ テキストを確認します。(A red X indicates errors.) Review the message text in the box below the logs:

    アクセス拒否のスナップショット エージェント エラー

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

スナップショット フォルダーに Windows のアクセス許可が正しく構成されていない場合は、スナップショット エージェントに "アクセスが拒否されました" エラーが表示されます。If your Windows permissions are not configured correctly for your snapshot folder, you'll see an "access is denied" error for the Snapshot Agent. スナップショットが格納されているフォルダーへのアクセス許可を確認し、スナップショット エージェントの実行に使用しているアカウントに共有にアクセスするためのアクセス許可があることを確認する必要があります。You'll need to verify permissions to the folder where your snapshot is stored, and make sure that the account used to run the Snapshot Agent has permissions to access the share.

ログ リーダー エージェントでエラーを見つけるFind errors with the Log Reader Agent

ログ リーダー エージェントは、パブリッシャー データベースに接続して、"レプリケーション用" とマークされているすべてのトランザクションのトランザクション ログをスキャンします。The Log Reader Agent connects to your publisher database and scans the transaction log for any transactions that are marked "for replication." そして、それらのトランザクションをディストリビューション データベースに追加します。It then adds those transactions to the distribution database.

  1. SQL Server Management StudioSQL Server Management Studio でパブリッシャーに接続します。Connect to the publisher in SQL Server Management StudioSQL Server Management Studio. サーバー ノードを展開して [レプリケーション] フォルダーを右クリックし、 [レプリケーション モニターの起動] を選択します。Expand the server node, right-click the Replication folder, and then select Launch Replication Monitor:

    ショートカット メニューの [レプリケーション モニターの起動] コマンド

    レプリケーション モニターが開きます。レプリケーション モニターReplication Monitor opens: Replication Monitor

  2. 赤い X 印は、パブリケーションが同期していないことを示します。The red X indicates that the publication is not synchronizing. 左側で [マイ パブリッシャー] を展開し、関連するパブリッシャー サーバーを展開します。Expand My Publishers on the left side, and then expand the relevant publisher server.

  3. 左側で AdvWorksProductTrans パブリケーションを選択し、いずれかのタブで赤い X 印を探して、どこに問題があるかを特定します。Select the AdvWorksProductTrans publication on the left, and then look for the red X on one of the tabs to identify where the issue is. この場合、赤い X 印は [エージェント] タブにあるので、エージェントの 1 つでエラーが発生しています。In this case, the red X is on the Agents tab, so one of the agents is encountering an error:

    [エージェント] タブの赤い X 印

  4. [エージェント] タブを選択し、どのエージェントでエラーが発生しているかを特定します。Select the Agents tab to identify which agent is encountering the error:

    失敗しているログ リーダー エージェントの赤い X 印

  5. この表示では、スナップショット エージェントとログ リーダー エージェントの 2 つのエージェントが示されています。This view shows you two agents, the Snapshot Agent and the Log Reader Agent. エラーが発生しているものに赤い X 印が付いています。この例ではログ リーダー エージェントです。The one that's encountering an error has the red X. In this case, it's the Log Reader Agent.

    エラーが報告されている行をダブルクリックして、ログ リーダー エージェントのエージェント履歴を開きます。Double-click the line that's reporting the error to open the agent history for the Log Reader Agent. この履歴では、エラーに関する詳細情報が提供されます。This history provides more information about the error:

    ログ リーダー エージェントのエラーの詳細

    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'.'.        
    
  6. エラーは、通常、パブリッシャー データベースの所有者が正しく設定されていないときに発生します。The error typically occurs when the owner of the publisher database is not set correctly. これは、データベースが復元されるときに発生することがあります。This can happen when a database is restored. これを確認するには、次のようにします。To verify this:

    a.a. オブジェクト エクスプローラーで [データベース] を展開します。Expand Databases in Object Explorer.

    b.b. AdventureWorks2012 を右クリックして、 [プロパティ] をクリックします。Right-click AdventureWorks2012 > Properties.

    c.c. [ファイル] ページの下に所有者が存在することを確認します。Verify that an owner exists under the Files page. このボックスが空白の場合は、これが問題の原因と考えられます。If this box is blank, this is the likely cause of your issue.

    データベースのプロパティの [ファイル] ページで [所有者] ボックスが空白になっている

  7. [ファイル] ページで所有者が空白の場合は、AdventureWorks2012 データベースのコンテキストで [新しいクエリ] ウィンドウを開きます。If the owner is blank on the Files page, open a New Query window within the context of the AdventureWorks2012 database. 次の T-SQL コードを実行します。Run the following T-SQL code:

    -- 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' 
    
  8. ログ リーダー エージェントの再起動が必要な場合があります。You might need to restart the Log Reader Agent:

    a.a. オブジェクト エクスプローラーで [SQL Server エージェント] ノードを展開し、ジョブの利用状況モニターを開きます。Expand the SQL Server Agent node in Object Explorer and open Job Activity Monitor.

    b.b. [カテゴリ] で並べ替え、REPL-LogReader カテゴリによってログ リーダー エージェントを識別します。Sort by Category and identify the Log Reader Agent by the REPL-LogReader category.

    c.c. ログ リーダー エージェント ジョブを右クリックし、 [Start Job at Step](ステップでジョブを開始) を選択します。Right-click the Log Reader Agent job and select Start Job at Step.

    ログ リーダー エージェントを再起動するための選択

  9. レプリケーション モニターをもう一度開いて、パブリケーションが現在同期されていることを確認します。Validate that your publication is now synchronizing by opening Replication Monitor again. まだ開いていない場合は、オブジェクト エクスプローラーで [レプリケーション] を右クリックして見つけることができます。If it's not already open, you can find it by right-clicking Replication in Object Explorer.

  10. AdvWorksProductTrans パブリケーション、 [エージェント] タブの順に選択し、ログ リーダー エージェントをダブルクリックして、エージェントの履歴を開きます。Select the AdvWorksProductTrans publication, select the Agents tab, and double-click the Log Reader Agent to open the agent history. これで、ログ リーダー エージェントが実行中で、コマンドをレプリケートしているか、"レプリケートされたトランザクションが存在しない" のいずれかが示されるはずです。You should now see that the Log Reader Agent is running and either is replicating commands or has "no replicated transactions":

    レプリケートされたトランザクションがなくて実行しているログ リーダー エージェント

ディストリビューション エージェントでエラーを見つけるFind errors with the Distribution Agent

ディストリビューション エージェントは、ディストリビューション データベースでデータを見つけて、それをサブスクライバーに適用します。The Distribution Agent finds data in the distribution database and then applies it to the subscriber.

  1. SQL Server Management StudioSQL Server Management Studio でパブリッシャーに接続します。Connect to the publisher in SQL Server Management StudioSQL Server Management Studio. サーバー ノードを展開して [レプリケーション] フォルダーを右クリックし、 [レプリケーション モニターの起動] を選択します。Expand the server node, right-click the Replication folder, and then select Launch Replication Monitor.

  2. [レプリケーション モニター] で、 [AdvWorksProductTrans] パブリケーションを選択し、 [すべてのサブスクリプション] タブを選択します。サブスクリプションを右クリックし、 [詳細表示] を選択します。In Replication Monitor, select the AdvWorksProductTrans publication, and select the All Subscriptions tab. Right-click the subscription and select View Details:

    ショートカット メニューの [詳細表示] コマンド

  3. [ディストリビューターからサブスクライバーまで] 履歴ダイアログ ボックスが開き、エージェントで発生しているエラーの内容を明確にします。The Distributor to Subscriber History dialog box opens and clarifies what error the agent is encountering:

    ディストリビューション エージェントのエラーの詳細

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2012-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. このエラーは、ディストリビューション エージェントが再試行していることを示します。The error indicates that the Distribution Agent is retrying. 詳細情報を探すには、ディストリビューション エージェントのジョブ履歴を確認します。To find more information, check the job history for the Distribution Agent:

    a.a. オブジェクト エクスプローラーで [SQL Server エージェント] を展開し、 [ジョブの利用状況モニター] を開きます。Expand SQL Server Agent in Object Explorer > Job Activity Monitor.

    b.b. [カテゴリ] でジョブを並べ替えます。Sort the jobs by Category.

    c.c. カテゴリ REPL-Distribution でディストリビューション エージェントを識別します。Identify the Distribution Agent by the category REPL-Distribution. エージェントを右クリックして、 [履歴の表示] を選択します。Right-click the agent and select View History.

    ディストリビューション エージェントの履歴表示の選択

  5. いずれかのエラー エントリを選択し、ウィンドウの下部にエラー テキストを表示します。Select one of the error entries and view the error text at the bottom of the window:

    ディストリビューション エージェントのパスワードが間違っていることを示すエラー テキスト

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. このエラーは、ディストリビューション エージェントで使用されたパスワードが正しくないことを示しています。This error indicates that the password that the Distribution Agent used is incorrect. これを解決するには次のようにします。To resolve it:

    a.a. オブジェクト エクスプローラーで [レプリケーション] のノードを展開します。Expand the Replication node in Object Explorer.

    b.b. サブスクリプションを右クリックして、 [プロパティ] をクリックします。Right-click the subscription > Properties.

    c.c. [エージェント プロセス アカウント] の横にある省略記号 [...] を選択して、パスワードを変更します。Select the ellipsis (...) next to Agent Process Account and modify the password.

    ディストリビューション エージェントのパスワードを変更するための選択

  7. オブジェクト エクスプローラーで [レプリケーション] を右クリックして、レプリケーション モニターをもう一度確認します。Check Replication Monitor again, by right-clicking Replication in Object Explorer. [すべてのサブスクリプション] の下の赤い X 印は、ディストリビューション エージェントでまだエラーが発生していることを示します。A red X under All Subscriptions indicates that the Distribution Agent is still encountering an error.

    [レプリケーション モニター] でサブスクリプションを右クリックして [詳細表示] を選択し、 [ディストリビューターからサブスクライバーまで] の履歴を開きます。Open the Distribution to Subscriber history by right-clicking the subscription in Replication Monitor > View Details. ここでは、異なるエラーが表示されるようになります。Here, the error is now different:

    ディストリビューション エージェントが接続できないことを示すエラー

    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'.
    
  8. このエラーは、ユーザー NODE2\repl_distribution のログインが失敗したため、ディストリビューション エージェントがサブスクライバーに接続できなかったことを示しています。This error indicates that the Distribution Agent could not connect to the subscriber, because the login failed for user NODE2\repl_distribution. さらに詳しく調べるには、サブスクライバーに接続して、オブジェクト エクスプローラーで [管理] ノードの下の 現在の SQL Server エラー ログを開きます。To investigate further, connect to the subscriber and open the current SQL Server error log under the Management node in Object Explorer:

    サブスクライバーのログイン失敗を示すエラー

    このエラーが表示される場合は、ログインがサブスクライバー上にありません。If you're seeing this error, the login is missing on the subscriber. このエラーを解決するには、レプリケーションのためのアクセス許可に関するページをご覧ください。To resolve this error, see Permissions for replication.

  9. ログイン エラーが解決された後、もう一度レプリケーション モニターを確認してください。After the login error is resolved, check Replication Monitor again. すべての問題が解決されると、 [パブリケーション名] の横に緑色の矢印が表示され、 [すべてのサブスクリプション] の下の状態が [実行中] になります。If all issues have been addressed, you should see a green arrow next to Publication Name and a status of Running under All Subscriptions.

    サブスクリプションを右クリックして [ディストリビューターからサブスクライバーまで] 履歴をもう一度開き、成功したことを確認します。Right-click the subscription to open the Distributor To Subscriber history once more to verify success. ディストリビューション エージェントを初めて実行する場合は、スナップショットがサブスクライバーに一括コピーされます。If this is the first time you're running the Distribution Agent, you'll see that the snapshot has been bulk copied to the subscriber:

    [実行] 状態と一括コピーに関するメッセージが表示されているディストリビューション エージェント

エージェントで詳細ログを有効にするEnable verbose logging on any agent

詳細ログを使用して、レプリケーション トポロジ内のエージェントで発生したエラーに関する詳細な情報を見ることができます。You can use verbose logging to see more detailed information about errors occurring with any agent in the replication topology. 手順はどのエージェントでも同じです。The steps are the same for each agent. ジョブの利用状況モニターで正しいエージェントを選択していることだけを確認してください。Just make sure that you're selecting the correct agent in Job Activity Monitor.

注意

プル サブスクリプションかプッシュ サブスクリプションかに応じて、エージェントはパブリッシャーまたはサブスクライバーのどちらにあってもかまいません。The agents can be on either the publisher or the subscriber, depending on whether it's a pull or push subscription. 見ているサーバー上に探しているエージェントが見つからない場合は、他のサーバーを確認してください。If you can't find the agent you're looking for on the server you're looking at, try checking the other server.

  1. 詳細ログを保存するかどうかを決めて、フォルダーが存在することを確認します。Decide where you want the verbose logging to be saved, and ensure that the folder exists. この例では c:\temp を使います。This example uses c:\temp.

  2. オブジェクト エクスプローラーで [SQL Server エージェント] ノードを展開し、ジョブの利用状況モニターを開きます。Expand the SQL Server Agent node in Object Explorer and open Job Activity Monitor.

    ジョブの利用状況モニターのショートカット メニューの [ジョブの利用状況の表示] コマンド

  3. [カテゴリ] で並べ替えて、関心のあるエージェントを見つけます。Sort by Category and identify the agent of interest. この例では、ログ リーダー エージェントを使います。This example uses the Log Reader Agent. 関心のあるエージェントを右クリックして、 [プロパティ] をクリックします。Right-click the agent of interest > Properties.

    エージェントのプロパティを開くための選択

  4. [ステップ] ページを選択し、 [エージェントを実行します] ステップを強調表示にします。Select the Steps page, and then highlight the Run agent step. [編集] を選択します。Select Edit.

    [エージェントを実行します] ステップを編集するための選択

  5. [コマンド] ボックスで新しい行を開始し、次のテキストを入力して、 [OK] を選択します。In the Command box, start a new line, enter the following text, and select OK:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    必要に応じて、場所と詳細レベルを変更できます。You can modify the location and verbosity level according to your preference.

    ジョブ ステップのプロパティの詳細出力

    注意

    詳細出力パラメーターを追加するとき、次のような問題があると、エージェントが失敗したり、出力ファイルが作成されない可能性があります。These things might cause your agent to fail, or the output file to be missing, when you're adding the verbose output parameter:

    • 書式設定に問題があり、ダッシュがハイフンになっています。There's a formatting issue where the dash became a hyphen.
    • ディスク上に場所が存在しません。または、エージェントを実行しているアカウントに、指定した場所に書き込むアクセス許可がありません。The location doesn't exist on disk, or the account that's running the agent lacks permission to write to the specified location.
    • 最後のパラメーターと -Output パラメーターの間にスペースがありません。There's a space missing between the last parameter and the -Output parameter.
    • エージェントにより、サポートされる詳細さのレベルが異なります。Different agents support different levels of verbosity. 詳細ログを有効にしてもエージェントが起動しない場合は、指定した詳細レベルを 1 つ下げて再試行してください。If you enable verbose logging but your agent fails to start, try decreasing the specified verbosity level by 1.
  6. エージェントを右クリックして [Stop Job at Step](ステップでジョブを停止) を選択し、ログ リーダー エージェントを再起動します。Restart the Log Reader Agent by right-clicking the agent > Stop Job at Step. ツール バーの [更新] アイコンを選択して更新します。Refresh by selecting the Refresh icon from the toolbar. エージェントを右クリックして、 [Start Job at Step](ステップでジョブを開始) を選択します。Right-click the agent > Start Job at Step.

  7. ディスクで出力を確認します。Review the output on disk.

    出力テキスト ファイル

  8. 詳細ログを無効にするには、前と同じ手順に従い、前に追加した -Output 行全体を削除します。To disable verbose logging, follow the same previous steps to remove the entire -Output line that you added earlier.

詳細については、レプリケーション エージェントの詳細ログを有効にする方法に関するページをご覧ください。For more information, see Enabling verbose logging for replication agents.

関連項目See also


トランザクション レプリケーションの概要Transactional replication overview
レプリケーションのチュートリアルReplication tutorials
ReplTalk ブログReplTalk blog

ヘルプの参照