Transaction-Log

在 Alter Table 期間用完事務日誌空間

  • July 28, 2013

我正在執行一個更改表,更改一個具有近 3000 萬行的表上的列,並且 SQL Azure 在大約 18 分鐘後失敗了The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

我猜不可能將其分解為一次修改更少的行,所以我想知道我的選擇是什麼來對數據庫進行這種更改。SQL Azure 不允許我更改事務日誌的大小(限制為 1gb)。

我猜我最好的選擇是使用新佈局創建一個新表,將數據遷移到該表中,刪除原始表,然後重命名新表以匹配舊表的名稱。如果是這種情況,最好如何建構這些命令?

我們系統的計劃停機時間目前不是問題,因此此操作可能需要盡可能長的時間。

您需要將數據載入到新表中,分小批執行此操作,然後刪除現有表。我使用 AdventureWorks 中的 Sales.Customer 表整理了一個快速範例,類似的東西也應該適用於您。

首先,創建您的新表,並填寫您要使用的新數據類型:

CREATE TABLE [Sales].[Currency_New](
   [CurrencyCode] [nchar](4) NOT NULL,
   [Name] [varchar](128) NOT NULL,
   [ModifiedDate] [datetime] NOT NULL,
CONSTRAINT [PK_Currency_New_CurrencyCode] PRIMARY KEY CLUSTERED 
(
   [CurrencyCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO

然後,插入您的記錄並定義您的批次。我在這裡使用 10,但您可能想要使用更大的東西,比如一次 10,000 行。對於 30MM 行,我什至建議您一次使用 100k 行批量大小,這是我通常用於較大表的限制:

DECLARE @RowsInserted INT, @InsertVolume INT
SET @RowsInserted = 1
SET @InsertVolume = 10 --Set to # of rows

WHILE @RowsInserted > 0
BEGIN       

INSERT INTO [Sales].[Currency_New] ([CurrencyCode]
          ,[Name]
          ,[ModifiedDate])
SELECT TOP (@InsertVolume)
      SC.[CurrencyCode]
          ,SC.[Name]
          ,SC.[ModifiedDate]
FROM [Sales].[Currency] AS SC
LEFT JOIN [Sales].[Currency_New] AS SCN 
   ON SC.[CurrencyCode] = SCN.[CurrencyCode] 
WHERE SCN.[CurrencyCode] IS NULL

SET @RowsInserted = @@ROWCOUNT
END

我通常會在清理之前進行完整性檢查並驗證行數是否相同:

SELECT COUNT(*) FROM [Sales].[Currency] 
SELECT COUNT(*) FROM [Sales].[Currency_New]

一旦你確信你已經遷移了你的數據,你可以刪除原始表:

DROP TABLE [Sales].[Currency]

最後一步,重命名新表,這樣使用者就不必更改任何程式碼:

EXEC sp_rename '[Sales].[Currency_New]', '[Sales].[Currency]';
GO

我不知道這需要多長時間。我建議您在有明確的維護視窗並且未連接使用者時嘗試這樣做。

高溫高壓

我現在正在打電話,但幾天前我剛剛在 StackOverflow 上回答了一個非常相似的問題。列名可能不適用於您,但這是我給出的。

SELECT 
[ID],
[Title],
[Abstract],
[Value],
[UserID],
[GroupID],
[Date],
[Views],
[Hates],
[Likes],
[Source]
INTO dbo.[News-News_Newest]
FROM [dbo].[News-News];

DROP TABLE [dbo].[News-News_Newest];
GO

EXEC sp_rename '[News-News_Newest]' , '[News-News]';
GO

ALTER TABLE [News-News]
 ADD CONSTRAINT PK_News_ID PRIMARY KEY CLUSTERED (ID ASC);

與我們一樣,同樣的警告也適用於您。腳本出你的外鍵關係,然後重建。載入後檢查檢查

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