2017-01-06 7 views
-2

Ich habe eine Datenbank mit 15 GB mit einigen Binärdaten, die 50% der Datenbank ausmachen. Ich möchte diese nicht benötigten Daten entfernen, aber mein Transaktionslog wird in der Größe explodieren. Was sind meine Möglichkeiten?Setzen Sie eine Spalte auf NULL, ohne Transaktionsprotokoll zu generieren

Ich kann nur eine Spalte Daten löschen: UPDATE t SET binData=NULL WHERE binData IS NOT NULL

Und ja, könnte der Raum das Problem sein: daher meine Frage. Ich muss dies auf 1000+ Datenbanken tun (die meisten von ihnen sind 1-2GB). Ich habe nicht 2x Speicherplatz zur Verfügung

+0

Wie viel Platz haben Sie? – Hiten004

+2

Angenommen, die Daten befinden sich in einer Tabelle, in der alle Daten gelöscht werden können: http://stackoverflow.com/questions/24213299/how-to-delete-large-data-of-table-in-sql-without-log – xQbert

+2

Entweder Löschen Sie in Stapeln oder schneiden Sie die Tabelle ab. Beachten Sie, dass truncate die Auswirkung auf das Transaktionsprotokoll erheblich reduziert, aber nur die Löschungen der Seite im Gegensatz zu allen Daten protokolliert. –

Antwort

0

Hinweis: Bitte versuchen Sie dies auf Test Faust. TUN SIE DIES NICHT IN DER PRODUKTION !!!

  1. Import der Daten in der Tabelle neu Temp behalten wollen
  2. Original-Tabelle gestutzt
  3. Import von Daten aus neuer temporärer Tabelle zu Original-Tabelle
+0

Er wird einige Transaktionsaktivitäten für die Zeilen generieren, die er von der persistierten Tabelle zur temporären Tabelle und zurück bewegt, aber ich denke, dass es keinen Weg gibt. –

0

am letzten Kommentaren Basierend würde es scheinen, Als ob der beste Ansatz in etwa so wäre:

Hinweis: BITTE versuchen Sie dies zuerst auf einer Testbox/Installation. TUN SIE DIESE PRODUKTION NICHT OHNE VORHERIGE PRÜFUNG UND PLANUNG!

  • die Protokollierung DBs Set-Modus Einfache
  • ALTER TABLE t DROP COLUMN BinData
  • ALTER TABLE t BinData ADD [Spalte definieren]
  • Stellen Sie den Logging-Modus wieder auf Voll
  • Nehmen Sie eine volle Shrink Backup
  • (Optional) Ihre MDF-Datei (en)

Hinweis: Egal wha t Wenn Sie eine Spalte wie diese löschen müssen, setzen Sie Ihre Protokollierung vor dem Prozess auf Einfach, um die tatsächliche Protokollierung auf ein Minimum zu beschränken.

0
select 1 
while @@rowcount > 0 
begin 
    UPDATE t 
    SET top (100000) binData = NULL 
    WHERE binData IS NOT NULL 
end 

haben Sie dB log on checkpoint

trunkieren
0

Sie können einfach die Datensätze in mehrere kleinere Chargen aktualisieren. Vielleicht müssen Sie den CHECKPOINT nach jeder Charge auch sicherheitshalber aufrufen. Wenn sich Ihre Datenbank im Modus SIMPLE RECOVERY (SIMPLE RECOVERY) befindet, sollte der zugewiesene Protokollspeicherplatz automatisch wiederhergestellt werden. Wenn sich Ihre Datenbank im Modus FULL RECOVERY befindet, müssen Sie nach jedem Batch eine Protokollsicherung durchführen, um die Wiederverwendung des zugewiesenen Speicherplatzes im Protokoll zu ermöglichen. Sie können die Protokollgröße auf diese Weise unter Kontrolle halten.

Verwandte Themen