优化表结果"等待表元数据锁定"

时间:2017-04-10 18:06:57

标签: mysql indexing

运行OPTIMIZE TABLE导致"等待表元数据锁定"。检查SHOW PROCESSLIST确认优化是唯一的活动查询。 我有一个750GB的表,驱动器上还剩69GB。为了腾出空间,我决定清理那张桌子。我关闭了对该服务器的所有访问权限,并通过删除旧记录开始,这些记录最终将永远消失。已经确定该表可以被截断,但是需要首先提取一小部分数据。问题,即使是一个简单的SELECT * FROM my_table LIMIT 1也需要几个小时才能被手动杀死。这是一个索引问题吗?如果是这样的话,69GB足以用于索引过程。

1 个答案:

答案 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

  1. 创建一个类似旧表的新表,但可能没有PRIMARY KEY以外的任何索引。
  2. 复制所有行(除了已删除的行)。
  3. 构建索引(假设它们未在步骤2中逐步构建)。
  4. RENAME和DROP(如上所述)