Câu trả lời:
Nếu một bảng InnoDB đang được truy cập hoàn toàn thông qua CHỌN hoặc DML (CHERTN, CẬP NHẬT, XÓA), bạn sẽ mong đợi một khóa siêu dữ liệu.
Theo Tài liệu MySQL về Khóa MetaData :
Để đảm bảo tính tuần tự hóa giao dịch, máy chủ không được cho phép một phiên thực hiện câu lệnh ngôn ngữ định nghĩa dữ liệu (DDL) trên bảng được sử dụng trong giao dịch chưa hoàn thành trong phiên khác. Máy chủ đạt được điều này bằng cách có được các khóa siêu dữ liệu trên các bảng được sử dụng trong một giao dịch và hoãn phát hành các khóa đó cho đến khi giao dịch kết thúc. Khóa siêu dữ liệu trên bảng sẽ ngăn các thay đổi về cấu trúc của bảng. Cách tiếp cận khóa này có hàm ý rằng một bảng đang được sử dụng bởi một giao dịch trong một phiên không thể được sử dụng trong các báo cáo DDL bởi các phiên khác cho đến khi giao dịch kết thúc.
Điều đó đang được nói, bạn nên xác định liệu một phiên DB khác có giữ các khóa trên bàn hay không. Nếu một phiên như vậy là một giao dịch chưa hoàn thành, đó là nơi có thể giữ lại.
Nếu bạn chỉ cần nhanh chóng quay lại không gian đĩa, bạn có thể chạy TRUNCATE TABLE
.
Hãy thử đổi tên bảng trước khi thử thả nó như sau:
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
foo
. Một khi tất cả các kết nối đã được thực hiện, sau đó ALTER TABLE
có thể tiến hành.
Bạn nên tìm truy vấn nào gây ra khóa giao dịch bằng cách thực hiện:
SHOW ENGINE INNODB STATUS
và xem một phần có tên TRANSACTION
. Sau đó, bạn nên giết truy vấn đó để bỏ cơ sở dữ liệu.
foo
đổi tên ALTER TABLEfootodrop