SQL Server come aggirare il registro delle transazioni riempiendo quando si aggiorna una colonna a un int


18

Ho una tabella di SQL Server 2005 chiamata BRITTNEY_SPEARS_MARRIAGESe presenta le seguenti colonne:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

Ora ho un altro tavolo BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

Il problema è che vogliamo aggiornare la MarrigeIdcolonna intda a a tinyint. Pensiamo solo che Brittney avrà molti matrimoni prima che tutto sia detto e fatto.

Ora la BRITTNEY_SPEARS_MARRIAGE_STORIEStabella contiene 18 milioni di righe (hey la ragazza ha alcuni problemi) quindi quando andiamo a fare l'aggiornamento il registro delle transazioni si riempie e la nostra scatola di SQL Server si spegne.

Come possiamo aggirare questo?

C'è comunque da dire "Hey SQL Server ho intenzione di aggiornare questa colonna e ingrandirla. Fidati di me su questo SQL Server. Ti preghiamo di non compilare il registro delle transazioni mentre provi a convalidare tutto?"

Risposte:


7

Non è possibile dire a SQL Server di non utilizzare il registro delle transazioni.

Quello che puoi fare è impostare il modello di recupero del database su SEMPLICE, che sovrascriverà le vecchie voci di registro quando è necessario spazio. Non dovresti farlo sul tuo server di produzione, tuttavia, perché non sarai in grado di eseguire determinati tipi di ripristini, come i ripristini temporizzati.

In alternativa, puoi impostare un file di registro delle transazioni più grande - come regola empirica mi assicurerei che A) il tuo registro delle transazioni abbia almeno circa 1,5 volte più spazio libero rispetto alle dimensioni della tabella o B) che il registro delle transazioni può crescere automaticamente in un'unità che dispone almeno di questa quantità di spazio libero su disco.

È possibile liberare spazio nel registro delle transazioni eseguendo il backup del registro. Se non ti interessa il contenuto del registro, elimina il file. Una scorciatoia per questo è BACKUP LOG <Your Database Name> TO DISK = 'NUL:'. Ancora una volta, non farlo su un server di produzione a meno che tu non sia assolutamente sicuro di averne compreso le implicazioni.

Un'altra cosa a cui fare attenzione (anche se non è del tutto pertinente alla tua domanda) è assicurarsi che la tabella che stai espandendo abbia un indice cluster definito su di esso. In caso contrario, la tabella potrebbe comportare una notevole frammentazione dell'heap e potenzialmente diventare inutilmente grande in un cambiamento come questo.


5
  • Rilascia eventuali chiavi esterne
  • Crea nuove tabelle con intanzichétinyint
  • Sposta le righe per lotto di 1000 (inseriscile nella nuova tabella, eliminale da quella precedente)
  • Lascia cadere i vecchi tavoli
  • Rinominare le nuove tabelle con i vecchi nomi usando sp_rename
  • Ricrea le chiavi esterne

pS Se il registro delle transazioni è grande ... controlla il tuo modello di recupero. In caso contrario simple, quanto tempo è trascorso dall'ultimo backup del registro?


Intendi da quando hai eseguito il backup del registro, il backup del database non ridurrà il registro.
HLGEM,

@HLGEM: Hai ragione, ho appena letto un articolo di Paul Randal sull'argomento. Un po 'inaspettato, però, se solo eseguissi backup completi il ​​tuo registro continuerebbe a crescere.
Andomar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.