Czy są jakieś pułapki / rzeczy, które musisz wiedzieć podczas zmiany z MyISAM na InnoDB

Jeden z moich projektów używa silnika MyISAM w MySQL, ale rozważam zmianę go na InnoDB, ponieważ potrzebuję wsparcia transakcji tu i ówdzie.

  • Na co powinienem spojrzeć lub rozważyć przed zrobieniem tego?
  • Czy mogę po prostu zmienić silnik, czy dane powinny być do niego przygotowane?
Author: Jrgns, 2008-10-22

6 answers

Tak absolutnie, Jest wiele rzeczy, powinieneś przetestować swoją aplikację bardzo dokładnie:

  • transakcje mogą zostać zablokowane i muszą zostać powtórzone. Tak jest (w niektórych okolicznościach) nawet w przypadku transakcji z automatycznym zleceniem, która wstawia tylko jeden wiersz.
  • Użycie dysku prawie na pewno wzrośnie
  • obciążenie we/wy podczas zapisu prawie na pewno wzrośnie
  • zachowanie indeksowania ulegnie zmianie, ponieważ InnoDB używa indeksów klastrowych - może to być korzystny efekt w niektórych przypadkach
  • Twoja strategia tworzenia kopii zapasowych będzie miała wpływ. Rozważ to uważnie.

Sam proces migracji będzie musiał być starannie zaplanowany, ponieważ zajmie to dużo czasu, jeśli masz dużo danych (w tym czasie Dane będą albo tylko odczytywane, albo całkowicie niedostępne - sprawdź!)

 8
Author: MarkR,
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
2008-10-22 10:31:11

Jest jedno wielkie zastrzeżenie. Jeśli podczas zapisu wystąpi jakakolwiek awaria sprzętu (lub podobna), InnoDB spowoduje uszkodzenie tabel.

MyISAM również, ale mysqlcheck --auto-repair je naprawi. Wypróbowanie tego z InnoDB tables nie powiedzie się. Tak, to z doświadczenia.

Oznacza to, że aby korzystać z InnoDB, musisz mieć dobry, regularny plan tworzenia kopii zapasowych danych.

 7
Author: Jeff Davis,
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
2009-06-26 16:04:00

Inne uwagi:

InnoDB Nie realokuje wolnego miejsca w systemie plików po upuszczeniu tabeli/bazy danych lub usunięciu rekordu, można to rozwiązać poprzez "dumping and importing" lub ustawienie innodb_file_per_table=1 w my.cnf.

Dodawanie / usuwanie indeksów w dużej tabeli InnoDB może być dość kłopotliwe, ponieważ blokuje bieżącą tabelę, tworzy tymczasową ze zmienionymi indeksami i wstawia dane-wiersz po wierszu. Istnieje plugin z Innobase , ale działa tylko dla MySQL 5.1

InnoDB jest również znacznie bardziej intensywny w pamięci, proponuję mieć tak dużą zmienną innodb_buffer_pool_size, na jaką pozwala pamięć serwera (70-80% powinno być bezpiecznym zakładem). Jeśli twoim serwerem jest UNIX/Linux, rozważ zmniejszenie zmiennej sysctl vm.swappiness do 0 i użyj innodb_flush_method=O_DIRECT, aby uniknąć podwójnego buforowania. Zawsze sprawdzaj, czy podczas przełączania tych wartości naciśniesz opcję swap.Zawsze możesz przeczytać więcej na Percona blog , który jest świetny.

Możesz również uruchomić mysqlbackup z --single-transaction --skip-lock-tables i nie mieć blokad tabel podczas gdy kopia zapasowa jest rozpoczynam.

W każdym razie InnoDB jest świetny, nie pozwól, aby niektóre pułapki Cię zniechęciły.

 5
Author: Laurynas Pečiūra,
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
2008-10-23 08:28:30

Tylko zmiana tabeli i ustawienie silnika powinno być w porządku.

  • jedną z ważniejszych jest to, że select count(*) from MyTable jest dużo wolniej w InnoDB niż MyISAM.
  • wartości auto_increment zostaną zresetowane do najwyższej wartości w tabeli + 1 po ponownym uruchomieniu serwera-może to powodować Śmieszne problemy, jeśli masz bałagan db z niektórymi deletami.
  • optymalne ustawienia serwera będą się różnić od głównie MyISAM db.
  • Upewnij się, że rozmiar innodb plik jest wystarczająco duży, aby pomieścić wszystkie dane lub zostaniesz ukrzyżowany przez ciągłą realokację po zmianie silników tabel.
 3
Author: J.D. Fitz.Gerald,
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
2008-10-22 15:55:00

Jeśli zamierzasz używać InnoDB jako sposobu uzyskiwania współbieżnych zapytań, będziesz chciał ustawić innodb_file_trx_commit=1, aby odzyskać wydajność. OTOH, jeśli chcesz ponownie zakodować swoją aplikację, aby była świadoma transakcji, wtedy decyzja o tym ustawieniu będzie częścią ogólnego przeglądu wydajności wymaganego dla ustawień InnoDB.

Inną ważną rzeczą, na którą należy uważać, jest to, że InnoDB nie obsługuje indeksów pełnotekstowych, ani wstawiania opóźnionych. Ale MyISAM nie obsługuje referential uczciwość. :-)

Możesz jednak przenosić tylko te tabele, których potrzebujesz. Zrobiłem to. Małe tabele (do kilku tysięcy wierszy) można często zmieniać w locie, nawiasem mówiąc.

 1
Author: staticsan,
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
2008-10-28 05:53:23

Parametry wydajności mogą być różne, więc być może będziesz musiał mieć oko na obciążenie.

Dane będą w porządku.

 0
Author: Greg,
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
2008-10-22 10:26:17