Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQL Server - Logging verhindern oder stark minimieren?

Frage Entwicklung Datenbanken

Mitglied: ooAlbert

ooAlbert (Level 1) - Jetzt verbinden

30.01.2012, aktualisiert 13:43 Uhr, 6125 Aufrufe, 10 Kommentare

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
Mitglied: Logan000
30.01.2012 um 14:03 Uhr
Moin Moin

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.
Bitte warten ..
Mitglied: ooAlbert
30.01.2012 um 14:11 Uhr
Nun je nach dem was man da tut explodiert das Log und die Anweisung wird nicht ausgeführt. Außerdem dauern die Anweisungen viel zu lange durch die ganze Protokoliererei. 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. Das ist natürlich sinnfrei.
Der "TRUNCATE TABLE" Befehl hat dazu 1 Sekunde benötigt und keine erkennbare Vergrößerung des Logs verursacht.

Das andere Wiederherstellungsprofil hat zwar etwas weniger benötigt wie der vollständige Wiederherstellungsmodus aber immer noch viel merh als der Einfache.
Bitte warten ..
Mitglied: Pjordorf
30.01.2012 um 16:52 Uhr
Hallo,

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?

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
Bitte warten ..
Mitglied: ooAlbert
30.01.2012 um 17:22 Uhr
Das bedeutet, das das Log den gesamten verfügbaren Speicher auf dem Server einnimmt und es daher zu einem Abbruch der Anweisung kommt.

Die Tabelle hat keinerlei Verweise oder Abhängigkeiten und es handelt sich aktuell um 21 Millionen Datensätze. Die wenn sie drin sind ca. 2GB einnehmen. Nur sobald man die Daten Manipuliert werden unmengen Log Informationen erzeugt, die dann je nach dem alles unheimlich aufhalten oder dazuführen, das aben der Speicher erschöpft ist.

Beispielswesie war ein Bulk Insert ohne Tablock nicht durchführbar, 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.

Abfragen gehen übrigens recht flott, unter 5 Sekunden.
Bitte warten ..
Mitglied: MadMax
30.01.2012 um 18:03 Uhr
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
Bitte warten ..
Mitglied: Logan000
31.01.2012 um 08:53 Uhr
Moin Moin

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.
Denn das DB design erfolgt immer vor dem Import. Nicht hinterher oder wärend.

Gruß L.
Bitte warten ..
Mitglied: ooAlbert
31.01.2012 um 12:33 Uhr
Das mit der Format Datei hab ich mal ausprobiert, das funktioniert fast Fehlerfrei. Nur steigt der Vorgang bei ca. 1 Mio. Zeilen aus mit dem Fehler:

Meldung 8152, Ebene 16, Status 14, Zeile 5
Zeichenfolgen- oder Binärdaten würden abgeschnitten.

Bis zu der Grenze sind auch keine erkennbaren Fehler in der Tabelle, wenn man den Import da stopt.

Mache ich den Import wie bisher nur ohne ID Spalte, geht das fehlerfrei.

So sieht die Formatdatei übrigens aus:

10.0
11
1 SQLCHAR 0 0 ";" 1 Spalte1 ""
2 SQLCHAR 0 0 ";" 2 Spalte2 ""
3 SQLCHAR 0 0 ";" 3 Spalte3 ""
...
11 SQLCHAR 0 0 "\n" 11 Spalte11 ""


Ich hab auch mal den Bereich der SPlaten an die Tatsächlichen Größen der Datentypen angepasst, selbes Ergebnis.
Bitte warten ..
Mitglied: ooAlbert
31.01.2012 um 17:17 Uhr
So ich hab jetzt den Fehler gefunden, eine Spalte hatte doch ein Zeichen mehr als angegeben und deshalb kam es zum Abbruch mit der Meldung Deshalb hab ich die Datentypen auf "Max" gestellt und hab dann die Längen der einstelen Werte ausgeben lassen.

Jetzt hätte ich aber mal eine zusätzliche Frage kann ich über den "Insert" direkt schon Indizes erzeugen oder muss das nachher passieren, so mach ich das nämlich momentan?

Beispielswesie: create index idx_sp1 on tab1(sp1);
Bitte warten ..
Mitglied: MadMax
31.01.2012 um 17:59 Uhr
Hallo ooAlbert,

mit insert fügst Du Zeilen in die Tabelle ein, aber erzeugst keinen Index.

Und das "create index ..." kannst Du vorher oder nachher laufen lassen.

Gruß, Mad Max
Bitte warten ..
Mitglied: ooAlbert
01.02.2012 um 10:55 Uhr
Ich hab jetzt mal das Definieren der Indizes direkt nach dem Create Table gesetzt und dann importiert. Das hat dann 2min länger gedauert als wenn ich es erst nach dem Import definie.
für den SQL Server ist es vermutlich egal wo man das macht
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(2)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Windows Server
gelöst MS-SQL Server lokale Authentifizierung - Logging (5)

Frage von ThomasAnderson zum Thema Windows Server ...

Windows Server
gelöst SQL-Server Datenbanksicherung inkl. Benutzerberechtigungen dafür? (4)

Frage von 1410640014 zum Thema Windows Server ...

Windows 10
gelöst Installationsproblem sql server 2014 auf windos 10 rechner (23)

Frage von jensgebken zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (10)

Frage von 1410640014 zum Thema Backup ...