Sql-Server

使用 bcp 導出數據以處理損壞的數據

  • March 6, 2017

DBCC CHECKDB在 SQL Server 2014 上已損壞行的表上執行時遇到一致性錯誤。在前 30,000 行(總計 140 萬(140 萬)行)之後,我遇到了損壞錯誤。

我想嘗試bcp將數據取出,直到出現損壞。我想跳過損壞的行。我想bcp在損壞範圍之後並儘量減少數據失去。

我該怎麼做?請詳細說明。

另請參閱我以前的問題:在 SQL Server 2014 中的幾個表上執行 CHECKDB 的一致性錯誤

首先,這是我關於如何解決腐敗問題的清單。這是一個大問題 - 比我在這裡可以涵蓋的要大 - 但基於這個的聲音,我認為你沒有涵蓋一些基礎知識(比如嘗試從備份中恢復,或者確保你甚至有備份.)

當您開始出現損壞錯誤時,每次訪問儲存時,您都可能使問題變得更糟。例如,我處理了一個損壞的儲存陣列,我們讀取的數據越多,損壞的越多。(我讀了一張桌子,它很好,然後十五分鐘後,它也被沖洗掉了。)就像鬼屋一樣,你需要盡快離開那個儲存設備,並在其他地方處理你的恢復工作.

一旦你在另一個儲存設備上,如果你可以將損壞隔離到一個表中(這不太可能,但你暗示你已經這樣做了),那麼:

  • 在 CHECKDB 的輸出中,確定哪些索引受到影響(您可以通過索引 ID 看到 - 0 是堆,1 是聚集索引,2 及更高是非聚集索引)
  • 如果您在索引 0/1 中有損壞,那麼為了獲得獎勵積分,請分別從每個索引中複製數據。您可能能夠為聚集索引中的損壞行取回一些列。(如果您在多個非聚集索引中有損壞,您可能能夠從一些非聚集索引中獲取所有行,但不能從其他索引中獲取。)
  • 如果您可以確定哪些頁面受到影響,那麼您需要設計 WHERE 子句來解決損壞的頁面。(SQL Server 不會優雅地跳過損壞的頁面 - 由您來設計查詢以在遇到損壞之前停止。)

例如,考慮按姓氏組織的電話簿,然後是名字。如果您知道包含 Ozar, Brent 的頁面已損壞,那麼您可能必須選擇直到我姓氏的使用者,但在此之前停止 - 然後對姓氏高於我的使用者執行第二個查詢。

不過,訣竅是這樣的:腐敗將席捲全球。您將做大量工作來試圖繞過不同的損壞頁面。

這並不容易,這就是我寫清單的原因——以及為什麼它不嘗試解決這部分問題。你說的是腐敗普遍存在的幾天甚至幾週的工作。

老實說,我的建議是立即聘請知識淵博的 SQL Server 諮詢人員/公司來協助。根據數據,您的公司實際上可能在這裡面臨風險。如果你對數據庫做任何事情(尤其是 dbcc 的東西、重建等)而不是只讀的東西,你就有使事情變得更糟的風險!SQLSkills 可能是這裡最好的資源,但還有其他資源可以提供幫助。

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