Problem: Ich habe eine SQL Server-Datenbank auf einem 1-TB-Laufwerk. Das Protokoll wächst nicht über 5 MB hinaus, selbst wenn das Protokoll MAXSIZE
viel größer als 5 MB ist.
Fehler erhalten:
Das Transaktionsprotokoll für die Datenbank 'Temp' ist voll. Informationen dazu, warum Speicherplatz im Protokoll nicht wiederverwendet werden kann, finden Sie in der Spalte log_reuse_wait_desc in sys.databases
Fragen:
- Wie behebe ich das?
- Warum passiert dies?
Code:
CREATE DATABASE Temp ON PRIMARY(
NAME = Temp
, FILENAME = 'C:\\Temp.mdf'
, SIZE = 2MB
, FILEGROWTH = 10%)
LOG ON (
NAME = Temp_Log
, FILENAME = 'C:\\Temp.ldf'
, SIZE = 1MB, MAXSIZE = 70MB
, FILEGROWTH = 10%)
Ergebnis von select name, log_reuse_wait_desc from sys.databases where name = 'temp';
:
name, log_reuse_wait_desc
Temp, NICHTS
Zusätzliche Information:
- SQL Server Manager sagt
maxsize = 5mb
undrestricted growth
- Wiederherstellungsmodus
Simple
- Die Datenbank verarbeitet Hunderte einzelner SQL-Anweisungen wie ein Datenintegrationstool
Aktualisierte Zusatzinformationen:
Wenn die SQL-Anweisung direkt im SQL Server-Manager ausgeführt wird, wird sie erfolgreich erstellt und verursacht keine Fehler bei der Implementierung. Wenn die Anweisung create database hingegen mit System.Data.SqlClient und genau der von ihr erstellten Syntax progmatisch ausgeführt wird die Datenbank mit allen Standardeinstellungen. Ich muss zusätzlich alter database Anweisungen angeben, um das richtige Verhalten zu erreichen.
Code zum Ausführen von Abfragen:
public void AcuConvert()
{
using (DestD)
{
SqlCommand command = new SqlCommand();
DestD.Open();
command.Connection = DestD;
foreach (var item in Entity.SqlDestinationQueries.ToList())
{
command.CommandText = item.Query;
command.ExecuteNonQuery();
}
foreach (var item in Entity.SystemQueries.ToList())
{
command.CommandText = item.Query.Replace("@Sys", SysD.Database);
command.ExecuteNonQuery();
}
foreach (var item in Entity.InsertQueries.ToList())
{
command.CommandText = item.Query.Replace("@Source", SourceD.Database); ;
command.ExecuteNonQuery();
}
}
}
quelle
Antworten:
Um das Problem kurzfristig zu beheben, vergrößern Sie die Protokolldatei manuell, da dies ohnehin die beste Vorgehensweise ist.
Wenn die Protokolldatei mehrere GB umfasst, vergrößern Sie sie in Schritten von 1 bis 4 GB, um dorthin zu gelangen.
Wenn Sie nicht wissen, wie groß es werden wird, würde ich empfehlen, mindestens 1 GB-Schritte zu verwenden. Dies ist ein Blockierungsvorgang, daher sollte er nach Möglichkeit während einer geringen Nutzungsdauer durchgeführt werden.
Um herauszufinden, warum Ihr Problem auftritt, überprüfen Sie das SQL-Fehlerprotokoll auf Fehler und nicht nur auf die Fehlermeldung der fehlgeschlagenen Anweisung. Möglicherweise liegt ein Fehler vor, der angibt, warum es nicht wachsen konnte.
Sie können auch auf dem Aktivitätsmonitor nachsehen, worauf die Sitzungen mit Problemen warten. Klicken Sie mit der rechten Maustaste auf die Instanz in SQL Server Management Studio (SSMS) und klicken Sie auf "Aktivitätsmonitor". Sobald Sie es geöffnet haben, überprüfen Sie die Blockierungskette (Blocked By und Head Blocker) und den Wartetyp, um festzustellen, was das Problem verursacht.
Um festzustellen, warum die Datenbank mit einer MAXSIZE von 70 erstellt wird, führen Sie Profiler aus, um die Anweisung CREATE DATABASE abzufangen. Dadurch erfahren Sie, welche Abfrage ausgeführt wird, damit Sie wissen, ob SQL die richtige Abfrage erhält oder nicht.
quelle