web-dev-qa-db-ja.com

SQL Serverインスタンスを再起動せずにリンクサーバーを修正する

問題:時々夜間のジョブが失敗することがあり、調べてみると、リンクサーバー全体のクエリが失敗した結果です。しかし、なんらかの理由で、クエリが何らかの理由で「オープン」のままであり、その後の失敗の原因となるようです。

悪い解決策:これを修正する唯一の方法は、すべてをクリアしたように見えるインスタンスを再起動することです。しかし、それが本番環境で発生する場合、明らかにそれは少し面倒です。

質問:resetリンクサーバーを開いたままにする戦略はありますか?私は内部で何が起こっているのか本当によくわかりません。

その他のチェック:-

  • リンク先のサーバーでクエリをテストしました。そしてその側でデータを細かく選択できます
  • リンクを使用してサーバー上のその他すべてをテストしました。すべてが正常に機能し、リンクを介してクエリを実行しようとしても失敗します。

これを実際にインスタンスを再起動する唯一の解決策はありますか?

4
TheNorthWes

実行しているステートメントと、リンクサーバーの構成方法によっては、 孤立した分散トランザクション を使用して、キルする必要がある状況に陥っている可能性があります。これが当てはまるかどうかを識別するには、まず次のクエリを実行します。

SELECT  DISTINCT request_owner_guid
FROM    sys.dm_tran_locks 
WHERE   request_session_id = -2

これがレコードを返す場合は、実際にこの状況に遭遇している可能性があります。これらの孤立したトランザクションを強制終了するには、上記のクエリによって返された各レコードに対して次のステートメントを実行する必要があります。

KILL 'UOW'

[〜#〜] uow [〜#〜]は、上記のクエリで返されたrequest_owner_guidです。

リンクサーバーの問題と、SQL Serverプロセスから外部で呼び出しを行うジョブの両方でこの状況に遭遇しました。どちらの場合でも、外部プロセスが干渉し(ネットワークのドロップ、プロセスの強制終了、予期しないエラーなど)、トランザクションがSQL Serverで正しく終了しないことがわかります。 SQL Serverはトランザクションが実際に失敗したことを認識せず、このプロセスを実行するか、既に実行しているようにサーバーをバウンスするまで、問題は発生しません。

お役に立てば幸いです。

4
John Eisbrener

プロバイダーのチェックされていない「プロセスで許可」プロパティ

アウトプロセスプロバイダーでリンクサーバーをセットアップするために必要なアクセス許可: http://blogs.msdn.com/b/dataaccesstechnologies/archive/2010/08/19/permissions-needed-to-set- up-linked-server-with-out-of-process-provider.aspx

0
Nadir