共用方式為


如果資料庫中使用查詢通知,還原或復原可能會失敗或花費很長的時間

本文可協助您解決還原或復原在資料庫中使用查詢通知時可能會失敗或花費很長的時間的問題。

原始產品版本:SQL Server
原始 KB 編號: 2483090

徵兆

您可以使用針對查詢通知訂閱設定的資料庫,注意到下列一或多個徵兆:

  • 徵兆 1:如果 還原作業期間指定了NEW_BROKER 選項,從其備份還原資料庫可能會失敗,並出現 1205 錯誤訊息。 此外,將會在 SQL Server 的 Errorlog 資料夾中產生傾印檔案。

  • 徵兆 2:從其備份還原資料庫失敗,資料庫脫機。 此外,SQL Server 錯誤記錄檔中會記錄下列訊息:

    <Datetime> spid61 錯誤:9768,嚴重性:16,狀態:1。
    <Datetime> spid61 與安全交談相關聯的資料庫使用者已卸除,然後認證會與遠端點交換。 請避免在建立交談時使用 DROP USER。
    <Datetime> spid61 無法檢查資料庫 「5」 中的擱置查詢通知,因為開啟資料庫時發生下列錯誤:『在認證與遠方端點交換認證之前,已卸除與安全交談相關聯的資料庫使用者。 請避免在建立交談時使用 DROP USER。 查詢通知訂閱清理作業失敗。 如需詳細資訊,請參閱先前的錯誤。』。
    <Datetime> spid61 錯誤:9001,嚴重性:16,狀態:5。
    <Datetime> spid61 資料庫 'Test' 的記錄無法使用。 相關錯誤訊息請查閱事件記錄檔。 解決任何錯誤,並重新啟動資料庫。
    <Datetime> spid61 錯誤:3314,嚴重性:21,狀態:4。
    <Datetime> spid61 在資料庫 『Test』 中復原記錄作業期間,記錄檔記錄標識符發生錯誤 (1835:7401:137)。 一般而言,之前是將該錯誤記錄為 Windows 事件記錄檔服務的錯誤。 請從備份中還原資料庫或檔案,或修復資料庫。

    注意

    您可能會在資料庫的復原階段遇到問題。 當資料庫上線、伺服器重新啟動等等時,復原也會在資料庫上執行。

  • 徵兆 3:從其備份還原資料庫可能需要很長的時間,類似下列的訊息會記錄在 SQL Server 錯誤記錄檔中:

    日期時間SPID查詢通知傳遞無法在對話框 '{ Dialog ID }.' 上傳送訊息。 通知的傳遞失敗』?<qn:QueryNotification xmlns:qn=“https://schemas.microsoft.com/SQL/Notifications/QueryNotification” id=“2881” type=“change” source=“database” info=“restart” database_id=“7” sid=“0x010500000000000515000000FA48F22A6990BA52422C73DFF9030000”><qn:Message>4a4c696b-645c-40fd-bfef-4f2bc7c599b4;eb99973e-3cc9-4c7e-b4b9-47d8cf590c43</qn:Message></qn:QueryNotification>' ,因為 Service Broker 發生下列錯誤:'找不到交談句柄「<交談處理程式>」。

    注意

    您可能會在資料庫的復原階段遇到問題。 當資料庫上線、伺服器重新啟動等等時,復原也會在資料庫上執行。

原因

徵兆 1 的原因:當您在還原作業期間指定 NEW_BROKER 選項時,SQL Server 會嘗試截斷所有 Service Broker 相關數據表。 截斷需要SCH_M截斷對象的鎖定。 因此,主要交易會保留 sysdesend 上的SCH_M鎖定。 復原或還原資料庫時,SQL Server 預設會嘗試引發所有未處理的查詢通知,這需要將數據列(訊息)插入 sysdesend 數據表中。 此作業需要數據表上的SCH_S鎖定。 不過,此作業發生在不同的交易上,而且嘗試取得SCH_S鎖定是由第一筆交易所持有的SCH_M鎖定封鎖。 因此,執行還原的線程現在會封鎖在擁有的資源上,稱為自我死結的情況。 死結監視器偵測到死結並終止線程,因而終止還原作業。

如需鎖定的詳細資訊,請參閱 鎖定模式。 [徵兆] 區段中討論的其他徵兆是由於下列解決一節所述的修正文章中所述的已知問題所造成。

解決方法

徵兆 1 的因應措施:您可以在嘗試還原作業之前,先啟用會話層級追蹤旗標 9109 來解決問題。 範例文稿如下所示:

dbcc traceon (9109)
go
RESTORE DATABASE [Test] 
FROM DISK = N'C:\TestBackup.bak' WITH FILE = 1, 
MOVE N'test_Data' TO N'C:\test.mdf', 
MOVE N'test_Log' TO N'C:\test_1.ldf', 
NOUNLOAD, 
STATS = 1, 
NEW_BROKER
go
dbcc traceoff (9109)
go

注意

資料庫完全還原或復原之後,強烈建議您檢查以確定已引發查詢通知。 達成此目的最簡單的方式是將資料庫的狀態變更為唯讀,並將它變更回讀寫。 您可以檢查的一些其他方式包括中斷連結和重新附加資料庫、重新啟動 SQL Server 等。

您也可以藉由在還原作業上未指定 NEW_BROKER 選項,並在ALTER DATABASE還原資料庫之後改用 NEW_BROKER 選項來避免問題。

如需詳細資訊,請參閱 DBCC TRACEON - 追蹤旗標 (Transact-SQL)