sql >> データベース >  >> RDS >> Sqlserver

SQLServerレプリケーションのトラブルシューティング

    前回の記事「SQLServerレプリケーションのセットアップと構成」では、SQL Serverレプリケーションの概念、そのコンポーネント、タイプ、およびSQLトランザクションレプリケーションの構成方法について段階的に詳しく説明しました。この記事を読む前に、前の記事を読み、レプリケーションの概念とそのコンポーネントを理解することを強くお勧めします。この記事では、既存のSQLServerレプリケーションサイトのトラブルシューティング方法を説明します。

    トラブルシューティングの概要

    SQL Serverレプリケーションの主な目標は、パブリッシャーとサブスクライバーのデータの同期を維持することです。幸せなシナリオでは、トランザクションがパブリケーションデータベースで実行およびコミットされると、そのトランザクションはディストリビューションデータベースにコピーされ、同期されて、そのパブリッシャーに接続されているすべてのサブスクライバーに適用されます。このプロセスのいずれかのステップで問題が発生した場合、パブリッシャーの変更はサブスクライバー側では利用できません。この場合、最初から再度同期する必要がある期限切れのSQLレプリケーションサイトが発生する前に、この問題のトラブルシューティングと修正をできるだけ早く行う必要があります。そうしないと、トランザクションログファイルを含むデータベースの空き領域が不足し、すべてのデータベーストランザクションが一時停止します。 。

    レプリケーションの同期が失敗しているステップを特定し、問題の修正につながるエラーメッセージを割り当てることは、SQLServerレプリケーションのトラブルシューティングプロセスの最も難しい部分です。また、最後の同期時刻と、その時刻以降に実行された、この障害の原因となる可能性のある変更を確認することも、レプリケーション同期の失敗のトラブルシューティングに役立ちます。

    SQL Serverレプリケーションエージェントの役割を理解すると、同期が失敗するステップを特定するのに役立ちます。ほとんどのSQLServerレプリケーションタイプに共通する3つのレプリケーションエージェントがあることを思い出してください。 スナップショットエージェント 初期同期スナップショットの作成を担当します。 ログリーダーエージェント は、データベーストランザクションログファイルから変更を読み取り、それをディストリビューションデータベースにコピーし、最後にディストリビューションにコピーする責任があります。 サブスクライバーへの変更の同期を担当するエージェント。

    この記事では、レプリケーションモニターを利用します。 およびジョブアクティビティモニター SQL Serverレプリケーションのステータスを監視し、同期エラーエラーに関する情報を取得する際のウィンドウ。

    シナリオのトラブルシューティング

    SQL Serverレプリケーションの問題のトラブルシューティング方法を理解するための最良かつ直接的な方法は、実用的なシナリオを提供し、この特定の問題を修正する方法を示すことです。シナリオを1つずつ説明していきましょう。

    SQLServerエージェントサービスの問題

    SQL Serverエージェントサービスは、SQLServerレプリケーションの同期プロセスで重要な役割を果たします。これは、各レプリケーションエージェントがSQLエージェントジョブの下で実行されるためです。

    プロアクティブなデータベース管理者であるため、SQLレプリケーションサイトのステータスを毎日確認する必要があります。レプリケーションサイトのステータスを確認するには、[レプリケーション]-> [ローカルパブリケーション]ノードで[パブリケーション]を右クリックし、[レプリケーションモニターの起動]を選択します。 以下に示すように、オプション:

    [レプリケーションモニター]ウィンドウから、次のようなエラーメッセージが表示されることなく、レプリケーションが間もなく期限切れになるか、すでに期限切れになっていることを示す警告メッセージが表示されます。

    [レプリケーションモニター]ウィンドウに、レプリケーションサイトが間もなく期限切れになる理由に関する有用な情報が表示されない場合、次のステップはジョブアクティビティモニターを確認することです。 SQLServerエージェントノードの下。 SQL Serverエージェントノードにアクセスすると、SQL Serverエージェントサービスが実行されていないことが直接わかります(横にある赤い円から)。 SQL Serverエージェントサービスが実行されていない場合、これは、レプリケーションエージェントジョブを含め、そのインスタンスで作成されたすべてのジョブが機能していないことを意味します。その結果、レプリケーションサイト全体が機能していません。

    この問題を修正するには、以下に示すように、SQL ServerManagementStudioから直接またはSQLServerConfiguration Manager(推奨)を使用してSQLServerエージェントサービスを開始する必要があります。

    SQL Serverエージェントサービスを開始した後、レプリケーションモニターを再度チェックし、サブスクライバーのステータスが実行中であることを確認します。 保留中のすべてのトランザクションは、サブスクライバーと正常に同期されます。レコードがパブリッシャーからディストリビューターセクションにコピーされていることを確認することで、これらの手順を1つずつ確認できます。

    次に、以下のように、ディストリビューターからサブスクライバーに正常に同期されます。

    最後に、以下に示すように、最後のタブから未分散のトランザクションがないことを確認します。

    その後、レプリケーションエージェントジョブが問題なく稼働していることを確認する必要があります。 SQL Agentジョブは、SSMSObjectExplorerでSQLServerAgentノードを展開し、ジョブアクティビティモニターを表示して、SnapshotAgentが以下に示すように、スナップショットの作成プロセス:

    また、レプリケーションエージェントジョブの履歴を確認し、そのジョブを右クリックして履歴の表示を選択することにより、以前の失敗の理由を確認することもできます。 以下のオプション:

    以下のように、将来この問題を克服するのに役立つエラーメッセージが表示される場合があります。

    以前の問題を解決するには、SQL Serverエージェントサービスの起動モードを手動から自動に変更する必要があります。これにより、ホスティングサーバーの再起動時にサービスが自動的に開始されるようになります。

    スナップショットエージェントのアクセス許可の問題

    SQL Serverのレプリケーションステータスを確認しているときに、レプリケーションモニターを使用して、赤い円の内側のX記号からレプリケーションの失敗に気付いたとします。また、レプリケーションモニターは、障害がレプリケーションエージェントの1つ、[エージェント]タブの上部にある赤い円の内側のX記号に起因することを示しています。

    そのレプリケーションの失敗を特定するには、[エージェント]タブを参照し、失敗しているエージェントを確認する必要があります。 [エージェント]ページから、スナップショットエージェントが失敗していることがわかります。スナップショットエージェントをダブルクリックして、以下のエラーメッセージを確認します。

    レプリケーションエージェントは10分以内に進行状況メッセージをログに記録していません。これは、応答しないエージェントまたは高いシステムアクティビティを示している可能性があります。レコードが宛先に複製されていること、およびサブスクライバー、パブリッシャー、およびディストリビューターへの接続がまだアクティブであることを確認します。

    残念ながら、このエラーメッセージは一般的なものであり、次のように理由を指定せずにスナップショットエージェントが機能していないことのみを示しています。

    次に、スナップショットエージェントジョブである別の場所で有用な情報を検索する必要があります。 [ジョブアクティビティモニター]ウィンドウの[SQLServerエージェント]ノードで、スナップショットエージェントジョブが失敗したことがわかります。そして、そのジョブ履歴から、プロキシ認証の問題が原因で最近失敗したことがわかります。つまり、以下に示すように、SnapshotAgentが実行されているアカウントの資格情報が正しくありません。

    スナップショットエージェントの資格情報の問題を修正するには、[レプリケーション]ノード-> [ローカルパブリケーション]でパブリケーションを右クリックし、[プロパティ]を選択します。 オプション。 [パブリケーションのプロパティ]ウィンドウから、エージェントのセキュリティを参照します ページを開き、スナップショットエージェントを実行するアカウントのクレデンシャルを再挿入します。

    スナップショットエージェントアカウントの資格情報を更新した後、[ジョブアクティビティモニター]ウィンドウからスナップショットエージェントジョブを再開し、以下のようにジョブが正常に機能していることを確認します。

    また、Snapshot Agentが正常に機能しているかどうか、および以下に示すように、レプリケーションモニターの下にエラーメッセージが表示されなくなったかどうかを確認します。

    スナップショットフォルダのアクセス許可の問題

    最初のスナップショットを使用してパブリッシャーとサブスクライバーを同期しようとしたとき、または新しいスナップショットを使用してスナップショットレプリケーションサイトを再同期しようとしたときに、スナップショットの作成プロセスが失敗し、以下のアクセスエラーメッセージが表示されたとします。

    このエラーメッセージは、スナップショットエージェントが実行されているアカウントに、エラーメッセージで指定されたスナップショットフォルダにアクセスする権限がないことを示しています。

    この問題を修正するには、以下に示すように、[パブリケーションのプロパティ]ウィンドウの[エージェントのセキュリティ]ページから、スナップショットエージェントが実行されているアカウントを確認する必要があります。

    次に、エラーメッセージで指定されたスナップショットフォルダーを参照し、このスナップショットアカウントにそのフォルダーに対する最小の読み取り/書き込み権限があることを確認してから、スナップショットエージェントを再度実行して、問題が修正され、同期スナップショットが正常に作成されることを確認します。以下:

    サブスクライバー許可の問題

    SQL Serverレプリケーションサイトのステータスを確認しているときに、レプリケーションモニターを使用して、以下に示すように、サブスクライバーに障害があることがわかったとします。

    エラーアイコンをクリックすると、ディストリビューターからサブスクライバーへのトランザクションを同期しようとしたときに障害が発生したことがわかります。また、エラーメッセージから、以下に示すように、アクセス許可の問題により、ディストリビューターがサブスクライバーSQLServerインスタンスに接続できないことは明らかです。

    この問題を修正するには、サブスクライバーインスタンスへの接続に使用される資格情報を確認して更新する必要があります。資格情報を確認するには、[レプリケーション]ノードの下の[サブスクリプション]->[ローカルパブリケーション]->[現在のパブリケーション名]を右クリックし、[プロパティ]オプションを選択します。 サブスクライバー接続から [サブスクライバーのプロパティ]ウィンドウの下のフィールドで、以下に示すように、サブスクライバーインスタンスへの接続に使用されるアカウントの資格情報を更新します。

    その後、レプリケーションモニターからレプリケーションステータスを再度確認すると、サブスクライバー接続の問題が利用できなくなり、以下に示すようにレプリケーションサイトが正常に実行されていることがわかります。

    サブスクライバーに連絡できません

    サブスクライバー側から直面する可能性のあるもう1つのSQLServerレプリケーションの失敗の問題は、ディストリビューターがサブスクライバーに接続できないことです。[サブスクライバーへのディストリビューター]ページの下に、「ネットワークが原因でサブスクライバーとの接続を開くことができない」と表示されます。以下の[レプリケーションモニター]ウィンドウに表示される、関連する…」接続エラー:

    このエラーメッセージは、ディストリビューターインスタンスとサブスクライバーインスタンスの間に接続の問題があることを示しています。この接続の問題を確認する最初の簡単な方法は、サブスクライバーSQLServerインスタンスがオンラインであることを確認することです。これは、サブスクライバー側のSQLServer構成マネージャーから確認できます。この状況では、サブスクライバー側のSQLServerサービスが停止していることがわかります。この問題を修正するには、SQL Serverサービスを開始し、レプリケーションモニターから、以下に示すように、レプリケーションサイトが再度同期されていることを確認します。より高度なSQL接続の問題については、接続MSのトラブルシューティングドキュメントを確認してください。

    サブスクライバーデータベースのアクセス許可の問題

    レプリケーションモニターを使用してSQLServerレプリケーションの同期ステータスを確認していて、ディストリビューターからサブスクライバーに変更をレプリケートしようとしているときにレプリケーションが失敗していることがわかった場合、サブスクライバーエラーをクリックすると、ディストリビューターはサブスクライバーに到達して接続できますが、以下に示すように、アクセス許可の問題がないため、サブスクリプションデータベースに接続できません。

    この問題を修正するには、サブスクライバーに接続し、サブスクライバーデータベースへの接続に使用されるアカウントが、以下に示すように、db_Ownerデータベースの固定ロールのメンバーであることを確認します。

    その後、レプリケーションモニターを再度チェックし、ディストリビューターがサブスクリプションデータベースにアクセスして、以下のように変更をレプリケートできることを確認します。

    データの違いの問題

    データベース開発チームの1つが、パブリッシャー(SQL1)のShiftsテーブルで実行された変更が、サブスクライバーインスタンス(SQL2)で実行される日次レポートに反映されていないと主張し、以下のスナップショットを提供したと仮定します。これは、変更が複製されていないことを示しています:

    レプリケーション同期の問題を確認する最初のステップは、レプリケーションモニターを開き、失敗しているステップを見つけることです。以下に示すように、レプリケーションモニターから、変更がディストリビューターからサブスクライバーにレプリケートされないため、ログリーダーエージェントが失敗していることがわかりますが、そのエージェントから明確なメッセージは返されません。

    レプリケーションモニターから意味のあるエラーメッセージが見つからないため、ジョブアクティビティモニターを使用してログリーダーエージェントジョブの履歴を確認します。これは、ログリーダーエージェントが実行されているアカウントの資格情報が正しくないことを示しています。 、以下に示すように:

    ログリーダーエージェントの資格情報の問題を修正するには、[パブリケーションのプロパティ]ウィンドウの[エージェントのセキュリティ]ページを参照し、以下のように、ログリーダーエージェントの資格情報を有効な資格情報で更新します。

    レプリケーションモニターを再度確認すると、以下に示すように、変更が正常にレプリケートされ、新しいシフトの変更でデータが更新されていることがわかります。

    サブスクライバーで行が見つかりません

    別の側面から問題を見てみましょう。たとえば、以下に示すように、シフトテーブルで実行された変更があるとします。

    ただし、この変更はサブスクライバーにレプリケートされず、SQLServerレプリケーションサイト全体に障害が発生します。レプリケーションモニターから、ディストリビューターからサブスクライバーへの変更を試みているときに失敗し、IDが3の特定のレコードを更新できないために失敗したことがわかります。このレコードは以下に示すように、サブスクライバデータベーステーブルでは使用できません:

    サブスクライバー側(SQL2)でそのレコードを確認すると、以下のように、レコードが使用できないことがわかります。

    この問題を解決するには、そのレコードをサブスクライバーデータベーステーブルに再度挿入し、ディストリビューターに再度更新を試みて、以下に示すように、レプリケーション同期の失敗の問題を修正する必要があります。

    SQL Serverには、データの不整合の問題が見つかった場合でもレプリケーションサイトが機能し続けるようにするオプションが用意されており、後でこの不整合の問題を手動で修正できます。これを行うには、レプリケーションモニターからサブスクライバーを右クリックし、エージェントプロファイルを選択します。 以下に示すように、オプション:

    表示されたウィンドウから、以下に示すように、ログリーダーエージェントプロファイルを更新し、データの不整合の問題が発生した場合にデータ変更の複製を続行できるようにすることができます。

    初期化されていないサブスクリプションの問題

    レプリケーションサイトが長期間監視されずに放置され、修正なしで3日以上障害が発生した場合、レプリケーションサイトは期限切れになり、サブスクリプションは初期化されていないものとしてマークされ、新しいスナップショットを使用して再初期化されるのを待ちます。以下に示すように、新しいサブスクリプションを初期化せずに作成するときにも、同じシナリオに直面する可能性があります。

    この問題を修正するには、[レプリケーション]ノードの[サブスクリプション]-> [ローカルパブリケーション]を右クリックして[パブリケーション]を展開し、[再初期化]オプションを選択してこのサブスクリプションを初期化のマークを付け、新しいサブスクリプションを受信できるようにして、そのサブスクリプションを再初期化する必要があります。以下に示すスナップショット:

    再初期化した後もサブスクリプションステータスが未初期化のままである場合は、[ジョブアクティビティモニター]ウィンドウを使用してスナップショットエージェントジョブを確認し、失敗する理由を確認します。以下に示すように、スナップショットエージェントのジョブ履歴から、そのエージェントジョブの所有者を決定する問題が原因でジョブが失敗したことがわかります。

    この問題を解決するには、Snapshot Agentジョブを開き、ジョブの所有者をSAまたは任意の有効な管理者ユーザーに変更すると、以下のようにジョブが正常に実行されます。

    これで、サブスクリプションのステータスが「実行中」に変わり、以下に示すように、最初のスナップショットが同期プロセスを開始するのを待っていることがわかります。

    新しいスナップショットを生成するには、[レプリケーション]ノード-> [ローカルパブリケーション]でパブリケーションを右クリックし、[スナップショットエージェントのステータスの表示]を選択します。 オプション。

    開いたウィンドウで、[スタート]ボタンをクリックして、スナップショットの作成プロセスを開始します。すべてのパブリッシャー記事を含むスナップショットが正常に作成されたら、レプリケーションモニターを再度開き、サブスクリプションのステータスを確認します。以下に示すように、スナップショットがサブスクライバーに適用され、パブリッシャーと同期されていることがわかります。

    >

    パブリッシャーデータベース所有者の問題

    また、SQL Serverレプリケーションサイトのステータスを確認するときに、レプリケーションモニターを使用して、レプリケーションサイトに障害が発生し、ログリーダーエージェントで障害が検出されたと想定します。そのエージェントから返されたエラーメッセージを確認すると、以下に示すように、Publicationデータベースの現在の所有者を判別する際に問題があることがわかります。

    この問題を修正するには、 SP_changedbowner を使用して、現在のパブリケーションデータベースの所有者を有効なデータベースユーザーに置き換えて更新する必要があります。 システムストアドプロシージャ、または単にデータベースのプロパティウィンドウから。その後、[ジョブアクティビティモニター]ウィンドウを使用してログリーダーエージェントジョブを再度実行し、次に示すように、レプリケーションモニターを使用して、エージェントの問題が利用できなくなったかどうかを検証します。

    結論

    この記事では、SQL Serverレプリケーション機能を使用して異なるサイト間でデータをコピーするときに直面する可能性のあるさまざまな問題と、これらの問題を修正する方法について説明しました。

    SQL Serverエンジンを最新のSPおよびCUで最新の状態に保つことを強くお勧めします。これにより、SQLServerレプリケーション機能に関連するすべてのバグが自動的に修正されます。最後に、プロアクティブなSQL Serverデータベース管理者として、レプリケーションサイトを監視して、問題が大きくなり、修正が困難になる前に、最初から問題を修正します。


    1. postgresの日付表現をISO8601文字列に変換します

    2. Microsoft SQL Server –SQLサタデーダラスに参加してください

    3. Datetimeを使用して文字列として保存された日付を比較する

    4. 列名を取得するためのMySQLクエリ?