Sql-Server

為什麼我的表在刪除大量數據後不斷損壞?

  • September 24, 2020

我有一個大約 400 個演出的數據庫。varchar(max)大部分空間被以字元串形式儲存在單個表中的水電費圖像所佔用。這是我繼承的糟糕的數據庫設計。我已經將水電費賬單以 pdf 格式導出到網路文件夾。現在我正在嘗試用空字元串替換數據庫中的圖像。我一直在一次小批量更新 40k 到 80k 條記錄。問題是在幾批之後,表被破壞了。我會收到更新失敗的消息。當我執行 CHECKDB 我得到

消息 8909,級別 16,狀態 1,行 1 表錯誤

到目前為止已經發生了兩次,我必須從備份中恢復數據庫。

我需要知道為什麼會發生這種情況,以及是否有辦法避免它。我在測試環境中執行此操作,我需要先解決此問題,然後才能處理生產數據庫。

感謝您的幫助。

編輯:將二進制更改為字元串。其中一張圖像儲存為 65,535 個字元的連續字元串。

編輯:這發生在 MSSQL 2014 SP3(版本 12.0.6024.0)上

你真的是說 varbinary(max) 嗎?在文本類型列中包含非文本數據似乎很奇怪。

無論如何,不應該發生腐敗。您的第一步是確保您使用的 SQL Server 版本是最新的。即,(服務包和)CU。

如果它仍然存在,那麼我懷疑 SQL Server 中存在錯誤,或者在您的更新之前已經存在損壞。即,先做一個checkdb,看看它是否乾淨。如果它是乾淨的並且被更新損壞,那麼您可能有一些儲存/機器問題(如果它是可重複的,則不太可能)或 SQL Server 中的錯誤。

正如已經建議的那樣,使用DBCC CHECKDB(或者可能CHECKTABLE用於更直接的檢查,但是當懷疑損壞時,我會在檢查所有內容的方向上犯錯,聽起來這張表無論如何都是你的數據庫的大部分)。

如果您可以從開始該過程之前恢復備份並進行檢查,最好在另一台機器上進行檢查,您將確認是否從一開始就存在問題,或者是否確實從所有新活動開始。

如果問題已經在那裡等待了很長時間,那麼除了修復它(可能會失去一些記錄)之外,您可能無能為力。如果這些記錄用於存檔目的並且很少被訪問,那麼最初的問題可能發生在幾年前。如果問題確實始於您的過程,我會首先懷疑是硬體問題,或者是錯誤。對於前者,請檢查您的作業系統日誌是否有任何嚴重問題,所有驅動器上的 SMART 讀數,如果您不使用本地儲存,請驗證網路連接等。對於後者,請確保您已針對您的 SQL Server Windows 版本進行了全面修補。對於兩者,還要檢查可能沒有提供套件的硬體驅動程序/韌體更新,特別是您的主系統板和任何 RAID(或其他 IO)控制器的韌體。

我不希望您描述的工作會導致損壞,除非存在硬體問題或某些內容已過時,因此存在未修復的錯誤。

引用自:https://dba.stackexchange.com/questions/275997