MySQL 5.7 macet selamanya "menunggu kunci level meja"

1

Saya memiliki server web dengan database MySQL. Itu memegang beberapa database yang melayani berbagai proyek saya. Sejak Memutakhirkan Ubuntu ke 16,04, ini memberi saya banyak masalah secara umum. Pertanyaan ini secara khusus adalah tentang situasi di mana tabel dikunci dengan kunci level meja tanpa alasan yang jelas mengapa kunci tersebut tidak dihapus dengan cepat.

Saya memiliki banyak kueri macet seperti:

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

Setelah beberapa saat mencari-cari dan tidak menemukan apa-apa di performance_schemaseperti table_handlesdan metadata_locks, saya tidak menemukan banyak.

Setelah beberapa saat saya menyadari bahwa itu terjadi karena mysqldumpproses yang saya lakukan secara berkala untuk membuang satu tabel tertentu. Saya memiliki selusin mysqldumpproses macet (dipanggil oleh cron) seperti ini:

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

(nama tabel tertutup untuk privasi)

Setelah membunuh mysqldumpproses, kunci meja dihapus dan semuanya kembali normal.

Tetapi mengapa mysqldumpproses mengunci sesuatu dan tidak bekerja?

Igor Chudov
sumber
Berapa ukuran database dan tabel ini? Sudahkah Anda melakukan sesuatu yang sederhana seperti menjalankan dump MySQL dari semua database, menghapusnya dari server MySQL Anda dan kemudian mengimpornya lagi untuk melihat bahwa semuanya beres?
JakeGould
Apakah tabel inventaris InnoDB atau MyISAM?
Michael - sqlbot
Igor - bagaimana kamu mengatasinya?
OhadR

Jawaban:

3

Penyebab: kunci level tabel selama mysqldump yang menjadi alasan kelambatan karena tabel menggunakan mesin MyISAM

Resolusi: Konversi MyISAM ke Innodb, untuk penguncian level baris,

ALTER TABLE 'table_name' ENGINE=INNODB;

Lihat: kunci myisam selama mysqldump

Koustuv Chatterjee
sumber