外部锁定是使用文件系统锁定来管理MyISAM
多个进程对数据库表的争用。外部锁定用于不能假设单个进程(例如 MySQL 服务器)是唯一需要访问表的进程的情况。这里有些例子:
-
如果您运行多个使用相同数据库目录的服务器(不推荐),则每个服务器都必须启用外部锁定。
-
如果您使用myisamchk对表执行表维护操作
MyISAM
,则必须确保服务器未运行,或者服务器启用了外部锁定,以便它根据需要锁定表文件,以便与myisamchk协调以 访问表。使用myisampack打包MyISAM
表也是如此 。如果服务器在启用外部锁定的情况下运行,您可以随时使用myisamchk进行读取操作,例如检查表。在这种情况下,如果服务器尝试更新myisamchk正在使用的表 ,则服务器在继续之前等待 myisamchk完成。
如果您使用myisamchk进行修复或优化表等写操作,或者如果您使用 myisampack打包表,则 必须始终确保 mysqld服务器没有使用该表。如果你不停止mysqld,至少在你运行myisamchk之前 做一个 mysqladmin flush-tables。如果服务器和 myisamchk同时访问表,您的表可能会损坏。
在外部锁定生效的情况下,需要访问表的每个进程在继续访问表之前获取表文件的文件系统锁。如果无法获取所有必需的锁,则该进程将被阻止访问该表,直到可以获得锁(在当前持有锁的进程释放它们之后)。
外部锁定会影响服务器性能,因为服务器有时必须等待其他进程才能访问表。
如果您运行单个服务器来访问给定的数据目录(这是通常的情况),并且在服务器运行时没有其他程序(例如myisamchk)需要修改表,则不需要外部锁定。如果你只 阅读与其他节目表,不需要外部锁定,虽然myisamchk的 ,如果服务器更改表,同时可能会报告警告 myisamchk的是阅读。
在禁用外部锁定的情况下,要使用 myisamchk,您必须在myisamchk执行时停止服务器,或者在运行myisamchk之前锁定并刷新表。为避免此要求,请使用CHECK TABLE
andREPAIR TABLE
语句来检查和修复 MyISAM
表。
对于mysqld,外部锁定由skip_external_locking
系统变量的值控制 。启用此变量时,禁用外部锁定,反之亦然。默认情况下禁用外部锁定。
可以在服务器启动时使用--external-locking
或 --skip-external-locking
选项控制外部锁定的使用。
如果您确实使用外部锁定选项来启用对MyISAM
来自许多 MySQL 进程的表的更新 ,请不要在delay_key_write
系统变量设置为的情况下启动服务器,也不要 对任何共享表ALL
使用 DELAY_KEY_WRITE=1
table 选项。否则,可能会发生索引损坏。
满足此条件的最简单方法是始终 --external-locking
与 一起使用 --delay-key-write=OFF
。(默认情况下不会这样做,因为在许多设置中,混合使用上述选项很有用。)