SQL Server, wie Sie das Transaktionsprotokoll umgehen können, wenn Sie eine Spalte auf einen int aktualisieren

18

Ich habe eine SQL Server 2005-Tabelle namens BRITTNEY_SPEARS_MARRIAGESund es hat die folgenden Spalten:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

Jetzt habe ich einen anderen Tisch BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

Das Problem ist, dass wir die MarrigeIdSpalte auf eine intvon einer aktualisieren möchten tinyint. Wir haben nur das Gefühl, dass Brittney viele Ehen haben wird, bevor alles gesagt und getan ist.

Jetzt enthält die BRITTNEY_SPEARS_MARRIAGE_STORIESTabelle 18 Millionen Zeilen (hey, das Mädchen hat einige Probleme). Wenn wir also das Update durchführen, wird das Transaktionsprotokoll voll und unser SQL Server-Kasten stirbt.

Wie können wir das umgehen?

Gibt es sowieso zu sagen "Hey SQL Server, ich werde diese Spalte aktualisieren und vergrößern. Vertrauen Sie mir auf diesem SQL Server. Bitte füllen Sie das Transaktionsprotokoll nicht aus, während Sie versuchen, alles zu validieren?"

codingguy3000
quelle

Antworten:

7

Es gibt keine Möglichkeit, SQL Server anzuweisen, das Transaktionsprotokoll nicht zu verwenden.

Sie können das Wiederherstellungsmodell der Datenbank auf EINFACH setzen, wodurch alte Protokolleinträge überschrieben werden, wenn Speicherplatz benötigt wird. Sie sollten dies jedoch nicht auf Ihrem Produktionsserver tun, da Sie bestimmte Arten von Wiederherstellungen nicht durchführen können, z. B. Zeitpunktwiederherstellungen.

Alternativ können Sie Ihre Transaktionsprotokolldatei auch größer einstellen. Als unwissenschaftliche Faustregel stelle ich sicher, dass entweder A) Ihr Transaktionsprotokoll mindestens 1,5x mehr freien Speicherplatz als die Größe Ihrer Tabelle hat oder B) dass Ihr Transaktionsprotokoll automatisch auf ein Laufwerk erweitert werden kann, auf dem mindestens etwa diese Menge an Speicherplatz frei ist.

Sie können Transaktionsprotokollspeicherplatz freigeben, indem Sie das Protokoll sichern. Wenn Sie sich nicht um den Inhalt des Protokolls kümmern, werfen Sie die Datei weg. Eine Abkürzung dafür ist BACKUP LOG <Your Database Name> TO DISK = 'NUL:'. Wiederum sollten Sie dies nicht auf einem Produktionsserver tun, es sei denn, Sie sind sich absolut sicher, dass Sie die Auswirkungen verstehen.

Eine andere Sache, auf die Sie achten sollten (obwohl dies für Ihre Frage nicht ganz relevant ist), ist, sicherzustellen, dass für die Tabelle, die Sie erweitern, ein Clustered-Index definiert ist. Wenn dies nicht der Fall ist, kann die Tabelle eine sehr große Menge an Heap-Fragmentierung verursachen und bei einer solchen Änderung möglicherweise unnötig groß werden.

Dave Markle
quelle
5
  • Löschen Sie alle Fremdschlüssel
  • Erstellen Sie neue Tabellen mit intanstelle vontinyint
  • Verschieben Sie die Zeilen pro Stapel von 1000 (fügen Sie sie in die neue Tabelle ein, löschen Sie sie aus der alten)
  • Lass die alten Tische fallen
  • Benennen Sie die neuen Tabellen mit in die alten Namen um sp_rename
  • Erstellen Sie die Fremdschlüssel neu

pS Wenn Ihr Transaktionslog groß ist ... überprüfen Sie Ihr Wiederherstellungsmodell. Wenn dies nicht der Fall ist simple, wie lange ist es her, dass Sie das Protokoll zuletzt gesichert haben?

Andomar
quelle
Sie meinen, da Sie das Protokoll gesichert haben, wird das Protokoll durch das Sichern der Datenbank nicht kleiner.
HLGEM
@HLGEM: Sie haben Recht, ich habe gerade einen Artikel von Paul Randal zu diesem Thema gelesen. Ein bisschen unerwartet, wenn Sie nur vollständige Sicherungen durchführen würden, würde Ihr Protokoll weiter wachsen.
Andomar