锁定MyISAM表进行维护

时间:2013-05-17 11:50:55

标签: mysql

我有一个MyISAM表,必须偶尔清理一次(12M行中总共约有5M行被删除)。 之后,我必须优化表,我知道如果我首先删除索引,OPTIMIZE TABLE会更快。 问题是,

ALTER TABLE t1 DISABLE KEYS;
--> here
OPTIMIZE TABLE t1;
--> or here
ALTER TABLE t1 ENABLE KEYS;

MySQL可能会决定提供其他一些查询,这会导致多次缓慢的非索引表扫描,从而延迟了进一步的步骤。

那么如何锁定其他线程的表?

2 个答案:

答案 0 :(得分:1)

  

那么如何锁定其他线程的表呢?

您可以使用LOCK TABLES

LOCK TABLES t1 WRITE;

但是,如上所述:

  

如果您在锁定的表格上使用ALTER TABLE,它可能会解锁。例如,如果您尝试进行第二次ALTER TABLE操作,则结果可能是错误Table 'tbl_name' was not locked with LOCK TABLES。要处理此问题,请在第二次更改之前再次锁定表格。另请参阅Section C.5.7.1, “Problems with ALTER TABLE

答案 1 :(得分:0)

MyISAM缺乏事务支持,因此无法可靠地执行(有很多DDL级别的操作会以静默方式解锁)。这就是为什么你应该在晚上安排这样的维护,这样你就不会在繁忙的时间里承受额外的负担。

你有一个XY problem - 你问的是你自己设计的问题的解决方案,而不是要求正确解决问题。

解决潜在问题的替代方案是:

  • 更频繁地进行清理 - 在较小的批次中,负载不应该非常明显
  • 仅在晚上执行OPTIMIZE步骤,并在白天经常进行清理。
  • 由于您认为显然可以接受的停机时间(因为您建议自行锁定),您甚至可以考虑在此期间临时重命名表 - 这是一种史前的方式,可以确保没有其他人接触到桌子,但它会起作用。

如果您更详细地描述实际问题,我们可能会提供更好的解决方案。