Co to jest plik ibdata1 w moim katalogu / var / lib / mysql?

32

Logując się do panelu sterowania Webmin, zauważyłem, że praktycznie całe moje miejsce na dysku jest pełne. Szukałem dziesięciu największych plików / katalogów w moim systemie i odkryłem, że plik o nazwie ibdata1 zajmuje około 94 GB miejsca. Znajduje się w moim katalogu / var / lib / mysql.

Co robi ibdata1? Czy mogę to bezpiecznie usunąć? Zakładam, że to jakiś zrzut, ale to tylko zgadywanka.

James
źródło

Odpowiedzi:

38

Plik ibdata1jest systemowym obszarem tabel dla infrastruktury InnoDB.

Zawiera kilka klas informacji istotnych dla InnoDB

  • Strony danych tabeli
  • Tabele indeksu stron
  • Słownik danych
  • Dane kontrolne MVCC
    • Cofnij spację
    • Wycofywanie segmentów
  • Podwójny bufor zapisu (strony zapisane w tle, aby uniknąć buforowania systemu operacyjnego)
  • Wstaw bufor (zmiany w indeksach pomocniczych)

Zwróć uwagę na miejsce ibdata1 we Wszechświecie InnoDB (po prawej stronie)

Architektura InnoDB

Możesz oddzielić dane i strony indeksowe ibdata1, włączając opcję innodb_file_per_table . Spowoduje to, że każda nowo utworzona tabela InnoDB będzie przechowywać dane i strony indeksowe w .ibdpliku zewnętrznym .

Przykład

  • datadir to / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;, tworzy /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table włączony, Strony danych / indeksu przechowywane w /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table wyłączony, Strony danych / indeksu przechowywane w ibdata1

Niezależnie od tego, gdzie przechowywana jest tabela InnoDB, funkcjonalność InnoDB wymaga szukania metadanych tabeli oraz przechowywania i pobierania informacji MVCC w celu zapewnienia zgodności z ACID i izolacji transakcji .

Oto moje poprzednie artykuły na temat oddzielania danych tabeli i indeksów od ibdata1

CO ZROBIC NASTEPNIE

Możesz nadal przechowywać wszystko w ibdata1, ale to sprawia, że ​​robienie migawek LVM jest prawdziwą nudą (moja osobista opinia).

Musisz użyć postu My StackOverflow i zmniejszyć plik na stałe.

Uruchom to zapytanie:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Dzięki temu dowiesz się, ile straconego miejsca można odzyskać po zastosowaniu czyszczenia InnoDB.

RolandoMySQLDBA
źródło
Dzięki za wkład. Od tego czasu mój limit miejsca na dysku został całkowicie wypełniony - czy będę potrzebować wolnego miejsca? Zwracam uwagę, że twój oryginalny post na SO wspomina o zrobieniu zrzutu SQL, ale prawdopodobnie stworzyłoby to plik o wielkości ~ 90 GB, do którego nie ma dokąd pójść.
James
mysqldump będzie tylko logiczną reprezentacją stron danych, a nie indeksów. Aby zrzucić dane, będziesz potrzebować innego dysku, być może zdalnego serwera.
RolandoMySQLDBA
9
Zwraca 91.25350952148438 dla mnie jako SpaceToReclaim. Czy to jest w megabajtach? procent? bajty?
Izaak
Wiem, że to jest za stare. Ale dla każdego, kto przyjdzie tutaj z problemem, musisz zastąpić numer 94dowolnym rozmiarem ibdata1pliku w GB, a on SpaceToReclaimda ci rozmiar w GB.
anupsabraham
8

Ten plik ibdata1nie jest ibdatali zawiera wszystkie Twoje bazy danych InnoDB. Jeśli go usuniesz, stracisz wszystkie swoje dane.

Aby dowiedzieć się, jak sobie z tym poradzić, zobacz Jak zmniejszyć / wyczyścić plik ibdata1 w MySQL .

Michael Hampton
źródło
2

Jeśli użyjesz innodb jako silnika MySQL domyślnie zapisze wszystkie twoje bazy danych w ibdata1. Istnieją również pliki dziennika ib_logfile0 i ib_logfile1. Nie usuwaj tych plików.

silviud
źródło
Co to jest usunąć ten plik na moim serwerze?
Frank