Mam jedną tabelę MySQL korzystającą z mechanizmu przechowywania InnoDB; zawiera około 2 mln wierszy danych. Kiedy usuwałem wiersze danych z tabeli, nie zwalniało to przydzielonego miejsca na dysku. Również rozmiar pliku ibdata1 nie zmniejszył się po uruchomieniu optimize table
polecenia.
Czy istnieje sposób na odzyskanie miejsca na dysku z MySQL?
Jestem w złej sytuacji; ta aplikacja działa w około 50 różnych lokalizacjach i obecnie problem braku miejsca na dysku pojawia się prawie we wszystkich z nich.
mysql
innodb
delete-row
Sumit Deo
źródło
źródło
innodb_file_per_table
jest wyłączony. Dobra wiadomość jest taka, że ta opcja jeston
domyślna w najnowszych wersjach MySQL.Odpowiedzi:
MySQL nie zmniejsza rozmiaru ibdata1. Zawsze. Nawet jeśli użyjesz
optimize table
do zwolnienia zajmowanego miejsca z usuniętych rekordów, wykorzysta je później.Alternatywą jest skonfigurowanie serwera do użycia
innodb_file_per_table
, ale będzie to wymagało utworzenia kopii zapasowej, usunięcia bazy danych i przywrócenia. Pozytywną stroną jest to, że plik .ibd tabeli jest zmniejszany po rozszerzeniuoptimize table
.źródło
ALTER TABLE t ENGINE=INNODB
na istniejącej tabeli. " Oznacza to, że można włączyć tę funkcję, „przekonwertować” istniejące tabele na osobny plik InnoDB za pomocą polecenia ALTER TABLE, a następnie ZOPTYMALIZOWAĆ tabelę, aby zmniejszyć jej rozmiar. Jednak kiedy skończysz, musisz dowiedzieć się, jak usunąć (ogromny) źródłowy plik InnoDB ...Po prostu miałem ten sam problem.
Dzieje się tak, że nawet jeśli upuścisz bazę danych, innodb nadal nie zwolni miejsca na dysku. Musiałem wyeksportować, zatrzymać mysql, usunąć pliki ręcznie, uruchomić mysql, utworzyć bazę danych i użytkowników, a następnie zaimportować. Dzięki Bogu miałem tylko 200 MB wierszy, ale zaoszczędziłem 250 GB pliku innodb.
Niepowodzenie z założenia.
źródło
Jeśli nie używasz innodb_file_per_table , odzyskanie miejsca na dysku jest możliwe, ale dość żmudne i wymaga znacznej ilości przestojów.
Jak jest dość dogłębne - ale wklejony odpowiednią część poniżej.
Pamiętaj, aby zachować również kopię schematu w swoim zrzucie.
źródło
Dziesięć lat później miałem ten sam problem. Rozwiązałem to w następujący sposób:
To wszystko :)
źródło
Innym sposobem rozwiązania problemu odzyskiwania miejsca jest utworzenie wielu partycji w ramach partycji opartych na tabelach i wartościach i po prostu upuszczenie / obcięcie partycji, aby odzyskać miejsce, co zwolni miejsce używane przez całe dane przechowywane w określonej partycji.
Będą potrzebne pewne zmiany w schemacie tabeli, gdy wprowadzisz partycjonowanie tabeli, takie jak - unikalne klucze, indeksy, aby uwzględnić kolumnę partycji itp.
źródło
Rok temu napotkałem ten sam problem w wersji mysql5.7, a ibdata1 zajmował 150 GB. więc dodałem cofnij obszary tabel
Wykonaj kopię zapasową Mysqldump
Zatrzymaj usługę mysql
Usuń wszystkie dane z katalogu danych
Dodaj poniżej parametr cofnij przestrzeń tabel w bieżącym my.cnf
Uruchom mysql service
store mysqldump backup
Problem rozwiązany !!
źródło
Istnieje kilka sposobów na odzyskanie miejsca na dysku po usunięciu danych z tabeli dla silnika MySQL Inodb
Jeśli nie używasz innodb_file_per_table od początku, zrzucenie wszystkich danych, usunięcie całego pliku, ponowne utworzenie bazy danych i ponowne zaimportowanie danych jest jedyną drogą (sprawdź odpowiedzi FlipMcF powyżej)
Jeśli używasz innodb_file_per_table, możesz spróbować
źródło