Sql-Server

將數據從一個表移動到另一個表而不會失去數據

  • July 19, 2018

我有一個日誌表,目前保存著數百萬條記錄。我想在那個表上啟用分區,所以我現在做的是:

  1. 創建了分區函式和分區方案。
  2. 在該分區方案上創建了一個具有相同結構的空表。
  3. 從這個時間點(我們稱之為T1)將目前日誌表中的數據複製到新的分區表。

接下來的步驟是將最後剩餘的記錄從 to 複製T1並重Tnow命名這兩個表,以便應用程序開始寫入新的分區表。

當然日誌表是經常訪問的,所以我的問題是:

如何確保在此過程中不會失去任何數據?我可以做到讓使用者不會注意到任何事情,或者我是否必須在這短暫的時間內停止應用程序?或者我可以阻止該表以便應用程序繼續執行嗎?如果是這樣,怎麼做?

考慮使用您想要的分區策略創建一個新表,並在兩個表的頂部添加一個視圖,該視圖執行全部聯合。讓人們使用視圖,並針對基礎表和視圖編寫觸發器而不是觸發器。

插入應該發送到新表,更新應該將數據移動到新表,刪除應該應用於兩個表。

然後在後台進行批量移動,一次將盡可能多的記錄移動到新表中。在此過程中您仍然可能遇到並發問題,以及一些糟糕的執行計劃,但它可以讓您在移動發生時保持線上。

理想情況下,您在周五下午開始該過程,以盡量減少對最終使用者的影響,並嘗試在周一早上之前完成。一旦它到位,您可以將視圖更改為僅指向新表,然後可怕的執行計劃就消失了。理想情況下。

為避免在批量遷移數據時觸發觸發器,請查看觸發器中已刪除/插入的表中的行數,如果活動接近批處理中的行數,則跳過這些活動。

您希望這對您的最終使用者來說越透明,它需要的工作(和測試)就越多。如果您使用分區,這尤其適用:人們通常認為它會使他們的所有查詢更快,但其中一些最終會慢得多。如果可以,請嘗試在具有分區表的開發伺服器上測試盡可能多的工作負載。

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