SQL Datenbank verkleinern - Speicher freigeben
Hallo zusammen,
Ich habe ein Problem mit einer SQL Datenbank.
Hintergund:
Ich muss wärend einer Software-Umstellungsphase wiederholt Daten in eine Datenbank einlesen.
Im Moment arbeite ich noch mit SQLEXRESS!
Die Datenbank bzw. einige der Tabellen muss ich immer wieder löschen und neu einlesen.
(Bis alles so funktioniert wie ich es brauche)
Inzwischen ist die SQL-Datenbank auf 10GB angewachsen.
Ich habe natürlich bereits die Batenbank versucht zu verkleinern.
Also:
Datenbank\Tasks\verkleinern\Datenbank
und
Datenbank\Tasks\verkleinern\Dateien
Ich habe auch eine Sicherung angelegt und wiederhergestellt.
Leider alles ohne Ergebnis.
Der ferfügbare Speicherplatz bleibt bei 3,6 MB.
Ich habe auch nach Lösungen gesucht und ein Script gefunden das die Datenbank verkleinern soll.
Hier der Code:
ALTER DATABASE Datenbank_Name
SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE (Datenbank_Name, 1)
DBCC SHRINKFILE (Datenbank_Name_log, 1)
GO
ALTER DATABASE Datenbank_Name
SET RECOVERY FULL
Meiner Meinung nach muss irgendwo was stehen bleiben was den Speicherplatz nicht freigibt.
Noch ein Hinweis:
Wenn ich in meiner Applikation einen Datensatz löschen will bekomme ich folgende Meldung:
Kann mir bitte jemand sagen wie ich die Datenbank verkleinern kann?
Also Speicher freigeben und Datenbankgröße auf die real benutzte Größe reduzieren.
Vielen Dank
Ronald
Ich habe ein Problem mit einer SQL Datenbank.
Hintergund:
Ich muss wärend einer Software-Umstellungsphase wiederholt Daten in eine Datenbank einlesen.
Im Moment arbeite ich noch mit SQLEXRESS!
Die Datenbank bzw. einige der Tabellen muss ich immer wieder löschen und neu einlesen.
(Bis alles so funktioniert wie ich es brauche)
Inzwischen ist die SQL-Datenbank auf 10GB angewachsen.
Ich habe natürlich bereits die Batenbank versucht zu verkleinern.
Also:
Datenbank\Tasks\verkleinern\Datenbank
und
Datenbank\Tasks\verkleinern\Dateien
Ich habe auch eine Sicherung angelegt und wiederhergestellt.
Leider alles ohne Ergebnis.
Der ferfügbare Speicherplatz bleibt bei 3,6 MB.
Ich habe auch nach Lösungen gesucht und ein Script gefunden das die Datenbank verkleinern soll.
Hier der Code:
ALTER DATABASE Datenbank_Name
SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE (Datenbank_Name, 1)
DBCC SHRINKFILE (Datenbank_Name_log, 1)
GO
ALTER DATABASE Datenbank_Name
SET RECOVERY FULL
Meiner Meinung nach muss irgendwo was stehen bleiben was den Speicherplatz nicht freigibt.
Noch ein Hinweis:
Wenn ich in meiner Applikation einen Datensatz löschen will bekomme ich folgende Meldung:
Kann mir bitte jemand sagen wie ich die Datenbank verkleinern kann?
Also Speicher freigeben und Datenbankgröße auf die real benutzte Größe reduzieren.
Vielen Dank
Ronald
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 43942332598
Url: https://administrator.de/contentid/43942332598
Ausgedruckt am: 25.11.2024 um 03:11 Uhr
9 Kommentare
Neuester Kommentar
Hi
Mach mal einen Rebuild aller Indexe gefolgt von einem Shrink.
Aber: Wie gross ist denn die DB tatsächlich? Wenn sie nunmal 10GB an Daten hat, dann ist das einfach so.
Der Shrink bewirkt lediglich das RESERVIERTER Platz freigegeben wird.
Wenn du Daten in die DB schmeisst dann reserviert das System diesen Platz. Löscht du die Datensätze aus der DB, dann bleibt der Platz reserviert um später wieder verwendet werden zu können.
Ein Shrink bringt also nur was wenn die DB irgendwann mal gewachsen und in der zwischenzeit Platz wieder freigegeben wurde.
An der DB gibt es eine Grösseneinstellung. Wenn du die Fix auf eine grösse eisntellst und nicht auf Automatisch vergrössern setzt, dann wächst sie halt nicht über diese gesetzte Grösse raus.
Ausserdem hat Express ein grössenlimit von 10GB
Mach mal einen Rebuild aller Indexe gefolgt von einem Shrink.
Aber: Wie gross ist denn die DB tatsächlich? Wenn sie nunmal 10GB an Daten hat, dann ist das einfach so.
Der Shrink bewirkt lediglich das RESERVIERTER Platz freigegeben wird.
Wenn du Daten in die DB schmeisst dann reserviert das System diesen Platz. Löscht du die Datensätze aus der DB, dann bleibt der Platz reserviert um später wieder verwendet werden zu können.
Ein Shrink bringt also nur was wenn die DB irgendwann mal gewachsen und in der zwischenzeit Platz wieder freigegeben wurde.
An der DB gibt es eine Grösseneinstellung. Wenn du die Fix auf eine grösse eisntellst und nicht auf Automatisch vergrössern setzt, dann wächst sie halt nicht über diese gesetzte Grösse raus.
Ausserdem hat Express ein grössenlimit von 10GB
https://www.mssqltips.com/sqlservertip/1367/sql-server-script-to-rebuild ...
kannst dir ja mal anschauen was da wie viel Platz braucht:
https://www.mssqltips.com/sqlservertip/1177/determining-space-used-for-a ...
kannst dir ja mal anschauen was da wie viel Platz braucht:
https://www.mssqltips.com/sqlservertip/1177/determining-space-used-for-a ...
Es gibt mehrere Möglichkeiten die Datenbank "umzuziehen", aber ich würde eigentlich erstmal eine Tabelle nur kopieren wollen. Denn wenn du jetzt die Datenbankdatei (mdf und ldf) einfach rüber schiebst / kopierst, hat ja alles die selbe Größe. Du kannst auf dem Produktivsystem mal das Erstellungsscript für eine fragwürdige Tabelle erstellen, auf dem Zielsystem ausführen und dann einen Verbindungsserver auf dem Zielsytem einrichten. Dann reicht eigentlich ein:
Dabei werden dann nur die Daten kopiert und eben nicht alles 1:1 übernommen. Der Index wird neu aufgebaut aber eben alles ohne Overhead durch zwischenzeitliche Transaktionen. Wenn beide Tabellen dann etwa gleich groß sind kannst du auf deinem Produktivsystem gar nichts mehr verkleinern.
INSERT INTO tbl_new SELECT * FROM Verbindungsserver.dbo.tbl_alt