【问题标题】:Optimizing table results in "Waiting for table metadata lock"优化表导致“等待表元数据锁定”
【发布时间】:2017-04-11 13:35:53
【问题描述】:

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

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    如果您有其他内容可以删除以释放磁盘空间,那么可能会释放锁定。

    终止进程,确保磁盘周围没有 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. 重命名和删除(如上)

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2021-04-12
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多