MySQL 5.7 utknął na zawsze „czekając na blokadę poziomu stołu”

1

Mam serwer WWW z bazą danych MySQL. Posiada kilka baz danych obsługujących moje różne projekty. Od momentu uaktualnienia Ubuntu do 16.04 dało mi to wiele problemów. To pytanie dotyczy konkretnie sytuacji, w której stół jest zablokowany blokadą poziomu stołu bez wyraźnego powodu, dla którego zamek nie został szybko usunięty.

Mam wiele zablokowanych zapytań, takich jak:

581723  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21601'
581724  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21592'
581725  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21602'
581726  algebrainc_ro   localhost   algebrainc  Query   10309   Waiting for table level lock    SELECT\n  *\nFROM inventory\nWHERE inventory_id = '21596'
581729  algebrainc_ro   localhost   algebrainc  Query   10306   Waiting for table level lock    SELECT inventory_id, ebay_title FROM inventory WHERE ebay_id = '32999992936'
581730  algebrainc  localhost   algebrainc  Query   10282   Waiting for table level lock    SELECT \n  complete_status status,\n  ebay_transactions.inventory_id,\n  ebay_transactions.ebay_id, \n  quantity, purchase_price, \n  ebay_title \nFROM ebay_transactions, inventory \nWHERE \n  ebay_transactions.inventory_id = inventory.inventory_id \n  AND created_date > date_add( now(), interval -7 day )\nORDER BY \n  created_date

Po chwili szukania i szukania niczego performance_schema Jak na przykład table_handles i metadata_locks, Nie znalazłem wiele.

Po chwili zdałem sobie sprawę, że tak się dzieje mysqldump procesy, które robię okresowo, aby zrzucić jedną konkretną tabelę. Utknąłem tuzin mysqldump procesy (zwane cron), takie jak te:

ichudov   1178  0.0  0.0  29004  3248 pts/46   Ss+  20:24   0:00 mysqldump -ualgebrainc -px xxxxxxxx algebrainc XXXXXXXX_posts
ichudov   1394  0.0  0.0  29004   900 pts/26   Ss+  Jun23   0:00 mysqldump -ualgebrainc -px xxxxxxxx algebrainc XXXXXXXX_posts
ichudov   2537  0.0  0.0  29004   920 pts/22   Ss+  Jun24   0:00 mysqldump -ualgebrainc -px xxxxxxxx algebrainc XXXXXXXX_posts

(nazwa tabeli zamaskowana dla prywatności)

Po zabiciu mysqldump procesy, blokady stołu zostały usunięte i wszystko wróciło do normy.

Ale dlaczego mysqldump procesy blokują i nie działają?

Igor Chudov
źródło
Jakie są rozmiary tych baz danych i tabel? Czy zrobiłeś coś tak prostego, jak uruchomienie zrzutu MySQL wszystkich baz danych, usunięcie ich z serwera MySQL, a następnie ponowne ich zaimportowanie, aby zobaczyć, że to wszystko usuwa?
JakeGould
Czy tabela inwentaryzacji InnoDB lub MyISAM?
Michael - sqlbot
Igor - jak to wymyśliłeś?
OhadR

Odpowiedzi:

2

Przyczyna: blokada poziomu tabeli podczas mysqldump, co jest powodem powolności, ponieważ tabela używa silnika MyISAM

Rozkład: Konwertuj MyISAM do Innodb, aby zablokować poziom wierszy,

ALTER TABLE 'table_name' ENGINE=INNODB;

Odnosić się: blokada myisam podczas mysqldump

Infra DBA
źródło