Usuwanie tabeli MySQL z oczekującymi transakcjami

10

Czy istnieje sposób na usunięcie tabeli lub bazy danych InnoDB z oczekującymi transakcjami w MySQL (najlepiej na poziomie systemu plików)?

Co się stało:

Używam MySQL 5.5.28 i pobiegłem, LOAD DATA INFILE…aby zaimportować ogromny zestaw danych (300 mln wierszy) do tabeli InnoDB. Nie korzystałem set autocommit = 0;wcześniej. Niestety mysqldzostał zatrzymany w połowie importu.

Po ponownym uruchomieniu mysqlpróbuje wycofać transakcję, wypełniając dziennik systemowy komunikatami takimi jak to:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: Oczekiwanie na zakończenie 1 aktywnych transakcji

Problem polega na tym, że wycofywanie działa już ponad 25 godzin, podczas których mysqldnie akceptuje żadnych połączeń gniazd.

Nie mogę po prostu usunąć /var/lib/mysql/*i zacząć od zera, ponieważ na tym komputerze są też inne bazy danych / tabele InnoDB. Problematyczna tabela jest jednak jedyną tabelą w osobnej bazie danych. Usunięcie całej tabeli lub całej bazy danych nie stanowi problemu, ponieważ mogę później ponownie zaimportować wszystkie dane.

dasup
źródło

Odpowiedzi:

8

Nic nie możesz naprawdę zrobić, ponieważ wycofywanie odbywa się za pomocą obszaru tabel UNDO w ibdata1 , który powinien ogromnie wzrosnąć.

Jeśli zabijesz proces mysqld i zrestartujesz mysql, po prostu przejdzie tam, gdzie zostało przerwane, w ramach cyklu odzyskiwania po awarii.

ZASTRZEŻENIE: Nie ponosi odpowiedzialności za utratę danych

To, co możesz zrobić, może spowodować utratę danych dla innych tabel, ale jest coś, co możesz zrobić, aby obejść normalny cykl odzyskiwania po awarii InnoDB.

Dostępna jest opcja uruchamiania o nazwie innodb_force_recovery , która pozwala ominąć różne etapy odzyskiwania po awarii programu InnoDB.

Zgodnie z dokumentacją MySQL na temat wymuszania odzyskiwania InnoDB , oto ustawienia i ich efekty:

1 (SRV_FORCE_IGNORE_CORRUPT)

Pozwól serwerowi działać, nawet jeśli wykryje uszkodzoną stronę. Spróbuj sprawić, aby SELECT * FROM tbl_name przeskakiwał uszkodzone rekordy indeksu i strony, co pomaga w zrzucaniu tabel.

2 (SRV_FORCE_NO_BACKGROUND)

Zapobiegaj uruchomieniu głównego wątku. Jeśli awaria wystąpi podczas operacji czyszczenia, ta wartość odzyskiwania zapobiega temu.

3 (SRV_FORCE_NO_TRX_UNDO)

Nie uruchamiaj wycofywania transakcji po przywróceniu po awarii.

4 (SRV_FORCE_NO_IBUF_MERGE)

Zapobiegaj operacjom scalania bufora wstawiania. Jeśli spowodują awarię, nie rób ich. Nie obliczaj statystyk tabeli.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

Nie patrz na dzienniki cofania podczas uruchamiania bazy danych: InnoDB traktuje nawet niekompletne transakcje jako zatwierdzone.

6 (SRV_FORCE_NO_LOG_REDO)

Nie należy powtarzać dziennika przewijania w związku z odzyskiwaniem.

Przy zmianach transakcyjnych ukrytych w dziennikach UNDO i REDO ryzykujesz

  • utrata danych przeznaczonych do zapisu
  • przechowywanie danych przeznaczonych do usunięcia

Jeśli oczekujesz złych efektów ubocznych, wykonaj kopię zapasową całego pliku / var / lib / mysql i umieść go gdzieś na wypadek, gdybyś chciał skopiować ibdata1, ib_logfile0 i ib_logfile1 i ponów normalne odzyskiwanie.

Jeśli mysql jest w pełni włączony w jednym z trybów

  • mysqldump wszystkie dane oprócz tabeli obrażeń
  • zamknij mysql
  • usuń wszystko z / var / lib / mysql oprócz / var / lib / mysql / mysql
  • uruchom mysql
  • ponownie załaduj mysqldump

UWAGA: Upewnij się, że wykonałeś kopię zapasową wszystkiego !!!

Mam nadzieję, że to pomoże !!!

RolandoMySQLDBA
źródło
1

W tym tygodniu miałem podobną sytuację.

Po czterech iteracjach przywracania pełnej kopii zapasowej na serwerze testowym i próbach upuszczenia, usunięcia lub zabicia tabel przy pomocy gigantycznych transakcji oczekujących, w końcu dotarliśmy do piątkowego popołudnia i postanowiliśmy po prostu pozwolić, aby działało. W ciągu trzech dni transakcja zakończyła się nieznacznym obciążeniem serwera, a baza danych była w porządku. Co było znacznie lepsze niż jakakolwiek ręczna operacja na plikach .frm i tabelach mysql, które próbowały i zakończyły się niepowodzeniem.

Moje rozwiązanie: nie usuwaj go . Zezwól na zakończenie oczekujących transakcji, nawet jeśli musisz odłożyć inne operacje na kilka dni, znaleźć gdzieś miejsce na dysku lub pozwolić serwerowi slave na obciążenie.

Andrew Lorien
źródło