Sql-Server

SQL Server如何在將列更新為int時繞過事務日誌

  • September 21, 2018

我有一個名為 SQL Server 2005 的表BRITTNEY_SPEARS_MARRIAGES,它具有以下列:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

現在我有另一張桌子BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

問題是我們想將MarrigeIdcolumnint從 a 更新為 a tinyint。我們只是覺得布蘭妮在一切都說完之前會有很多婚姻。

現在BRITTNEY_SPEARS_MARRIAGE_STORIES表中有 1800 萬行(嘿,女孩有一些問題),所以當我們進行更新時,事務日誌會填滿,我們的 SQL Server 框會死掉。

我們怎樣才能解決這個問題?

反正有沒有說“嘿,SQL Server,我要更新這個專欄,讓它變得更大。相信我在這個 SQL Server 上。請不要在你嘗試驗證所有內容時填寫事務日誌?”

沒有辦法告訴 SQL Server 不要使用事務日誌。

可以做的是將數據庫的恢復模式設置為 SIMPLE,這將在需要空間時覆蓋舊的日誌條目。但是,您不應該在生產伺服器上執行此操作,因為您將無法執行某些類型的恢復,例如時間點恢復。

或者,您可以將事務日誌文件設置得更大——作為一個不科學的經驗法則,我會確保 A)您的事務日誌的可用空間至少比您的表大小多 1.5 倍或 B)您的事務日誌可以自動增長到至少有大約此數量的可用磁碟空間的驅動器。

您可以通過備份日誌來釋放事務日誌空間。如果您不關心日誌內容,請將文件丟棄。一個捷徑是BACKUP LOG <Your Database Name> TO DISK = 'NUL:'. 同樣,不要在生產伺服器上執行此操作,除非您絕對確定您理解其中的含義。

要注意的另一件事(儘管它與您的問題並不完全相關)是確保您正在擴展的表上定義了聚集索引。如果不是這樣,表可能會產生大量的堆碎片,並可能在這樣的更改中變得不必要的大。

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