Jak zmniejszyć / wyczyścić plik ibdata1 w MySQL

Używam MySQL w localhost jako "narzędzia zapytań" do wykonywania statystyk w R, to znaczy za każdym razem, gdy uruchamiam skrypt R, tworzę nową bazę danych( A), tworzę nową tabelę (B), importuję dane do B, wysyłam zapytanie, aby uzyskać to, czego potrzebuję, a następnie upuszczam B i upuszczam A.

U mnie działa dobrze, ale zdaję sobie sprawę, że rozmiar pliku ibdata szybko rośnie, nic nie zapisałem w MySQL, ale plik ibdata1 Przekroczył już 100 MB.

Używam mniej więcej domyślnego ustawienia MySQL czy jest jakiś sposób na to, żebym mógł automatycznie zmniejszyć / wyczyścić plik ibdata1 po określonym czasie?

Author: Bill Karwin, 2010-08-11

8 answers

To, że ibdata1 nie kurczy się, jest szczególnie irytującą cechą MySQL. Plik ibdata1 nie może zostać zmniejszony, chyba że usuniesz wszystkie bazy danych, usuniesz pliki i przeładujesz zrzut.

Ale możesz skonfigurować MySQL tak, aby każda tabela, w tym jej indeksy, były przechowywane jako osobny plik. W ten sposób ibdata1 nie będzie rosła tak duża. Zgodnie z komentarzem Billa Karwina jest to domyślnie włączone od wersji 5.6.6 MySQL.

To było jakiś czas temu. Jednak, aby skonfigurować serwer tak, aby używał oddzielnych plików dla każdej tabeli, musisz zmienić my.cnf, aby włączyć to:
[mysqld]
innodb_file_per_table=1

Http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

Jak chcesz odzyskać spację z ibdata1 Musisz usunąć plik:

  1. wykonaj mysqldump wszystkich baz danych, procedur, wyzwalaczy itp Z wyjątkiem mysql i performance_schema} baz danych
  2. wyrzuć wszystkie bazy danych Z wyjątkiem powyższych 2 bazy danych
  3. Zatrzymaj mysql
  4. Usuń ibdata1 i ib_log pliki
  5. Start mysql
  6. Restore from dump

Po uruchomieniu MySQL w kroku 5 Pliki ibdata1 i ib_log zostaną odtworzone.

Teraz możesz iść. Po utworzeniu nowej bazy danych do analizy, tabele będą znajdować się w oddzielnych plikach ibd*, a nie w ibdata1. Pliki ibd* zostaną usunięte, ponieważ zwykle opuszczasz bazę danych wkrótce po tym.

Http://dev.mysql.com/doc/refman/5.1/en/drop-database.html

Prawdopodobnie widziałeś to:
http://bugs.mysql.com/bug.php?id=1341

Za pomocą polecenia ALTER TABLE <tablename> ENGINE=innodb lub OPTIMIZE TABLE <tablename> można wyodrębnić dane i indeksy stron z ibdata1 do osobnych plików. Jednak ibdata1 nie zmniejszy się, chyba że wykonasz powyższe kroki.

Jeśli chodzi o information_schema, to nie jest konieczne ani możliwe, aby upuścić. W rzeczywistości jest to tylko kilka widoków tylko do odczytu, a nie stoły. I nie ma żadnych plików powiązanych z nimi, nawet katalogu bazy danych. informations_schema używa pamięci db-engine i jest upuszczany i regenerowany po zatrzymaniu / ponownym uruchomieniu mysqld. Zobacz https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .

 727
Author: John P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:32

Po usunięciu tabel innodb, MySQL nie zwalnia miejsca w pliku ibdata, dlatego ciągle rośnie. Te pliki prawie nigdy się nie kurczą.

Jak zmniejszyć istniejący plik ibdata:

Http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html

Możesz wykonać skrypt i zaplanować uruchomienie skryptu po określonym czasie, ale dla konfiguracji opisanej powyżej wydaje się, że wiele przestrzeni tabletu jest łatwiejszym rozwiązaniem.

Jeśli używasz opcji konfiguracyjnej innodb_file_per_table, tworzysz wiele tablespaces. Oznacza to, że MySQL tworzy oddzielne pliki dla każdej tabeli zamiast jednego udostępnionego pliku. Te oddzielne pliki przechowywane w katalogu bazy danych i są usuwane po usunięciu tej bazy danych. Powinno to usunąć potrzebę zmniejszania / usuwania plików ibdata w Twoim przypadku.

Więcej informacji na temat wielu tablespaces:

Http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

 33
Author: titanoboa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 09:06:40

Dodanie do odpowiedzi Jana P,

Dla systemu linux, kroki 1-6 można wykonać za pomocą następujących poleceń:

  1. mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
  2. DROP DATABASE [database_name];
  3. sudo /etc/init.d/mysqld stop
  4. sudo rm /var/lib/mysql/ibdata1
    sudo rm /var/lib/mysql/ib_logfile (i usuń wszystkie inne pliki ib_logfile, które mogą być nazwane ib_logfile0, ib_logfile1 itd...)
  5. sudo /etc/init.d/mysqld start
  6. create database [database_name];
  7. mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

Ostrzeżenie: te instrukcje spowodują utratę innych baz danych, jeśli masz inne bazy danych na tej instancji mysql. Upewnij się, że kroki 1,2 i 6,7 zostały zmodyfikowane tak, aby obejmowały wszystkie bazy danych, które chcesz zachować.

 32
Author: Vinay Vemula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-05 16:52:05

Jeśli używasz silnika InnoDB do (niektórych) tabel MySQL, prawdopodobnie napotkałeś już problem z jego domyślną konfiguracją. Jak zapewne zauważyłeś w katalogu danych MySQL (w Debian/Ubuntu - / var / lib / mysql) znajduje się plik o nazwie 'ibdata1'. Przechowuje prawie wszystkie dane InnoDB (nie jest to dziennik transakcji) instancji MySQL i może stać się dość duży. Domyślnie ten plik ma początkowy rozmiar 10Mb i automatycznie się rozszerza. Niestety, według projektu Pliki danych InnoDB nie mogą być zmniejszane. Dlatego usuwa, obcina, krople itp. nie odzyskuje miejsca używanego przez plik.

Myślę, że można tam znaleźć dobre wyjaśnienie i rozwiązanie:

Http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/

 14
Author: Vik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 09:38:09

Jeśli twoim celem jest monitorowanie wolnego miejsca w MySQL i nie możesz zatrzymać MySQL, aby zmniejszyć plik ibdata, pobierz go za pomocą poleceń statusu tabeli. Przykład:

MySQL > 5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $20}'

MySQL

mysqlshow --status myInnodbDatabase myTable | awk '{print $35}'

Następnie porównaj tę wartość z plikiem ibdata:

du -b ibdata1

Źródło: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

 6
Author: Cyno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 15:03:19

W nowej wersji mysql-serwer przepis powyżej zmiażdży bazę danych "mysql". W starej wersji działa. W nowych niektórych tabelach przełącza się na tabelę typu INNODB, a w ten sposób można je uszkodzić. Najprostszym sposobem jest zrzucenie wszystkich baz danych, odinstalowanie mysql-server, add in pozostał mój."cnf": {]}

[mysqld]
innodb_file_per_table=1


erase all in /var/lib/mysql
install mysql-server
restore users and databases
 4
Author: adjustable_wrench,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 13:38:33

Szybko skrypt procedury zaakceptowanej odpowiedzi w bash:

#!/usr/bin/env bash
DATABASES="$(mysql -e 'show databases \G' | grep "^Database" | grep -v '^Database: mysql$\|^Database: binlog$\|^Database: performance_schema\|^Database: information_schema' | sed 's/^Database: //g')"
mysqldump --databases $DATABASES -r alldatabases.sql && echo "$DATABASES" | while read -r DB; do
    mysql -e "drop database \`$DB\`"
done && \
    /etc/init.d/mysql stop && \
    find /var/lib/mysql -maxdepth 1 -type f \( -name 'ibdata1' -or -name 'ib_logfile*' \) -delete && \
    /etc/init.d/mysql start && \
    mysql < alldatabases.sql && \
    rm -f alldatabases.sql

Zapisz jako purge_binlogs.sh i uruchom jako root.

mysql, information_schema, performance_schema (i binlog katalog).

Zakłada, że masz w /root/.my.cnf credendials administratora i że Twoja baza danych znajduje się w domyślnym katalogu /var/lib/mysql.

Możesz również wyczyścić logi binarne po uruchomieniu tego skryptu, aby odzyskać więcej miejsca na dysku za pomocą:

PURGE BINARY LOGS BEFORE CURRENT_TIMESTAMP;
 3
Author: Pierre-Alexis de Solminihac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 16:55:56

Jak już wspomniano, nie można zmniejszyć ibdata1 (aby to zrobić trzeba zrzucić i odbudować), ale często nie ma takiej potrzeby.

Używanie autoextend (prawdopodobnie najczęstsze ustawienie rozmiaru) ibdata1 prealokuje pamięć masową, rosnącą za każdym razem, gdy jest prawie pełna. To sprawia, że zapisuje się szybciej, ponieważ miejsce jest już przydzielone.

Po usunięciu danych nie zmniejsza się, ale przestrzeń wewnątrz pliku jest oznaczona jako nieużywana. Teraz po wstawieniu nowych danych ponownie wykorzysta puste miejsce w pliku przed / align = "left" /

Więc będzie rosnąć tylko wtedy, gdy naprawdę potrzebujesz tych danych. Jeśli nie potrzebujesz miejsca na inną aplikację, prawdopodobnie nie ma powodu, aby ją zmniejszyć.

 -1
Author: steveayre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-21 17:57:33