我需要知道是否有必要或建议在 REPAIR TABLE 之前尝试 LOCK TABLE,因为有时我们需要在用户处理应用程序时对表进行 REPAIR。
正如我所测试的那样,这是可能的(如果表没有严重损坏,例如缺少 .MYI),但是,MySQL 的官方文档没有说明这种情况(至少在https://dev.mysql. com/doc/refman/5.7/en/repair-table.html文档)。
我需要知道是否有必要或建议在 REPAIR TABLE 之前尝试 LOCK TABLE,因为有时我们需要在用户处理应用程序时对表进行 REPAIR。
正如我所测试的那样,这是可能的(如果表没有严重损坏,例如缺少 .MYI),但是,MySQL 的官方文档没有说明这种情况(至少在https://dev.mysql. com/doc/refman/5.7/en/repair-table.html文档)。
演示:
屏幕一:
屏幕 2:
这里发生的事情是任何SQL 查询都在引用的表上获取共享元数据锁。因此,在第一个窗口中由 SELECT 创建的表上隐含了一个共享表锁。其他并发会话也可以获取共享元数据锁而不会相互阻塞。
与其他 DDL 语句一样,REPAIR TABLE 需要独占元数据锁。另一个会话持有的任何元数据锁都会阻止它。换句话说,DDL 语句将被阻塞,直到任何其他会话对表没有元数据锁定。
所以不,您不需要明确使用 LOCK TABLES 。REPAIR TABLE 会自动等待自己的表锁。
我同意 Rick James 的回答,即 MyISAM 表已过时。如果可以避免,我不会使用 MyISAM 表。
闻起来像你的桌子正在使用
ENGINE=MyISAM
. (这种气味通过“就像 .MYI 缺失”得到证实。) InnoDB 多年来一直是首选引擎。我强烈建议改变。在非正常关闭(例如崩溃)之后,MyISAM 几乎总是需要表为
REPAIRed
. 另一方面,InnoDB 会自动修复崩溃造成的损坏,而且修复速度要快得多。此外,由于“事务”,InnoDB 几乎不需要
LOCK TABLES
.底线:使用 InnoDB,您的问题变得毫无意义。