Ich habe eine SQL Server 2005-Entwicklerdatenbank, die eine 30-GB-Kopie von Live ist. Wir haben einige Daten gelöscht, die in dev nicht benötigt werden, wodurch der verwendete Speicherplatz für Datendateien auf 20 GB reduziert wird. Wir haben also ungefähr 33% ungenutzt.
Ich muss den Speicherplatz zurückfordern, damit wir eine zweite Entwicklungsdatenbank auf dem Server haben können (basierend auf der reduzierten Version). Ich kann den Speicherplatz jedoch nicht zurückfordern. Ich habe Folgendes getan:
Die anfängliche Größe der Datei
SMS2_Data
beträgt 30 GB.DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)
gefolgt von
DBCC SHRINKFILE (N'SMS2_Data' , 19500)
Keine Freude. Ich habe versucht, ein Backup zu erstellen, eine neue Datenbank mit einer geringen Anfangsgröße zu erstellen und dann wiederherzustellen. Keine Freude, da die Anfangsgröße überschrieben wird. Habe auch versucht:
ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000)
Dies irrte und sagte:
DATEI ÄNDERN fehlgeschlagen. Die angegebene Größe ist kleiner als die aktuelle Größe.
Ich habe 20800 ausprobiert und bin dann weiter auf 29000 (29 GB) gestiegen, und ich kann es immer noch nicht ändern.
Habe den Schrumpf gemacht und dann den Wiederherstellungsmodus von FULL
nach SIMPLE
und wieder zurück geändert . Keine Freude.
Ich dachte, das hätte mit einigen TEXT
Feldern zu tun . Wir haben ungefähr 6 im ganzen System. Als Test habe ich sie alle gelöscht und dann die Datei verkleinert und immer noch keine Änderung vorgenommen.
Die einzige verbleibende Option besteht darin, die Daten erneut in eine andere Datenbank zu importieren. Dies ist nicht praktikabel, da dies auf der Live-DB erfolgen müsste, die ein zu hohes Risiko birgt. Wir holen uns halb regelmäßig eine Kopie der Live-Datenbank und überschreiben dev / test. Wir haben ungefähr 500 Tische. Ich möchte einen Weg, der nicht das Risiko birgt, Daten in eine neue Datenbank zu exportieren.
Ich habe versucht, die Daten in eine andere Datei zu verschieben, und es wurden alle bis auf 5% der Daten kopiert. Dies hat mich veranlasst, alle Textspalten zu löschen.
Der Server befindet sich im Kompatibilitätsmodus 90, ist jedoch SP2. Ich habe jetzt die folgenden drei Schritte ausgeführt: Alle Tabellen neu indizieren, Datenbank sichern, Datei verkleinern, Datenbank verkleinern. Immer noch keine Freude.
EXECUTE sp_spaceused
kehrt zurück:
database_name database_size unallocated space
SMS2Tests 31453.94 MB 13903.16 MB
reserved data index_size unused
16545568 KB 10602264 KB 4254360 KB 1688944 KB
quelle
Ich gehe davon aus, dass Sie eine einzelne Datenbankdatei mit dem logischen Namen SMS2_Data haben. Sie haben auch eine oder mehrere Transaktionsprotokolldateien in der Datenbank.
Sie haben eine Herausforderung, die auf der aktuellen Kopie der Datenbank nicht behoben werden kann. Die wichtige Information, die Sie angeben, ist, dass die ursprüngliche Größe der Datenbankdatei 30 GB beträgt. Leider kann diese Datei nicht kleiner als ihre ursprüngliche Größe verkleinert werden.
Wie Sie bereits erfahren haben, geben SHRINKDB und SHRINKFILE Ihnen nicht das, was Sie wollen. Diese Befehle folgen der Regel, dass nicht kleiner als die ursprüngliche Größe verkleinert werden kann. Sie können eine Datenbank also nur auf die ursprüngliche Größe und nicht kleiner verkleinern.
Das Sichern und Wiederherstellen der Datenbank in einer vorhandenen, kleineren Datenbank funktioniert ebenfalls nicht. Wenn Sie eine Datenbankwiederherstellung durchführen, werden die Datenbankdateien auf die Dateigröße zurückgesetzt, die sie während der Sicherung hatten. Das Wiederherstellungsmodell (einfach, vollständig usw.) hat für dieses Problem keine Relevanz.
Und noch ein letzter Punkt mit schlechten Nachrichten. Sie können der Datenbank weitere kleinere Datenbankdateien hinzufügen, alle Daten aus der 30-GB-Datei übertragen und dann löschen. Leider funktioniert dies auch nicht, da Sie die ursprüngliche Datei nicht aus der Datenbank löschen können.
Die beste Lösung besteht also darin, die Daten in eine andere Datenbank zu kopieren. Sie haben hier einige Optionen, die Sie vielleicht bereits kennen. Der erste Schritt besteht darin, eine neue Datenbank mit einer Größe zu erstellen, die kleiner als die Datengröße ist. Anschließend können Sie die Datenbankgröße auf die erforderliche Größe erweitern.
Sie können SSIS als eine Möglichkeit betrachten, die Daten von einer Datenbank in die andere zu übertragen. Sie finden eine Kopierdatenbankaufgabe, die Ihnen weiterhilft. Sie können die folgenden Schritte ausführen:
Weitere Informationen zur Aufgabe der SSIS- Übertragungsdatenbank finden Sie hier .
quelle
Nicht genutzter Speicherplatz in der Datenbank ist normal.
Wenn Sie viele große Datensätze haben (z. B. lange Zeichenfolgen), ist möglicherweise nicht viel Speicherplatz auf den Datenseiten vorhanden (da ein Datensatz normalerweise nicht zwischen den Seiten aufgeteilt ist).
Eine andere Sache ist ein Füllfaktor - anfänglich werden Clustered-Indizes nicht zu 100% voll erstellt, um Seitenaufteilungen (eine teure Operation) beim nachfolgenden Einfügen zu vermeiden.
Wenn viele Daten aus der Datenbank gelöscht wurden, wird der zuvor von diesen Daten belegte Speicherplatz nicht automatisch zurückgefordert - er bleibt der Tabelle zugeordnet.
Versuchen Sie,
DBCC DBREINDEX (table_name, '', 100)
jede Tabelle in Ihrer Datenbank aufzurufen. Dadurch werden alle Indizes mit einem Füllfaktor von 100% neu erstellt, damit die Daten so kompakt wie möglich platziert werden. Versuchen Sie dann erneut, die Datenbank zu verkleinern.quelle
Ich habe festgestellt, dass das Verkleinern einer SQL Server-Datenbank problematisch sein kann. Es fühlt sich an, als müsste man eine Lied- und Tanzroutine machen.
Dies ist der Prozess, den ich normalerweise durchlaufe:
Backup Shrink-Datenbank Backup Shrink-Protokoll und Datenbankdateien getrennt. Backup Wiederholen, bis es endgültig schrumpft.
Ich musste diesen Vorgang einige Male bis zu dreimal durchführen, damit er endlich funktioniert. Wir hatten eine Datenbank mit einer Größe von über 68 GB und einem zu 98% nicht genutzten Speicherplatz. Ich habe diese Song-and-Dance-Routine mehrmals durchlaufen, aber sie ist schließlich auf unter 1 GB geschrumpft.
quelle
Ich hätte versucht, die anfängliche Größe der MDF-Datei zuerst auf 29.000 MB und dann auf 28.000 MB zu reduzieren, um den Treffer zu erkennen.
Es ist nicht zu erwarten, dass die Größe der Datenbankdatei durch Löschen von 30% der Daten um 30% reduziert wird.
Sie können schätzen, wie viel nicht genutzten Speicherplatz in Ihrer Datenbank durch
im Kontext Ihrer Datenbank (verwenden Sie Ihren Dateinamen;)
Können Sie das Ergebnis der Ausführung veröffentlichen?
Update:
Ich habe meine verwandte Frage darauf gepostet:
quelle