0

終了に時間がかかるプロセスがいくつかあります。

「私はそれを忘れました」と 30 時間かかった q クエリを実行したので、「kill id」を使用して強制終了しましたが、すでに 30 時間以上ロールバックしようとしています。

どうすればこれを強制的に停止できるか教えてください。

このクエリを実行すると

select
    p.spid
,   right(convert(varchar, 
            dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'), 
            121), 12) as 'batch_duration'
,   P.program_name
from master.dbo.sysprocesses P
where P.spid > 50
and      P.status not in ('background', 'sleeping')
and      P.cmd not in ('AWAITING COMMAND'
                    ,'MIRROR HANDLER'
                    ,'LAZY WRITER'
                    ,'CHECKPOINT SLEEP'
                    ,'RA MANAGER')
order by batch_duration desc

次の結果が得られます

61  23:40:48.893    Microsoft SQL Server Management Studio - Query                                                                                  
51  23:33:03.410    Microsoft SQL Server Management Studio - Query                                                                                  
58  23:01:08.960    Microsoft SQL Server Management Studio - Query                                                                                  
55  20:45:41.953    Microsoft SQL Server Management Studio - Query                                                                                  
64  19:08:37.310    Microsoft SQL Server Management Studio - Query                                                                                  
62  00:00:05.207    Microsoft SQL Server Management Studio - Query    

kill 61 を実行すると、次の SPID 61 が表示されます: トランザクション ロールバックが進行中です。推定ロールバック完了: 0%。推定残り時間: 0 秒。(これは過去 24 時間のケースです!)

この問題を解決するにはどうすればよいですか?

ありがとう

4

3 に答える 3

3

あなたはただ待たなければならないでしょう。慌てて電源コードを抜く人もいますが、サービスを再起動すると、ロールバックが最初からやり直される可能性があります。

潜在的な回避策 (およびこれが既知の問題であり、すぐには修正されない可能性が高いことの確認) については、この Connect 項目を確認することをお勧めします。

http://connect.microsoft.com/SQLServer/feedback/details/187192/openquery-to-linked-server-hangs...

余談ですが、クエリに関するいくつかのこと:

  1. sysprocessesSQL Server 2000 以前を使用している場合にのみ使用してください。SQL Server 2005 以降では、DMV を使用する必要があります (例: sys.dm_exec_requests)。古いsys...ビューは、下位​​互換性のためにのみ存在します。ただし、場合によっては、それを使用して次のことを判断したい場合がありますwaitresource。リンクされたサーバーの種類によっては、リモート インスタンス/セッションに関する情報が提供される場合があります。これにより、相手側のプロセスを強制終了するために使用できる情報が得られる場合があります。 . あなたの場合、リモートの「サーバー」は単なるテキストファイルであるため、これは関係ありません。おそらく、タスクマネージャーでタスクを強制終了できます...

  2. spid > 50システム以外のプロセスを識別するための非常に簡単な方法ではありません。たとえば、新しい DMV では、 を使用してユーザー プロセスを識別できますsys.dm_exec_sessions.is_user_process

  3. CONVERT(VARCHARlength を指定せずにすべきではありません

  4. 省略形の like を使用しないでmsください。つまりMILLISECOND、typeMILLISECOND . また、30 時間実行されているクエリを測定する場合、ミリ秒単位の精度が本当に必要ですか?

  5. 非常に注意してください'string delimited column aliases'- この構文は場合によっては非推奨であり、ほとんどの読者には文字列リテラルのように見えます。本当にエイリアスを区切りたい場合 (この場合は必要ありません)、 を使用します[square brackets]

  6. あなたの時間の切り捨ては、私にはほとんど意味がありません。クエリが 4 日間実行されていた場合は、わかりません。なぜだめですか:

    ;WITH x AS 
    (
      SELECT 
        session_id, 
        command,
        [status],
        s = DATEDIFF(SECOND, start_time, CURRENT_TIMESTAMP)
      FROM sys.dm_exec_requests AS r
      WHERE EXISTS 
      (
        SELECT 1 FROM sys.dm_exec_sessions 
        WHERE session_id = r.session_id
        AND is_user_process = 1
      )
      AND start_time < DATEADD(HOUR, -1, CURRENT_TIMESTAMP)
    )
    SELECT session_id, command, [status], s,
      CONVERT(VARCHAR(12), s / 86400) + ' days '
      + CONVERT(VARCHAR(2), (s % 86400) / 3600) + ' hours '
      + CONVERT(VARCHAR(2), (s % 86400) % 3600 / 60) + ' minutes.'
    FROM x
    ORDER BY s DESC;
    
于 2013-11-10T18:37:46.240 に答える
0

ROLLBACK を回避することはできません。代わりに、それを開始しないようにする必要があります。同じコードの 3 つのコピーが実行されていることを理解していますか ???

実行する前に SEMAPHORE チェックを使用できるかもしれません。例えば:

30h コードを実行する前に、一時テーブルが存在するかどうかを確認します。テーブルが存在する場合は、コードを実行しません。それ以外の場合は、テーブルを作成してからコードを実行します。

于 2013-11-10T18:56:32.957 に答える