2010-03-24 51 views
0

我需要將大量數據從舊數據庫中的兩個表中移動到新數據庫中的幾個不同表中。數據庫是SQL Server 2005,位於同一個盒子和sql服務器實例上。有人告訴我,如果我試圖完成所有事務,那麼事務日誌將會填滿。有沒有辦法禁用每個表的事務日誌?如果不是,這樣做的好方法是什麼?光標會做到嗎?這只是一次性轉換。如何將舊數據庫中的大量數據遷移到新的數據庫

回答

1

使用SQL Server Management Studio中的導入/導出數據嚮導。這裏的

  1. 多麼正確的對象資源管理器中單擊數據庫
  2. 選擇任務 - >導入數據
  3. 完成「選擇源」窗口
  4. 完成「選擇目標」窗口
  5. 選擇
  6. 「從一個或多個表或視圖複製數據」選擇你的表

不要使用遊標,這將永遠!

另一種替代方法是在循環中執行插入操作,以限制單個事務中包含的行數(從而防止事務日誌增長太多)。

SET ROWCOUNT 10000 
WHILE EXISTS(SELECT * FROM tblA LEFT JOIN tblB on tblA.ID = tblB.ID WHERE tblB.ID IS NULL) 
BEGIN 
    BEGIN TRAN 
    INSERT tblB 
    SELECT * FROM tblA LEFT JOIN tblB on tblA.ID = tblB.ID WHERE tblB.ID IS NULL 
    COMMIT 
    PRINT CAST(@@ROWCOUNT AS VARCHAR) + ' rows have been inserted.' 
END 

SET ROWCOUNT 0 --to reset 
+0

在SSMS表/對象副本將默認爲在一個事務中所做的操作。您可以保存包並在SSIS中打開它,並在目的地上修改它以設置批量提交。 – 2010-03-24 17:05:24

+0

那麼你發佈的第二種方法是在事務日誌中創建10000個條目然後清除它們? (對不起,我不太瞭解事務日誌的工作原理。) – adam0101 2010-03-24 18:18:55

+0

在默認配置下,事務日誌自動增長以適應在事務處於打開狀態時(如插入期間)積累的數據量。如果我們在每10000行後執行一次事務,那麼事務日誌一次只需要保存一行10000行。基本上,我們將插入分成更小的塊。 – MikeZ 2010-03-24 19:11:13

0

一個非常大的INSERT INTO db2.t SELECT * FROM db1.t確實可以填滿你的事務日誌 - 因爲它需要大量的空間,在提交事務之前。但這個大小取決於很多東西 - 行數,行的大小,交易日誌的大小等。

我知道這可能聽起來很愚蠢,但取決於你的環境風險(以及它的真實可能性填寫交易日誌),我可能會爲此付出代價。你所冒的所有風險都是事務日誌的填滿,你的事務回滾以及其他數據庫用戶稍微感到不便,直到這個空間再次被釋放。如果是開發或新的數據庫,人們可能不會注意到。

你可以將它分成「合理」大小的批量(同樣,這取決於)。如果這太難了(沒有好的分區策略),請使用SSIS並執行傳輸並設置批量提交限制。

無論在哪種情況下,如果操作中斷,顯然您只會對已提交的事務產生ACID。 有時根據實際需要多長時間(取決於索引和唯一鍵可用性)來確定哪些行已傳輸,哪些不是,更容易斷開目標表並重新嘗試整個傳輸。

相關問題