Saya kira ALTER TABLE sedang menunggu di kunci metadata, dan itu tidak benar-benar mulai mengubah apa pun.
Apa itu kunci metadata?
Saat Anda menjalankan kueri apa pun seperti SELECT/INSERT/UPDATE/DELETE terhadap tabel, itu harus memperoleh kunci metadata. Kueri tersebut tidak saling memblokir. Sejumlah kueri jenis itu dapat memiliki kunci metadata.
Tetapi pernyataan DDL seperti CREATE/ALTER/DROP/TRUNCATE/RENAME atau event CREATE TRIGGER atau LOCK TABLES, harus memperoleh eksklusif kunci metadata. Jika ada transaksi yang masih menyimpan kunci metadata, pernyataan DDL akan menunggu.
Anda dapat menunjukkan ini. Buka dua jendela terminal dan buka klien mysql di setiap jendela.
- Jendela 1:
CREATE TABLE foo ( id int primary key );
- Jendela 1:
START TRANSACTION;
-
Jendela 1:
SELECT * FROM foo;
-- tidak masalah tabel tidak memiliki data -
Jendela 2:
DROP TABLE foo;
-- perhatikan itu menunggu -
Jendela 1:
SHOW PROCESSLIST;
+-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+ | 679 | root | localhost | test | Query | 0 | starting | show processlist | 0 | 0 | | 680 | root | localhost | test | Query | 4 | Waiting for table metadata lock | drop table foo | 0 | 0 | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
Anda dapat melihat tabel drop menunggu kunci metadata tabel. Hanya menunggu. Berapa lama akan menunggu? Sampai transaksi di window 1 selesai. Akhirnya waktu akan habis setelah lock_wait_timeout
detik (secara default, ini disetel ke 1 tahun ).
-
Jendela 1:
COMMIT;
-
Jendela 2:Perhatikan itu berhenti menunggu, dan segera menjatuhkan meja.
Jadi apa yang bisa Anda lakukan? Pastikan tidak ada transaksi jangka panjang yang memblokir ALTER TABLE Anda. Bahkan transaksi yang menjalankan SELECT cepat terhadap tabel Anda sebelumnya akan menahan kunci metadatanya hingga transaksi dilakukan.