Tôi đoán ALTER TABLE đang chờ khóa siêu dữ liệu và nó thực sự không bắt đầu thay đổi bất cứ điều gì.
Khóa siêu dữ liệu là gì?
Khi bạn chạy bất kỳ truy vấn nào như CHỌN / CHÈN / CẬP NHẬT / XÓA đối với một bảng, nó phải có được một khóa siêu dữ liệu. Các truy vấn đó không chặn lẫn nhau. Bất kỳ số lượng truy vấn nào thuộc loại đó đều có thể có khóa siêu dữ liệu.
Nhưng một câu lệnh DDL như CREATE / ALTER / DROP / TRUNCATE / RENAME hoặc sự kiện CREATE TRIGGER hoặc LOCK TABLES, phải có được một độc quyền khóa siêu dữ liệu. Nếu bất kỳ giao dịch nào vẫn bị khóa siêu dữ liệu, thì câu lệnh DDL sẽ đợi.
Bạn có thể chứng minh điều này. Mở hai cửa sổ đầu cuối và mở ứng dụng khách mysql trong mỗi cửa sổ.
- Cửa sổ 1:
CREATE TABLE foo ( id int primary key );
- Cửa sổ 1:
START TRANSACTION;
-
Cửa sổ 1:
SELECT * FROM foo;
- bảng không có dữ liệu không quan trọng -
Cửa sổ 2:
DROP TABLE foo;
- nhận thấy nó đang đợi -
Cửa sổ 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 | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
Bạn có thể thấy bảng thả đang chờ khóa siêu dữ liệu bảng. Chỉ cần chờ đợi. Nó sẽ đợi bao lâu? Cho đến khi giao dịch trong cửa sổ 1 hoàn tất. Cuối cùng thì nó sẽ hết thời gian sau lock_wait_timeout
giây (theo mặc định, giá trị này được đặt thành 1 năm ).
-
Cửa sổ 1:
COMMIT;
-
Cửa sổ 2:Nhận thấy nó ngừng chờ và ngay lập tức bỏ bảng xuống.
vậy, bạn có thể làm gì? Đảm bảo rằng không có giao dịch dài hạn nào chặn BẢNG ALTER của bạn. Ngay cả một giao dịch đã chạy CHỌN nhanh so với bảng của bạn trước đó sẽ giữ khóa siêu dữ liệu của nó cho đến khi giao dịch được cam kết.