运行OPTIMIZE TABLE导致"等待表元数据锁定"。检查SHOW PROCESSLIST确认优化是唯一的活动查询。 我有一个750GB的表,驱动器上还剩69GB。为了腾出空间,我决定清理那张桌子。我关闭了对该服务器的所有访问权限,并通过删除旧记录开始,这些记录最终将永远消失。已经确定该表可以被截断,但是需要首先提取一小部分数据。问题,即使是一个简单的SELECT * FROM my_table LIMIT 1也需要几个小时才能被手动杀死。这是一个索引问题吗?如果是这样的话,69GB足以用于索引过程。
答案 0 :(得分:0)
如果您还有其他内容可以删除以释放磁盘空间,那么可能会释放锁定。
终止进程,确保堵塞磁盘周围没有tmp表。
然后以不同的方式进行清理......
CREATE TABLE new LIKE real;
DROP any indexes you don't immediately need from `new`.
INSERT INTO new
SELECT ... FROM real
WHERE ...;
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
If you make it this far, ADD back the indexes you should have.
潜在问题:如果表是Engine = InnoDB 并且是使用innodb_file_per_table=OFF
创建的,那么这不足以释放任何磁盘空间。
如果您没有删除超过90%的表,并且您只有69GB的可用空间,则该过程最终会失败。
“对于索引进程” - 这句话“不计算”。
OPTIMIZE TABLE
:
PRIMARY KEY
以外的任何索引。