### 8.11.5 外部锁定

[](<>)[](<>)

外部锁定是使用文件系统锁定来管理争用[`MyISAM`](myisam-storage-engine.html)多个进程的数据库表。外部锁定用于不能假定单个进程（如 MySQL 服务器）是需要访问表的唯一进程的情况。这里有些例子：

-   如果您运行使用相同数据库目录的多台服务器（不推荐），则每台服务器都必须启用外部锁定。

-   如果你使用[**迈萨姆奇克**](myisamchk.html)执行表维护操作[`MyISAM`](myisam-storage-engine.html)表，您必须确保服务器没有运行，或者服务器启用了外部锁定，以便它在必要时锁定表文件以协调[**迈萨姆奇克**](myisamchk.html)访问表格。使用也是如此[**myisampack**](myisampack.html)打包[`MyISAM`](myisam-storage-engine.html)表。

    如果服务器在启用外部锁定的情况下运行，您可以使用[**迈萨姆奇克**](myisamchk.html)随时进行读取操作，例如检查表。在这种情况下，如果服务器尝试更新一个表[**迈萨姆奇克**](myisamchk.html)正在使用，服务器等待[**迈萨姆奇克**](myisamchk.html)在它继续之前完成。

    如果你使用[**迈萨姆奇克**](myisamchk.html)用于修复或优化表等写入操作，或者如果您使用[**myisampack**](myisampack.html)收拾桌子，你*必须*始终确保[**mysqld**](mysqld.html)服务器未使用该表。如果你不停[**mysqld**](mysqld.html)，至少做一个[**mysqladmin 刷新表**](mysqladmin.html)在你跑步之前[**迈萨姆奇克**](myisamchk.html).你的桌子*可能会损坏*如果服务器和[**迈萨姆奇克**](myisamchk.html)同时访问表。

    在外部锁定生效的情况下，每个需要访问表的进程都会在继续访问表之前为表文件获取文件系统锁。如果无法获得所有必要的锁，则阻止进程访问表，直到可以获得锁（在当前持有锁的进程释放它们之后）。

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

    如果您运行单个服务器来访问给定的数据目录（这是通常的情况）并且如果没有其他程序，例如[**迈萨姆奇克**](myisamchk.html)需要在服务器运行时修改表。如果你只*读*与其他程序的表，不需要外部锁定，虽然[**迈萨姆奇克**](myisamchk.html)如果服务器在更改表时可能会报告警告[**迈萨姆奇克**](myisamchk.html)正在阅读它们。

    禁用外部锁定，使用[**迈萨姆奇克**](myisamchk.html)，您必须在[**迈萨姆奇克**](myisamchk.html)在运行之前执行或锁定并刷新表[**迈萨姆奇克**](myisamchk.html).为避免此要求，请使用[`检查表`](check-table.html)和[`维修台`](repair-table.html)检查和维修的声明[`MyISAM`](myisam-storage-engine.html)表。

    为了[**mysqld**](mysqld.html)，外部锁定由值控制[`跳过外部锁定`](server-system-variables.html#sysvar_skip_external_locking)系统变量。启用此变量时，将禁用外部锁定，反之亦然。默认情况下禁用外部锁定。

    外部锁定的使用可以在服务器启动时通过使用[`--外部锁定`](server-options.html#option_mysqld_external-locking)要么[`--skip-external-locking`](server-options.html#option_mysqld_external-locking)选项。

    如果您确实使用外部锁定选项来启用更新[`MyISAM`](myisam-storage-engine.html)来自许多 MySQL 进程的表，不要使用[`delay_key_write`](server-system-variables.html#sysvar_delay_key_write)系统变量设置为`全部`或使用`DELAY_KEY_WRITE=1`任何共享表的表选项。否则，可能会发生索引损坏。

    满足此条件的最简单方法是始终使用[`--外部锁定`](server-options.html#option_mysqld_external-locking)和...一起[`--delay-key-write=OFF`](server-system-variables.html#sysvar_delay_key_write).（默认情况下不这样做，因为在许多设置中混合使用上述选项很有用。）
