kissling
Goto Top

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:

sql-fehlermeldung

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

Content-Key: 43942332598

Url: https://administrator.de/contentid/43942332598

Printed on: May 18, 2024 at 22:05 o'clock

Member: SeaStorm
SeaStorm Sep 30, 2023 at 18:03:28 (UTC)
Goto Top
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
Member: Kissling
Kissling Sep 30, 2023 updated at 18:41:16 (UTC)
Goto Top
Hallo SeaStorm,

Danke für die Nachricht.

Das mit dem Größenlimit ist klar.
Nach dem ersten Einlesen war die DB ca. 3GB groß.

Da sollte eigentlich das Limit von 10GB ausreichend sein.

Frage: wie mache ich ein Rebuild?

Am Anfang haben ja alle Daten locker in de DB locker reingepasst.
Nur nach dem Löschen aller Daten mit Truncate und wiederhohltem Einlesen bekomme ich nun die Fehlermeldung.

Ronald
Member: SeaStorm
SeaStorm Sep 30, 2023 at 19:27:25 (UTC)
Goto Top
Member: Kissling
Kissling Sep 30, 2023 at 21:49:55 (UTC)
Goto Top
@SeaStorm

vielen Dank für die Hinweise.

Scheint genau der richtige Ansatz zu sein.

Nach ausführen von
DECLARE @str VARCHAR(500)
SET @str = 'exec sp_spaceused ''?'''  
EXEC sp_msforeachtable @command1=@str

habe ich festgestellt, dass 2 meiner Tabellen fast den ganzen Speicherplatz belegen!


Danach habe ich das Script aus:
https://www.mssqltips.com/sqlservertip/1177/determining-space-used-for-a ...
ausgeführt.

Leider bekomme ich folgende Fehlermeldung:
ALTER INDEX ALL ON [combit_DMSG].[dbo].[GDPRLog] REBUILD
Eine neue Seite für die combit_DMSG-Datenbank konnte nicht belegt werden, weil in der Dateigruppe "PRIMARY" nicht genügend Speicherplatz verfügbar ist. Speicherplatz kann durch Löschen von Objekten in der Dateigruppe, Hinzufügen von Dateien zur Dateigruppe oder Festlegen der automatischen Vergrößerung für vorhandene Dateien in der Dateigruppe gewonnen werden.
-

Was kann ich nun tun?
Wahrscheinlich ist die Datenbank so voll das das Script die Reindexierung nicht ausführen kann!

Gruß Ronald
Member: SeaStorm
SeaStorm Oct 01, 2023 at 05:21:03 (UTC)
Goto Top
Lösche den Index, DB shrink, erstelle den Index wieder
Member: ukulele-7
ukulele-7 Oct 01, 2023 at 17:51:00 (UTC)
Goto Top
Wenn du eine zweite MSSQL Instanz zur Hand hast kannst du ja mal spaßeshalber eine der Tabellen da rein kopieren und dir dann die Größe der Tabelle anschauen.
Member: NordicMike
NordicMike Oct 02, 2023 at 05:02:25 (UTC)
Goto Top
#1 für eine zweite SQL Instanz. Ich würde die ganze Datenbank testweise auf eine neue Instanz umziehen, damit wird überflüssiges automatisch nicht mitgenommen.
Member: Kissling
Kissling Oct 02, 2023 at 08:57:27 (UTC)
Goto Top
@NordicMike

was meinst Du mit umziehen?

Einen ähnlichen gedanke hatte ich auch.
Ich habe mir tatsächlich eine Vollversion von SQL-Server installiert.
Dann habe ich eine Sicherung am Orginalserver angelegt.

Dann habe ich einen neue Datenbank mit gleichem Namen am neuen Server angelegt.
Nun wollte ich die Sicherung (*.bak) einlesen.
ABER:
Die Datensicherung wir mir beim Auswählen des Sicherungsverzeichnisses nicht angezeigt?????
Was mus ich da tun?
Ich verstehe das nicht!

Ich habe dann die Server deaktiviert und die Dateien aud dem DATA-Verzeichnis rüberkopiert.
Jetzt habe ich zwar keine Größenbeschränkung, aber die Datenbank ist immer noch viel zu groß.

Fu...
Member: ukulele-7
ukulele-7 Oct 02, 2023 at 10:20:26 (UTC)
Goto Top
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:
INSERT INTO tbl_new SELECT * FROM Verbindungsserver.dbo.tbl_alt
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.