我有一个小型的生产网站,但是它是全天候运行的。当运行优化、分析或修复命令时,MySQL锁定它正在处理的表。
谢谢!
/usman
发布于 2014-03-27 17:59:58
由于优化表、分析表和修复表都是DDL,所以需要完整的表锁。
但是,如果所有数据都是InnoDB,那么MySQL的最新版本对DDL锁的处理就会稍微宽松一些。注意当前关于MySQL优化表的InnoDB文档:
在MySQL5.6.17之前,优化表不使用联机DDL (ALGORITHM=INPLACE)。因此,在运行优化表时,不允许并发DML (INSERT、UPDATE、DELETE),即表被锁定。此外,辅助索引的创建效率不高,因为键是按照主键中显示的顺序插入的。从5.6.17开始,优化表对常规和分区的ALGORITHM=INPLACE表都使用了联机DDL (ALGORITHM=INPLACE)。表重建,由优化表触发,并在ALTER的掩护下执行.FORCE,现在使用联机DDL (ALGORITHM=INPLACE)执行,并且只锁定表一段时间,从而减少并发DML操作的停机时间。
用分析表
分析表,分析并存储表的密钥分布。在分析过程中,使用InnoDB和MyISAM的读锁锁定表。此语句适用于InnoDB、NDB和MyISAM表。对于MyISAM表,此语句相当于使用myisamchk -analyze。
修理表不道歉。文档没有显示读取的内容,所以在修复完成之前,SELECT将被完全阻塞。
所有写入的查询(插入、更新、删除)都将排队,直到释放这些完整的表锁。无论存储引擎是InnoDB还是MyISAM,这都是正确的。
读锁根据命令减轻选择
https://dba.stackexchange.com/questions/61913
复制相似问题