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