Z jakiegoś powodu wszystkie tabele InnoDB na moim serwerze MySQL są wyświetlane jako pofragmentowane, gdy uruchamiam mysqltuner. Serwer zainstalowałem dopiero kilka godzin temu (na OSX Lion) i ma w nim mnóstwo świeżych danych zaimportowanych z plików wsadowych.
Próbowałem przekonwertować wszystkie tabele w jednej bazie danych na MYISAM i na pewno zmniejszyła się liczba pofragmentowanych tabel. Dziwne jednak, gdy tylko przekonwertowałem te tabele z powrotem na InnoDB, fragmentaryczna liczba stolików ponownie wzrosła. Jest to sprzeczne z moimi dotychczasowymi badaniami, które sugerują, że bieganie ALTER TABLE table_name ENGINE=INNODB;
powinno naprawić fragmentację.
Po trochę Googlingu pobiegłem:
SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0
Który rzekomo zawiera listę wszystkich pofragmentowanych tabel (faktycznie zwraca taką samą liczbę wyników jak wyniki mysqltuner dla liczby pofragmentowanych tabel). Każdy pojedynczy wpis ma dokładnie ten sam numer w data_free_MB
kolumnie (obecnie 7.00000000).
Czy to rzeczywiście prawdziwy problem, czy coś, co mysqltuner robi źle? Jeśli to problem, jak to naprawić?
EDYTOWAĆ
Coraz bardziej podejrzewam, że jestem idiotą i że fragmentacja 7 MB dotyczy całego pliku, a nie każdej tabeli. Czy ktoś może potwierdzić, czy tak by było?
[!!] Total fragmented tables: 2314
co, jestem pewien, wskazuje na problem (z podwójnymi czerwonymi wykrzyknikami)Odpowiedzi:
Zgodnie z powyższymi komentarzami nie wszystkie dane wyjściowe z narzędzia sqltuner wskazują na błędy. O ile skrypt nie mówi wyraźnie, że jest to problem, zwykle w następnym wierszu, a następnie sugestie dotyczące naprawy, to jest to tylko element informacyjny.
źródło
Po włączeniu innodb_file_per_table wszystko, co zrobiłeś, to skonfigurowanie protokołu, aby nowe tabele InnoDB były tworzone w
.ibd
pliku zewnętrznym . Wszystkie tabele InnoDB, które wcześniej utworzyłeś, są nadal osadzone w ibdata1.Przy wyłączonym pliku innodb_file_per_table przy każdym uruchomieniu
wszystko, co robi, to dołącza dane i strony indeksu tabeli do ibdata1. To sprawi, że tabela będzie istnieć na sąsiadujących stronach i usunie fragmentację. Wadą jest to, że ibdata1 rośnie szybko.
REKOMENDACJE
Musisz wyeksportować wszystkie dane, usunąć ibdata1, ib_logfile0, ib_logfile1 i załadować ponownie.
Napisałem, jak i dlaczego to zrobić
Oct 29, 2010
: Howto: Wyczyść mysql silnik pamięci InnoDB?Jul 05, 2012
: Przenieś ibdata1, ustaw ścieżkę pliku innodb_data_file_pathAKTUALIZACJA 2012-08-15 12:05 EDT
Możesz zajrzeć do samego skryptu mysqltuner.pl. IMHO Myślę, że używa starej formuły do pomiaru fragmentacji. Upewnij się, że masz najnowszą wersję mysqltuner.
Jeśli chodzi o pomiar fragmentacji tabel InnoDB przechowywanych zewnętrznie, napisałem o tym post 11 kwietnia 2012 r. (Zobacz aktualizację na dole z 19 kwietnia 2012 r.)
źródło
innodb_file_per_table
do pliku conf przed uruchomieniem serwera i ponownym importowaniem). Wcześniej otrzymywałem różnego rodzaju błędy InnoDB (naprawdę złe rodzaje ... te, które oznaczały, że musiałem biegać zinnodb_force_recovery
poziomem 6 tylko po to, aby wydostać dane!), I wszelkiego rodzaju „data pliku dziennika jest w przyszłość!' błędy. Wygląda na to, że już się skończyły, ale wciąż mam sporo rozdrobnionych stołów. Po prostu będę miał na to oko, jeszcze raz dziękuję za wkład