簡體   English   中英

SQL 服務器 Service Broker - 刪除服務

[英]SQL Server Service Broker - Drop service

我有幾個月來一直在我的數據庫中使用的 Service Broker 隊列基礎結構。 我意識到我的Initiator隊列已達到 200 萬條記錄,這些記錄是EndDialog消息。 所以我通過這個鏈接重新設計了它。

我的問題是我無法刪除那 200 萬條記錄。 我使用了此鏈接中所示的以下方法,並讓查詢繼續執行。 它執行了 20 個小時,直到我取消它。

declare @c uniqueidentifier
while(1=1)
begin
    select top 1 @c = conversation_handle from dbo.queuename
    if (@@ROWCOUNT = 0)
    break
    end conversation @c with cleanup
end

現在我正在嘗試刪除 Service 和 Queue,但它似乎又會花費很多時間。

drop service initiatorService
drop queue initiatorQueue

還有其他方法可以立即刪除嗎?

隊列數據; 在此處輸入圖像描述

除非您願意,否則沒有捷徑可以實現您所知道的目標。

  • 刪除並重新創建數據庫,或者
  • 重置該數據庫中所有隊列(包括對話框本身)中的所有Service Broker數據(在這種情況下,您可以嘗試按照鏈接問題ALTER DATABASE ... SET NEW_BROKER WITH ROLLBACK IMMEDIATE;中的Remus的建議進行操作)

至於您的代碼,我建議您使用receive而不是select ; 否則,您可能會多次獲得相同的對話框。 另外,如果EndDialog消息出現在隊列中,您可能希望將它們與其他消息區分開。

我有一個類似的問題,刪除服務花了很長時間。 這么久我的 SQL 服務器用完了 memory 並崩潰了。 我首先嘗試用您在頂部發布的查詢結束對話,但這沒有幫助。 在我的例子中,創建了很多從未關閉的對話。 所以雖然隊列是空的,但是當我查詢 sys.conversation_endpoints 時仍然有很多對話。 我使用以下腳本來清理對話,然后我能夠立即將其刪除。

請注意,下面的查詢將關閉所有對話,無論隊列如何,因此如果您只想刪除特定的對話,則需要進行過濾

declare @c uniqueidentifier
while(1=1)
begin
    select top 1 @c = conversation_handle from sys.conversation_endpoints
    if (@@ROWCOUNT = 0)
    break
    end conversation @c with cleanup
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM