Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


10.11.5 外部锁定

外部锁定是使用文件系统锁定来管理多个进程对MyISAM数据库表的竞争。外部锁定在无法假设单个进程(如MySQL服务器)是唯一需要访问表的进程时使用。以下是一些示例:

  • 如果您运行多个服务器,使用相同的数据库目录(不推荐),每个服务器都必须启用外部锁定。

  • 如果使用myisamchkMyISAM表执行维护操作,您必须确保服务器不在运行,或者服务器启用外部锁定,以便与myisamchk协调访问表。同样,对于使用myisampackMyISAM表进行打包操作也需要相同的处理。

    如果服务器启用外部锁定,可以在任何时候使用myisamchk进行读操作,例如检查表。在这种情况下,如果服务器尝试更新myisamchk正在使用的表,服务器将等待myisamchk完成后再继续。

    如果您使用myisamchk 进行写操作,例如修复或优化表,或者使用myisampack 打包表,您必须 确保mysqld 服务器不在使用该表。如果您没有停止mysqld,至少在运行myisamchk 之前执行mysqladmin flush-tables。否则,您的表可能会损坏,因为服务器和myisamchk 同时访问表。

在外部锁定生效的情况下,每个需要访问表的进程都要在访问表之前获取文件系统锁定该表文件。如果不能获取所有必要的锁定,进程将被阻塞,直到当前持有锁定的进程释放它们(等待当前持有锁定的进程释放它们后)。

外部锁定影响服务器性能,因为服务器必须在访问表时等待其他进程。

如果您只运行一个服务器访问给定的数据目录(这是通常情况),并且其他程序,如myisamchk不需要在服务器运行时修改表,那么外部锁定是多余的。如果您只使用其他程序读取表,而myisamchk在读取表时,服务器改变了表,那么myisamchk可能会报告警告。

如果外部锁定被禁用,那么要使用myisamchk,您必须在myisamchk执行时停止服务器,或者锁定和刷新表,然后再运行myisamchk。为了避免这个要求,使用CHECK TABLEREPAIR TABLE语句来检查和修复MyISAM表。

对于mysqldskip_external_locking控制。当这个变量启用时,外部锁定被禁用,反之亦然。外部锁定默认禁用。

可以在服务器启动时使用--external-locking--skip-external-locking选项来控制外部锁定的使用。

如果您使用外部锁定选项来启用多个MySQL进程对MyISAM表的更新,不要在服务器启动时将delay_key_write系统变量设置为ALL,或者对任何共享表使用DELAY_KEY_WRITE=1表选项。否则,索引损坏可能会发生。

满足这个条件的最简单方法是总是同时使用--external-locking--delay-key-write=OFF