SQL Server - Logging verhindern oder stark minimieren?
Hallo,
ich hab den SQL Server 2008 und habe dort eine Datenbank mit einer Tabelle die sehr viele Datensätze enthält.
Ich importiere die Daten über einen Bulk Insert und nutzte das Kommando "Tablock", das führt dazu, das der Import in wenigen Minuten beendet ist und sich das Log nur unwesentlich vergrößert.
Ist der importiert beendet füge ich eine Auto-Id Spalte an die Tabelle an über "Alter Table". Dafür kann ich kein Tablock benutzen und die Zeit bis die Spalte erstellt ist mit den IDs bewegt sich etwa um die 15min und das Log quillt unheimlich (2GB Tabelle, 15GB Log) auf.
Hab ich irgendeine Chance das zu unterbinden, da die Aktionen keinesfalls rückgängig gemacht werden müssten, was ein Logging erübrigt.
Für das Löschen der Tabelleninhalte hatte ich zwischenzeitlich "TRUNCATE TABLE" gefunden aber das ist auch nicht immer einsetzbar, das ebenfalls kaum Log Daten erzeugt.
Das Wiederherstellungsmodell ist übrigens auf "Einfach" gesetzt.
Grüße
ich hab den SQL Server 2008 und habe dort eine Datenbank mit einer Tabelle die sehr viele Datensätze enthält.
Ich importiere die Daten über einen Bulk Insert und nutzte das Kommando "Tablock", das führt dazu, das der Import in wenigen Minuten beendet ist und sich das Log nur unwesentlich vergrößert.
Ist der importiert beendet füge ich eine Auto-Id Spalte an die Tabelle an über "Alter Table". Dafür kann ich kein Tablock benutzen und die Zeit bis die Spalte erstellt ist mit den IDs bewegt sich etwa um die 15min und das Log quillt unheimlich (2GB Tabelle, 15GB Log) auf.
Hab ich irgendeine Chance das zu unterbinden, da die Aktionen keinesfalls rückgängig gemacht werden müssten, was ein Logging erübrigt.
Für das Löschen der Tabelleninhalte hatte ich zwischenzeitlich "TRUNCATE TABLE" gefunden aber das ist auch nicht immer einsetzbar, das ebenfalls kaum Log Daten erzeugt.
Das Wiederherstellungsmodell ist übrigens auf "Einfach" gesetzt.
Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 179770
Url: https://administrator.de/contentid/179770
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
10 Kommentare
Neuester Kommentar
Moin Moin
Aber warum die Mühe. Nach Vollsicherung und gegebenenfalls einen geschickten Wartungsplan hat sich das Problem doch erledigt.
Gruß L.
Das Wiederherstellungsmodell ist übrigens auf "Einfach" gesetzt.
Soweit ich mich erinnere bewirkt lediglich das Wiederherstellungsmodell "Massenprotokolliert" ein geringeres Transaktionsprotokoll aufkommen.Aber warum die Mühe. Nach Vollsicherung und gegebenenfalls einen geschickten Wartungsplan hat sich das Problem doch erledigt.
Gruß L.
Hallo,
Wie viele Datensätze ist bei dir "sehr viele Datenätze"? Mehr als 1 Tausend? Mehr als 10 Tausend? Mehr als 100 Tausend? Mehr als 1 Million?
Gruß,
Peter
Zitat von @ooAlbert:
Nun je nach dem was man da tut explodiert das Log und die Anweisung wird nicht ausgeführt.
Das das Log größer wird ist OK. Aber das die Anweisung nicht ausgeführt wird?!? Was willst du hier sagen?Nun je nach dem was man da tut explodiert das Log und die Anweisung wird nicht ausgeführt.
Beispielsweise hat ein "Delete" auf die Tabelle dazugeführt, das aus den 2GB Daten 50G Log gezaubert wurden und das ganze ca. 90min gedauert hat bis die Tabelleninhalte gelöscht waren.
Da wir weder deine Datenbank, Tabellen, Aufbau der Datensätze, Relation zueinander, Trigger, Stored Procedures usw. hier nun nicht kennen, was möchtest denn dann von uns hören. Das du uns leid tust?Der "TRUNCATE TABLE" Befehl hat dazu 1 Sekunde benötigt und keine erkennbare Vergrößerung des Logs verursacht.
Wenn ein Truncate Table = Delete wäre, warum gibt es dann diese zwei vorgehen? Die sind doch grundsätzlich unterschiedleicher Natur und Funktion. Die kannst du nicht miteinader vergleichen.Wie viele Datensätze ist bei dir "sehr viele Datenätze"? Mehr als 1 Tausend? Mehr als 10 Tausend? Mehr als 100 Tausend? Mehr als 1 Million?
Gruß,
Peter
Hallo ooAlbert,
das Transaktionslog einfach mal bei irgendeinem Befehl ausschalten geht nicht. Aber Du kannst die Identitätsspalte vor dem Import in die Tabelle setzen und dadurch gleich beim bulk insert hochzählen lassen. Das bekommst Du über eine Formatdatei gebacken.
Gruß, Mad Max
das Transaktionslog einfach mal bei irgendeinem Befehl ausschalten geht nicht. Aber Du kannst die Identitätsspalte vor dem Import in die Tabelle setzen und dadurch gleich beim bulk insert hochzählen lassen. Das bekommst Du über eine Formatdatei gebacken.
Gruß, Mad Max
Moin Moin
Ich habe dein immer noch nicht verstanden was du eigentlich Vorhast bzw. wo genau das Problem liegt.
Du machst scheinbar einen Datenimport. OK soweit.
Du hast dich bereits in die Insert Problematik bei massenimportrn eingelesen (Tablock).
Genau so wie das evtl. Leeren der Tabellen ("TRUNCATE TABLE" um z.B. den Import zu wiederholen).
Wenn ich dich richtig verstehe funktioniert das ja wohl auch wie gewünscht.
Denn das DB design erfolgt immer vor dem Import. Nicht hinterher oder wärend.
Gruß L.
Das andere Wiederherstellungsprofil hat zwar etwas weniger benötigt wie der vollständige Wiederherstellungsmodus aber immer noch viel merh als der Einfache.
interessant.Ich habe dein immer noch nicht verstanden was du eigentlich Vorhast bzw. wo genau das Problem liegt.
Du machst scheinbar einen Datenimport. OK soweit.
Du hast dich bereits in die Insert Problematik bei massenimportrn eingelesen (Tablock).
Genau so wie das evtl. Leeren der Tabellen ("TRUNCATE TABLE" um z.B. den Import zu wiederholen).
Wenn ich dich richtig verstehe funktioniert das ja wohl auch wie gewünscht.
das nachträgliche setzen einer ID Spalte ist wie schon beschreiben ebenfalls sehr grenzwertig.
Das hat auch nichts mit der Verfügbaren Rechenleistung zu tun, sondern mit den Protokollen.
Ganz genau. Aber das ist eher ein PEBCAK problem.Das hat auch nichts mit der Verfügbaren Rechenleistung zu tun, sondern mit den Protokollen.
Denn das DB design erfolgt immer vor dem Import. Nicht hinterher oder wärend.
Gruß L.