Sql-Server

防止 spid 回滾的正確程序

  • May 29, 2009

今天我遇到了一種情況,我想取消對錶和多個索引的更新,並立即從備份中恢復數據庫。

我發出了一個 kill 命令來終止更新的 SPID。然後我發出了一個只有狀態的殺戮,有幾萬秒的回滾等待。我需要盡快恢復數據庫(因此不關心回滾) - 但你不能殺死正在回滾的 SPID(據我所知),或者恢復具有未完成連接的數據庫。

我決定停止 sql 服務,刪除數據庫的 mdf 和 ldf 物理文件,啟動 sql 服務——這表明數據庫處於可疑狀態。然後恢復數據庫。

有沒有更可控/更明智的方法來處理這種情況?

正確 - 您不能終止正在回滾的 SPID,因為數據庫將進入事務不一致的狀態(甚至可能在結構上不一致)。

所以簡單的答案是,除了做一些激烈的事情外,沒有辦法阻止 SPID 一旦啟動就回滾。

你的處境很難擺脫,因為真的別無選擇。即使您退回 SQL Server,數據庫也會經歷崩潰恢復,您需要等待它完成。

解決此問題的幾種可能方法:

  1. 更改更新,使其以較小的批次發生,這樣您將來就不會遇到相同的怪物回滾(可能說起來容易做起來難)
  2. 以不同的名稱恢復數據庫。等待回滾完成,然後刪除原始數據庫並重命名恢復的數據庫。
  3. 你做了什麼。這樣做的巨大風險是您的備份已損壞,然後您失去了所有內容,或者發生了其他一些奇怪的問題,您的狀態比以前更糟。它還要求 SQL 服務停止並重新啟動。

一旦你處於那種狀態,除了讓回滾完成之外,基本上沒有*好的解決方案。*我真的很猶豫要不要寬恕你的所作所為,因為很多沒有經驗的人可能會嘗試並讓自己陷入真正的深淵。

謝謝

引用自:https://serverfault.com/questions/14827