Ich habe einen lang laufenden Prozess, der eine Transaktion für die gesamte Dauer offen hält.
Ich habe keine Kontrolle darüber, wie dies ausgeführt wird.
Da eine Transaktion für die gesamte Dauer offen gehalten wird, kann SQL Server beim Füllen des Transaktionsprotokolls die Größe der Protokolldatei nicht erhöhen.
Der Prozess schlägt also mit dem Fehler fehl "The transaction log for database 'xxx' is full"
.
Ich habe versucht, dies zu verhindern, indem ich die Größe der Transaktionsprotokolldatei in den Datenbankeigenschaften erhöht habe, erhalte jedoch den gleichen Fehler.
Ich bin mir nicht sicher, was ich als nächstes versuchen soll. Der Prozess läuft mehrere Stunden, daher ist es nicht einfach, Versuch und Irrtum zu spielen.
Irgendwelche Ideen?
Wenn jemand interessiert ist, ist der Prozess ein Organisationsimport in Microsoft Dynamics CRM 4.0.
Es gibt viel Speicherplatz, wir haben das Protokoll im einfachen Protokollierungsmodus und haben das Protokoll vor dem Start des Prozesses gesichert.
- = - = - = - = - UPDATE - = - = - = - = -
Vielen Dank für die bisherigen Kommentare. Folgendes hat mich zu der Annahme geführt, dass das Protokoll aufgrund der offenen Transaktion nicht wachsen würde:
Ich erhalte die folgende Fehlermeldung ...
Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases
Also ging ich nach diesem Rat zu " log_reuse_wait_desc column in sys.databases
" und es hatte den Wert " ACTIVE_TRANSACTION
".
Laut Microsoft: http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx
Das bedeutet folgendes:
Eine Transaktion ist aktiv (alle Wiederherstellungsmodelle). • Zu Beginn der Protokollsicherung ist möglicherweise eine Transaktion mit langer Laufzeit vorhanden. In diesem Fall erfordert das Freigeben des Speicherplatzes möglicherweise eine weitere Protokollsicherung. Weitere Informationen finden Sie unter "Langfristig aktive Transaktionen" weiter unten in diesem Thema.
• Eine Transaktion wird zurückgestellt (nur SQL Server 2005 Enterprise Edition und spätere Versionen). Eine zurückgestellte Transaktion ist effektiv eine aktive Transaktion, deren Rollback aufgrund einer nicht verfügbaren Ressource blockiert ist. Informationen zu den Ursachen für zurückgestellte Transaktionen und zum Verschieben aus dem zurückgestellten Zustand finden Sie unter Zurückgestellte Transaktionen.
Habe ich etwas falsch verstanden?
- = - = - = - UPDATE 2 - = - = - = -
Der Prozess wurde gerade mit einer anfänglichen Protokolldateigröße von 30 GB gestartet. Dies dauert einige Stunden.
- = - = - = - Endgültiges UPDATE - = - = - = -
Das Problem wurde tatsächlich dadurch verursacht, dass die Protokolldatei den gesamten verfügbaren Speicherplatz belegt. Beim letzten Versuch habe ich 120 GB freigegeben und es hat immer noch alles verbraucht und ist letztendlich gescheitert.
Ich wusste nicht, dass dies zuvor geschah, da der Prozess, wenn er über Nacht ausgeführt wurde, bei einem Fehler zurückgesetzt wurde. Diesmal konnte ich die Größe der Protokolldatei vor dem Rollback überprüfen.
Vielen Dank für Ihre Eingabe.
Antworten:
Ist dies ein einmaliges Skript oder ein regelmäßig auftretender Job?
In der Vergangenheit habe ich für spezielle Projekte, die vorübergehend viel Speicherplatz für die Protokolldatei benötigen, eine zweite Protokolldatei erstellt und diese riesig gemacht. Sobald das Projekt abgeschlossen ist, haben wir die zusätzliche Protokolldatei entfernt.
quelle
Um dieses Problem zu beheben, ändern Sie das Wiederherstellungsmodell in " Einfach" und dann " Dateiprotokoll verkleinern"
1. Datenbankeigenschaften> Optionen> Wiederherstellungsmodell> Einfach
2. Datenbankaufgaben> Verkleinern> Dateien> Protokoll
Getan.
Überprüfen Sie anschließend die Größe Ihrer Datenbankprotokolldatei unter Datenbankeigenschaften> Dateien> Datenbankdateien> Pfad
So überprüfen Sie das vollständige SQL Server-Protokoll: Öffnen Sie die Protokolldatei-Anzeige unter SSMS> Datenbank> Verwaltung> SQL Server-Protokolle> Aktuell
quelle
Ich hatte diesen Fehler einmal und es war die Festplatte des Servers, auf der nicht mehr genügend Speicherplatz vorhanden ist.
quelle
Haben Sie Autogrowth aktivieren und uneingeschränktes Dateiwachstum für die Protokolldatei aktiviert? Sie können diese über SSMS unter "Datenbankeigenschaften> Dateien" bearbeiten.
quelle
Dies ist ein Ansatz der alten Schule. Wenn Sie jedoch eine iterative Aktualisierung oder Einfügeoperation in SQL ausführen, die lange ausgeführt wird, empfiehlt es sich, regelmäßig (programmgesteuert) "Checkpoint" aufzurufen. Wenn Sie "checkpoint" aufrufen, schreibt SQL alle diese Nur-Speicher-Änderungen (schmutzige Seiten, sie werden aufgerufen) und im Transaktionsprotokoll gespeicherten Elemente auf die Festplatte. Dies hat zur Folge, dass Ihr Transaktionsprotokoll regelmäßig bereinigt wird, wodurch Probleme wie das beschriebene vermieden werden.
quelle
Im Folgenden wird das Protokoll abgeschnitten.
quelle
Wenn Ihr Datenbankwiederherstellungsmodell voll ist und Sie keinen Wartungsplan für die Protokollsicherung hatten, wird dieser Fehler angezeigt, da das Transaktionsprotokoll aufgrund von voll ist
LOG_BACKUP
.Dadurch wird jede Aktion in dieser Datenbank verhindert (z. B. Verkleinern), und das SQL Server-Datenbankmodul löst einen 9002-Fehler aus.
Um dieses Verhalten zu überwinden, empfehlen wir Ihnen, dies zu überprüfen. Das Transaktionsprotokoll für die Datenbank 'SharePoint_Config' ist aufgrund von LOG_BACKUP voll , das detaillierte Schritte zur Behebung des Problems enthält.
quelle
Ich habe den Fehler festgestellt: "Das Transaktionsprotokoll für die Datenbank '...' ist aufgrund von 'ACTIVE_TRANSACTION' voll, während alte Zeilen aus Tabellen meiner Datenbank gelöscht wurden, um Speicherplatz freizugeben. Ich habe festgestellt, dass dieser Fehler auftreten würde, wenn die Anzahl der Zeilen an Das Löschen war in meinem Fall größer als 1000000. Anstatt 1 DELETE-Anweisung zu verwenden, habe ich die Löschaufgabe mithilfe der DELETE TOP (1000000) .... -Anweisung aufgeteilt.
Beispielsweise:
anstatt diese Aussage zu verwenden:
Verwenden Sie die folgende Anweisung wiederholt:
quelle
Mein Problem wurde mit mehrfacher Ausführung von begrenzten Löschungen wie gelöst
Vor
Nach dem
quelle
Die Antwort auf die Frage besteht nicht darin, die Zeilen aus einer Tabelle zu löschen, sondern es ist der temporäre Speicherplatz, der aufgrund einer aktiven Transaktion belegt wird. Dies geschieht meistens, wenn eine Zusammenführung (Upsert) ausgeführt wird, bei der versucht wird, ein Update einzufügen und die Transaktionen zu löschen. Die einzige Möglichkeit besteht darin, sicherzustellen, dass die Datenbank auf ein einfaches Wiederherstellungsmodell eingestellt ist, und die Datei auf den maximalen Speicherplatz zu erhöhen (Hinzufügen einer weiteren Dateigruppe). Obwohl dies seine eigenen Vor- und Nachteile hat, sind dies die einzigen Optionen.
Die andere Möglichkeit besteht darin, die Zusammenführung (Upsert) in zwei Vorgänge aufzuteilen. einer, der das Einfügen vornimmt, und der andere, der das Aktualisieren und Löschen vornimmt.
quelle
Versuche dies:
Ich hoffe, es hilft.
quelle
Hier ist mein Heldencode. Ich habe mich diesem Problem gestellt. Und verwenden Sie diesen Code, um dies zu beheben.
quelle
Versuche dies:
Starten Sie nach Möglichkeit die Dienste MSSQLSERVER und SQLSERVERAGENT neu .
quelle