Mam bazę danych SQL Server 2005 dla deweloperów, która jest 30 GB kopii na żywo. Usunęliśmy niektóre dane, które nie są potrzebne w dev, co zmniejsza zużycie miejsca na dane do 20 GB. Mamy więc około 33% niewykorzystane.
Muszę odzyskać miejsce, co pozwoli nam mieć drugi dev DB na serwerze (w oparciu o wersję skróconą); nie mogę jednak odzyskać miejsca, wykonałem następujące czynności:
Początkowy rozmiar pliku
SMS2_Data
to 30 GB.DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)
śledzony przez
DBCC SHRINKFILE (N'SMS2_Data' , 19500)
Brak przyjemności. Próbowałem wykonać kopię zapasową, tworząc nową bazę danych o niskim rozmiarze początkowym, a następnie przywracając, bez radości, ponieważ rozmiar początkowy zostaje zastąpiony. Próbowałem także:
ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000)
Ten błąd, mówiąc:
MODYFIKACJA PLIKU nie powiodła się. Określony rozmiar jest mniejszy niż aktualny rozmiar.
Próbowałem 20800, a następnie kontynuowałem do 29000 (29 GB) i nadal nie mogę tego zmienić.
Zrobiłem skurcz, a następnie zmieniłem tryb odzyskiwania z FULL
na SIMPLE
i z powrotem. Brak przyjemności.
Myślałem, że ma to związek z niektórymi TEXT
dziedzinami. Mamy około 6 w całym systemie. Więc jako test upuściłem je wszystkie, a następnie zmniejszyłem plik i nadal nie wprowadziłem żadnych zmian.
Pozostała tylko opcja ponownego importowania danych do innej bazy danych. Nie jest to praktyczne, ponieważ należałoby to zrobić na bazie danych na żywo, która niesie ze sobą zbyt duże ryzyko. Częściowo regularnie pobieramy kopię bazy danych na żywo i zastępujemy program / test. Mamy około 500 stołów. Chciałbym zrobić to w sposób, który nie miałby ryzyka eksportu danych do nowej bazy danych.
Próbowałem przenieść dane do innego pliku i skopiowałem wszystkie oprócz 5% danych. To skłoniło mnie do upuszczenia wszystkich kolumn tekstowych.
Serwer działa w trybie zgodności 90, ale jest to SP2. Zrobiłem teraz 3 razy: reindeksuj wszystkie tabele, kopię zapasową bazy danych, zmniejsz plik, zmniejsz bazę danych. Wciąż nie ma radości.
EXECUTE sp_spaceused
zwroty:
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
źródło
Zakładam, że masz jeden plik bazy danych o logicznej nazwie SMS2_Data. W bazie danych znajduje się również jeden lub więcej plików dziennika transakcji.
Masz wyzwanie, którego nie można naprawić w bieżącej kopii bazy danych. Ważną informacją, którą podajesz, jest to, że „oryginalny rozmiar pliku bazy danych wynosi 30 GB”. Niestety, ten plik nie może być zmniejszony mniejszy niż oryginalny rozmiar.
Jak już zauważyłeś, SHRINKDB i SHRINKFILE nie dają ci tego, czego chcesz. Te polecenia są zgodne z regułą zmniejszania mniejszą niż oryginalna. Można więc zmniejszyć bazę danych tylko do pierwotnego rozmiaru i nie mniejszego.
Kopia zapasowa bazy danych i przywracanie do istniejącej, mniejszej bazy danych również nie działa. Podczas przywracania bazy danych pliki bazy danych są przywracane do rozmiarów plików, jakie były podczas tworzenia kopii zapasowej. Ponadto model odzyskiwania (prosty, pełny itp.) Nie ma związku z tym problemem.
I ostatni punkt złych wieści. Możesz rozważyć dodanie innych, mniejszych plików bazy danych do bazy danych, przenieść wszystkie dane z pliku 30 GB, a następnie upuścić. Niestety to również nie zadziała, ponieważ nie można usunąć początkowego pliku z bazy danych.
Najlepszym rozwiązaniem jest więc skopiowanie danych do innej bazy danych. Masz tutaj kilka opcji i być może już je znasz. Pierwszym krokiem jest utworzenie nowej bazy danych o rozmiarze mniejszym niż rozmiar danych. Następnie możesz zwiększyć rozmiar bazy danych do wymaganego rozmiaru.
Możesz rozważyć SSIS jako sposób przesyłania danych z jednej bazy danych do drugiej. Znajdziesz zadanie kopiowania bazy danych, które ci pomoże. Możesz wykonać następujące kroki:
Zobacz dodatkowe informacje na temat zadania bazy danych transferu SSIS .
źródło
Niektóre nieużywane miejsce w bazie danych jest normalne.
Jeśli masz wiele dużych rekordów (powiedzmy długie łańcuchy), może być dużo nieużywanego miejsca na stronach danych (ponieważ jeden rekord zwykle nie jest dzielony między strony).
Inną sprawą jest współczynnik wypełnienia - początkowo indeksy klastrowe nie są tworzone w 100% pełne, aby uniknąć podziału strony (kosztowna operacja) przy kolejnych wstawieniach.
Jeśli wiele danych zostanie usuniętych z bazy danych, przestrzeń poprzednio zajmowana przez te dane nie zostanie automatycznie odzyskana - pozostanie przydzielona do tabeli.
Spróbuj wywołać
DBCC DBREINDEX (table_name, '', 100)
każdą tabelę w bazie danych - przebuduje wszystkie indeksy ze współczynnikiem wypełnienia 100%, dzięki czemu dane zostaną umieszczone tak zwięźle, jak to możliwe. Następnie spróbuj ponownie zmniejszyć bazę danych.źródło
Odkryłem, że zmniejszenie bazy danych SQL Server może być kłopotliwe. Czujesz, że musisz zrobić piosenkę i rutynowo tańczyć.
Jest to proces, przez który zwykle przechodzę:
Backup Shrink database Kopia zapasowa dziennika Shrink i pliki bazy danych oddzielnie. Backup Powtarzaj, aż w końcu się zmniejszy.
Musiałem wykonać ten proces kilka razy do trzech razy, aby w końcu zadziałało. Mieliśmy bazę danych o wielkości ponad 68 GB, z czymś 98% niewykorzystanego miejsca. Kilkakrotnie przeszedłem tę procedurę śpiewania i tańca, ale w końcu zmniejszyła się do poniżej 1 GB.
źródło
Chciałbym najpierw zmniejszyć początkowy rozmiar pliku mdf do 29 000 MB, a następnie do 28 000, wykrywając zbliżone trafienie.
Nie można oczekiwać zmniejszenia rozmiaru pliku bazy danych o 30% poprzez usunięcie 30% danych.
Możesz oszacować, o ile nieużywanego miejsca w bazie danych
w kontekście swojej bazy danych (użyj nazwy użytkownika;)
Czy możesz opublikować wynik jej wykonania?
Aktualizacja:
opublikowałem na nim moje powiązane pytanie:
źródło