我需要在不同資料庫中的兩個表之間傳輸大量資料,例如:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[MoveThenTruncateMyData]
AS
BEGIN
INSERT INTO MyDB2_TEST.dbo.MyData (Column1, Column2, Column3, Column4)
SELECT Column1, Column2, Column3, Column4
FROM MyDB1_TEST.dbo.MyData;
TRUNCATE TABLE MyDB1_TEST.dbo.MyData;
END
我將 MyDB2_TEST 設定為簡單的恢復模式。
但是,一旦行開始移動,日志檔案的大小就會開始增加。
由于資料庫資料檔案為 80 GB,因此在事務運行時日志似乎會大 3 倍。
問題是我在那臺機器上沒有足夠的空間:它會飽和。
有沒有辦法也禁用事務日志?在這種情況下,如果操作失敗,我可以重新做。
uj5u.com熱心網友回復:
您不能在任何恢復模式中禁用事務日志。原因是您必須能夠整體回滾任何事務;日志必須包含執行回滾所需的所有內容。因此,如果您有一個插入 10 億行到表中的單個插入,則該資料庫的日志必須保留所有這些資訊,直到事務提交。您可以通過以下方式抵消它:
- 將操作分成塊
- 使用最少的日志記錄
- 以不同的方式移動資料(與分塊組合)
- 根本不移動資料(例如,一個資料庫不能只有一個指向另一個資料庫的視圖嗎?)
uj5u.com熱心網友回復:
當您要執行批量操作時,建議將恢復模式設定為 Bulked-log not simple。使用 Bulked-log 恢復模式,日志將以最小模式寫入。
另一點是將您的插入分成幾批;因為在事務提交之前不會截斷日志。
uj5u.com熱心網友回復:
我提出了一個替代方案,而不是您嘗試如何進行資料移動(即全有或全無):
delete top(1000)
from MyDB1_TEST.dbo.MyData
output deleted.Column1, deleted.Column2, deleted.Column3, deleted.Column4
into MyDB2_TEST.dbo.MyData(Column1, Column2, Column3, Column4);
我任意選擇了1000行;選擇一個適合您的號碼。無論哪種方式,這都允許您以事務一致的方式一次移動少量行。您必須確保您的應用程式在轉換期間了解事物的狀態(可能是跨越兩個表的視圖?),但這可以讓您將事務日志影響保持在一個批次的價值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441787.html
標籤:sql服务器
