O MySQL 5.7 ficou para sempre “aguardando bloqueio de nível de tabela”

1

Eu tenho um servidor web com um banco de dados MySQL. Ele contém vários bancos de dados que atendem meus vários projetos. Desde o upgrade do Ubuntu para 16.04, isso me causou muitos problemas em geral. Esta questão é especificamente sobre uma situação em que uma tabela é bloqueada com um bloqueio no nível da tabela sem nenhum motivo óbvio pelo qual o bloqueio não seja removido rapidamente.

Eu tenho muitas dúvidas assim:

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

Depois de um tempo pesquisando e procurando por nada em performance_schema , como table_handles e metadata_locks , não encontrei muita coisa.

Depois de um tempo, percebi que isso acontece devido a mysqldump dos processos que faço periodicamente para despejar uma tabela específica. Eu tive uma dúzia de mysqldump processos presos (chamados pelo cron) como estes:

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

(nome da tabela mascarado para privacidade)

Depois de matar mysqldump processos, os bloqueios de tabela foram removidos e tudo voltou ao normal.

Mas por que mysqldump processa o bloqueio e não funciona?

    
por Igor Chudov 26.06.2016 / 06:25

1 resposta

2

Causa: trava no nível da tabela durante o mysqldump, que é o motivo da lentidão, já que a tabela está usando o mecanismo MyISAM

Resolução: Converta MyISAM para Innodb, para bloqueio em nível de linha,

ALTER TABLE 'table_name' ENGINE=INNODB;

Consulte: myisam lock durante o mysqldump

    
por 02.08.2016 / 07:31

Tags